通过比较排序的下限

时间:2011-08-29 17:27:23

标签: algorithm sorting big-o

今天我正在阅读Julienne Walker关于排序的一篇很棒的文章 - Eternally Confuzzled - The Art of Sorting,有一件事引起了我的注意。我不太了解作者证明通过比较排序我们受限于Ω( N ·log N )下限的部分

  

下限并不那么明显。大多数排序算法的最低可能范围是Ω( N ·log N )。这是因为大多数排序算法使用项目比较来确定项目的相对顺序。通过比较排序的任何算法都将具有Ω的最小下界( N ·log N ),因为比较树用于选择已排序的排列。可以很容易地构建三个数字1,2和3的比较树:

                         1 < 2

           1 < 3                       1 < 3

   2 < 3           3,1,2       2,1,3           2 < 3

1,2,3   1,3,2                            2,3,1     3,2,1
     

注意每个项目如何与其他项目进行比较,并且每个路径都会导致三个项目的有效排列。树的高度决定了排序算法的下限。因为必须存在与算法正确的排列一样多的叶子,所以比较树的最小可能高度是log N !,等于Ω( N ·log N

在我不太明白的最后一部分(粗体)之前似乎是非常合理的 - 如何记录 N !相当于Ω( N ·log N )。我必须从我的CopmSci课程中遗漏一些东西,无法完成最后的过渡。如果我们通过比较使用排序,我期待着对此有所帮助,或者期待我们有限的其他证据Ω( N ·log N )。

3 个答案:

答案 0 :(得分:9)

你没有错过CompSci课程的任何内容。你错过的是数学课。 Stirling的近似的维基百科页面显示了log n!渐近n log n +低阶项。

答案 1 :(得分:3)

  • N! &LT; N 1,N
  • ∴记录N! &LT; log(N ^ N)
  • ∴记录N! &lt; N * log N

有了这个,你可以证明θ(log N!)= O(N log N)。证明相同的Ω留作读者的练习,或mathematics stackexchangetheoretical computer science stackexchange的问题。

答案 2 :(得分:2)

我最喜欢的证明是非常基本的。

N! = 1 * 2 * .. * N - 1 * N

我们可以通过假装那些产品的前半部分不存在而非常容易下限,然后下半部分都只是N / 2.

(N / 2)^(N / 2)&lt; = N!

log((N / 2)^(N / 2)= N / 2 * log(N / 2)= N / 2 *(log(N)-1)= O(n log n)

所以,即使你只使用表达式的后半部分,并假装所有这些因子都不大于N / 2,你仍然处于O(n log n)区域的下限,这是超级的初级。我可以说服一个普通的高中生。我自己甚至无法得出斯特林的公式。