我是自学“The Algorithm Design Manual”一书。我正在研究第4章(HeapSort)和第111页,有一个方程式,我无法绕过我的脑袋
就像
因此,空间效率要求我们不允许漏洞 树,即每个级别尽可能多地打包。如果是这样,只有 最后一级可能不完整。通过打包最后的元素 尽可能地向左移动,我们可以表示一个n键树 恰好使用数组中的n个元素。如果我们没有强制执行这些 结构约束,我们可能需要一个大小为2n的数组来存储 相同的元素。由于除了最后一级以外的所有级别总是被填充,所以 n元素堆的高度h是对数的,因为: 所以h = lg n
我不明白的是如何根据上面的等式确定h = logn?我的数学生锈了,但据我所知,它应该像h = log((n + 1)/ 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,了解为什么常数不重要。事实上,对数的基数也不重要。