【问题标题】:Best case performance of quicksort (tilde notation)快速排序的最佳案例性能(波浪符号)
【发布时间】:2015-08-26 16:27:53
【问题描述】:

我的教授说快速排序的最佳情况是当拆分平衡时(即当主元始终是中间元素时)。

现在可以通过使用循环关系来确定最佳情况快速排序的复杂性,如下所示:

T(n) = 2*T(n/2) + partitioning(n)

在下一步中,他说:

因此= ~n * log2(n)

有人能详细说明你如何计算这个吗?我搜索了很多,但所有的解释都是用 big-Oh 符号表示的,或者并没有真正解释如何解决/计算重复性。

【问题讨论】:

  • 这不是tilde notation 的用法。您在寻找大 O 还是波浪号?
  • @amit Tilde。在本书中,波浪号被定义为 Big-O,但没有去掉常数因子。即:5x^4 + 3x^2 = ~5x^4,但 O(x^4)
  • 问题是,快速排序不是 ~nlogn 波浪符号...(好吧,如果您指定只计算某些特定操作,可能是这样,但我仍然怀疑)。它将是 ~C*nlogn,对于一些常数 C
  • 是的,快速排序平均约为 1,39log2(n)。但我想知道最好的情况。不太清楚你在这里指出什么。
  • 我指的是,(1)如果不先分析partitioning(n),您将无法继续计算。 (2) partitioning(n) 不太可能完全是 ~n (这是唯一可以准确地给你 ~nlog_2(n) 的)。 (3) 就个人而言,我觉得波浪符号很垃圾,因为它太依赖于平台而没有任何价值(例如,在支持向量运算的机器上,与不支持向量运算的机器相比,预计会有不同的性能),但这只是我的 POV,我不要试图强迫别人。

标签: algorithm sorting time-complexity quicksort


【解决方案1】:

我将在这个答案中解决Tilde Notation,假设partitioning(n) 本身就是~n,这意味着它会及时运行G(n) = n + C

在这种情况下,最佳情况的复杂度函数为:

带有T(1) = 1+C的基本子句

T(n) = 2T(n/2) + (n+C)

声明:对于所有n>0

T(n) = n(1+logn) + (2n-1)C

归纳证明。
基础子句:对于T(1),声明作为基础。

T(n) = 2T(n/2) + (n + C)
T(n) = 2(n/2 log(n/2) + n/2 + (n-1)C) +(n + C) //induction hypothesis
T(n) = nlog(n/2) + n + (2n-2)C + n  + C
T(n) = nlog(n/2) + nlog(2) + n + (2n-2)C + C
T(n) = nlog(n/2 * 2) + n +(2n-2+1)C
T(n) = n(logn+1) + (2n-1)C

由于T(n) = nlogn + (2C+1)n - C,我们可以断定它确实是~nlogn

【讨论】:

  • 正是我想要的。非常感谢!
【解决方案2】:

答案来自Master Theorem

快速排序的最佳情况运行时间的递推关系为:

T(n) = 2T(n/2) + Θ(n)

主定理将递归关系推广到形式:

T(n) = aT(n/b) + f(n)

比较两个方程:

a = 2

b = 2

f(n) = Θ(n)

由于f(n) = Θ(n),来自主定理的案例2:

If f(n) = θ(n<sup>log<sub>b</sub>a</sup>), then T(n) = θ(n<sup>log<sub>b</sub>a</sup>lg(n))

因此,最佳情况下快速排序的时间复杂度降低到

T(n) = Θ(n lg(n))

编辑: 如果您问为什么它是波浪符号 ~n * log2(n) 而不是 Big-O 符号,那是因为在您的情况下,目标必须是创建一个运行时间的近似模型(如果有的话,不要忽略常量) 而不是制定复杂性的上限。此外,波浪符号对于预测性能非常有用,而 Big-O 符号则不然。

【讨论】:

  • 我确实理解这个解释,所以我一直在寻找波浪符号以及它是如何派生的。
猜你喜欢
  • 2022-11-17
  • 2020-01-01
  • 2020-02-23
  • 2010-11-24
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 2012-12-04
相关资源
最近更新 更多