【问题标题】:How to find the time complexity of recursive selection sort?如何求递归选择排序的时间复杂度?
【发布时间】:2018-03-27 05:17:32
【问题描述】:

嘿,伙计们,我明天有一个测验,我在寻找选择排序的递归程序的时间复杂度时遇到了一些问题,任何人都可以解释它是如何 n^2 的。还有一个问题,一些排序算法循环的时间复杂度为 n/2,对于新手问题,/2 是什么意思?

#include <iostream>
using namespace std;

// recursive function to perform selection sort on subarray arr[i..n-1]
void selectionSort(int arr[], int i, int n)
{
    // find the minimum element in the unsorted subarray[i..n-1]
    // and swap it with arr[i]
    int min = i;
    for (int j = i + 1; j < n; j++)
    {
        // if arr[j] element is less, then it is the new minimum
        if (arr[j] < arr[min])
            min = j;    // update index of min element
    }

    // swap the minimum element in subarray[i..n-1] with arr[i]
    swap(arr[min], arr[i]);

    if (i + 1 < n)
        selectionSort(arr, i + 1, n);
}

【问题讨论】:

  • selectionSort(arr, 0, n) 将在其循环中进行 n 比较。然后它会调用selectionSort(arr, 1, n) 来进行额外的n-1 比较,并调用selectionSort(arr, 2, n) 来进行更多n-2 比较,依此类推。我们将计算这个算术级数的总和留给读者作为练习。
  • n/2 的复杂性毫无意义,因为大 O 符号与常数乘数无关。 O(n/2) == O(n)
  • 在选择排序的迭代算法中有一个值 n/2(n-1) 这是什么意思谢谢你@IgorTandetnik

标签: c++ algorithm recursion data-structures


【解决方案1】:

查找时间复杂度的描述通常不是很有帮助。以下是选择排序的工作原理。

传球
第一次通过算法,您必须扫描数据的所有 n 个元素。

下一次通过(递归),您必须扫描除一个以外的所有内容,即 (n-1)。

等等。我们可以将查看/比较元素的次数写为:

n + (n-1) + (n-2) + ... + 2 + 1

(你可以对上一个术语提出质疑,但为了简单起见,我们不在乎。你会在一秒钟内明白为什么。)

数学恒等式
这个特定的系列(注意所有添加)被称为“算术级数”。每一项之间的差是 1。第一项是 n,最后一项是 1(​​或 2,等等)。

使用大多数人在高中时不记得(或没有教过)的一些数学,我们可以将这个总和重写为:

n(n+1)
──────
  2

(是的,再一次,最后一个学期实际上应该是一个二,即使我把它留在了一个。)

随着 n 任意增大
Big O 不太关心 n 的友好值。它关心当 n 变得任意大时会发生什么。我们说“n 向无穷大发展”。

事实上,我们可以注意到发生了两件事:

  • 除以 2 变得微不足道:∞/2 → ∞
  • 加 1(或其他)也无关紧要:∞(∞+1) → ∞(∞)

所以最终,我们有 infinity,呃,n 乘以自身。等式简化为:

n(n+1)
──────  →  n²
  2

复杂性界限
最坏情况下的行为是 n²,因此我们将其注释为“O(n²)”。但请注意,最佳情况也是 n²。我们将其注释为“Ω(n²)”。最后,由于最好和最坏情况的行为是相同的,我们对函数的行为有一个非常好的严格限制。我们将其注释为“Θ(n²)”。

因此,选择排序的复杂度为 Θ(n²)。

神圣的测验!我应该自己做这个!!?
是的,不幸的是,弄清楚复杂性是人们认为它真的很容易的事情之一——即使他们自己并不理解它。它需要一些数学知识和一些练习。典型的反应如上面提供的链接中所示:“查看这些常见案例并选择最匹配的案例”。我个人觉得这不太令人满意。这也是大学教授希望你立即掌握的东西之一。

我的建议:不要太担心。尽力了解基本原理。我们正在做的是找到一个函数(如 y=x²),它代表算法在其输入非常大(n → ∞)时的行为。

能够遵循算法所采用的路径并识别这些路径何时成本高昂是一种比能够提出数学家的答案更重要的能力。如果你真的需要它,你总是可以在大学或互联网上找到一位数学家来提供帮助,如果你在正确的地方询问的话。

当然,您也可以花时间尝试更好地理解和练习。能把事情做好是一项宝贵的技能,不管别人是否看到。

:O)

【讨论】:

  • 你太棒了,先生,太棒了,非常感谢@Dúthomhas
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-22
  • 2017-09-04
  • 1970-01-01
相关资源
最近更新 更多