【问题标题】:Skiena, The Algorithm Design Manual, regarding heapsort (page 111)Skiena,算法设计手册,关于堆排序(第 111 页)
【发布时间】:2015-08-04 18:13:16
【问题描述】:

我正在自学“算法设计手册”一书。我目前正在学习第 4 章(HeapSort),在第 111 页有一个我无法理解的方程式

它是这样的

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

我不明白的是如何从上述等式确定 h =logn ?我的数学很生疏,但据我所知应该是 h =log((n+1)/2)

我希望这里有读过这本书的人能够帮助我理解这一点

在此致谢

【问题讨论】:

    标签: algorithm math equation


    【解决方案1】:

    你是怎么得到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 了解为什么常量不重要。事实上,对数的底也无所谓。

    【讨论】:

    • 谢谢,是的,如果书中说 h = O(log n) 那么我就不会感到困惑了。至于我如何得到 h = log((n+1) / 2) 是 2^{h+1} >= n+1 等于 2^h x 2^1 = n + 1 等于 2^ h = (n+1)/2 和那里 h = log ((n+1)/2) 。这是不正确的吗?如果可以,请指出我哪里做错了(我希望我没有犯粗心的错误)
    • @user119020 啊,我明白了。不,它是正确的,并且与我所做的相同,起初对我来说看起来很奇怪。但是,是的,使用 big-oh 确实会让事情变得更清晰。
    • 很确定日志的基数确实很重要... O(b^n) 的基数很重要,因为 3^n 绝不会以 2^n 为界。我不明白为什么它会与日志不同。
    • @GettnDer 因为log_a(x) = log_b(x) / log_b(a)log_b(a) 是一个常数。因为两个不同底数的对数相差一个常数,所以对数底数在 big-oh 表示法中并不重要。
    • @IVlad Ahhh 你是对的。他们的增长率是一样的。
    【解决方案2】:

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

    2^{h+1} >= n+1 等价于

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

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

    【讨论】:

    • 我不知道你可以在对数方程中忽略这样的常量。我的思维方式是 2^{h+1} >= n+1 等于 2^h x 2^ 1 = n + 1 等于 2^h = (n+1)/2 和 h = log ((n+1)/2) 并且我也不知道 log(2^x)=x .派上用场
    • @user119020 在处理渐近复杂性时,您可以忽略常量,这应该在 Skienna 的书中更清楚地说明。还有 log((n+1)/2)=log(n+1) - log2 = log(n+1) - 1,所以通过忽略常量,你会得到同样的结果。
    猜你喜欢
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 2011-07-02
    • 2016-08-31
    相关资源
    最近更新 更多