heapsort的大O运行时如何与比较的数量相关?

时间:2013-06-16 15:01:54

标签: algorithm sorting big-o heapsort

我已经阅读了很多关于big-O符号的内容,并且我有一个基本的了解。这是一个具体的问题,我希望能帮助我更好地理解它。

如果我有100个整数的数组(没有重复,并且随机生成)并且我使用heapsort对它进行排序,我知道heapsort的big-O表示法是n lg n。对于n = 100,这可以达到100×6.64,大约是664。

虽然我知道这是比较次数的上限,但我的计数可能小于664,如果我想弄清楚100个随机数的堆排序数组的比较次数,它应该总是小于或等于664?

我正在尝试向我的heapsort添加计数器以获得big-O比较时间并提出疯狂的数字。我将继续解决这个问题,但是想要确认我正在考虑上限。

谢谢!

2 个答案:

答案 0 :(得分:4)

Big-O表示法并没有为函数的运行时提供精确的上限 - 相反,它会告诉您渐近函数运行时的增长方式。如果函数具有运行时O(n log n),则意味着函数以与函数f(n)= n log n大致相同的速率增长。这意味着,例如,实际运行时可以是23 n log n + 17 n,或者它可以是0.05 n log n。因此,您不能使用heapsort为O(n log n)的事实来计算所进行的比较次数。您需要更精确的分析。

恰好您可以对heapsort进行非常精确的分析,但它需要您对算法进行更细致的分析。例如,您可以显示the number of comparisons required to call make-heap is at most 3n,并且在重复调用extract-min期间进行的比较次数最多为2n log(n + 1)(二进制堆具有log(n + 1))在每个层中,在每个层中,在每个层中,最多进行两次比较)。这给出了上限为2n log(n + 1)+ 3n的比较总数。

着名的Ω(n log n)排序障碍可用于获得匹配的下限。任何基于比较的排序算法,其中heapsort是一个,必须至少log n! = n log n - n + O(log n)(这是Stirling's approximation)平均比较,因此在最坏情况下需要进行至少n log n - n比较。 (注意,这实际上是n log n,而不是n log n的一些常数倍。您可以读取Ω(n log n)障碍的证据,了解其原因。)

希望这有帮助!

答案 1 :(得分:3)

假设您知道在排序O( n log_2 n )元素时,您的算法需要进行n次比较。

这告诉您以下内容,以下内容:存在一个常数C,当n接近无穷大时,算法永远不需要{ {1}}比较。

它没有告诉你任何关于C * n * log_2 n的任何值可能需要的特定比较次数 - 它告诉你所需的比较次数随着元素数量的增长,增长

您不能使用排序算法的Big-O复杂性来证明特定有限n的行为,例如100个元素。排序100个元素可能需要64次比较,或664或6.64亿。后者显然不合理,但Big-O在这里根本没有提供任何信息。