Skiena,算法设计手册,关于heapsort(第111页)

时间:2015-08-04 09:10:54

标签: algorithm math equation

我是自学“The Algorithm Design Manual”一书。我正在研究第4章(HeapSort)和第111页,有一个方程式,我无法绕过我的脑袋

就像

  

因此,空间效率要求我们不允许漏洞   树,即每个级别尽可能多地打包。如果是这样,只有   最后一级可能不完整。通过打包最后的元素   尽可能地向左移动,我们可以表示一个n键树   恰好使用数组中的n个元素。如果我们没有强制执行这些   结构约束,我们可能需要一个大小为2n的数组来存储   相同的元素。由于除了最后一级以外的所有级别总是被填充,所以   n元素堆的高度h是对数的,因为:   enter image description here所以h = lg n

我不明白的是如何根据上面的等式确定h = logn?我的数学生锈了,但据我所知,它应该像h = log((n + 1)/ 2)

我希望这里的人能够阅读这本书,并且能够帮助我理解这个

先谢谢

2 个答案:

答案 0 :(得分:2)

Skienna的书中所说的(虽然不够清楚)是h 渐近对数。即,

2 ^ {h + 1}> = n + 1相当于

h + 1> = log(n + 1),

所以你忽略常量并获得h = O(log n)。你的计算是正确的,它给出了相同的结果,但你应该观察渐近行为。

答案 1 :(得分:2)

你是如何获得h = log((n+1) / 2)的?假设基数为2的日志,我们有:

2^(h+1) - 1 >= n
2^(h+1) >= n+1 | apply log
log(2^(h+1)) >= log(n+1)
h+1 >= log(n+1)
(log n)+1 >= log(n+1)

=> h = O(log n) 

这本书应该说h = O(log n)要准确一点,但这也没关系。

阅读big-oh notation,了解为什么常数不重要。事实上,对数的基数也不重要。