【问题标题】:Why heap sort have worst case when bottom level is half full and not when it is completely full?为什么当底层半满而不是完全满时堆排序有最坏的情况?
【发布时间】:2020-11-13 22:00:07
【问题描述】:

我知道有很多关于这个主题的问题得到了解答。但我不明白他们在说什么。
具体来说,我的问题是为什么最坏的情况发生在底层是exactly half full 而为什么不是full

我浏览过这个问题:
Worst case in Max-Heapify - How do you get 2n/3?
worst case in MAX-HEAPIFY: “the worst case occurs when the bottom level of the tree is exactly half full”

但我的问题是,当树中的节点处于最大值时,我们可能会遇到最坏的情况,为什么我们使用术语“半满”?
为了支持我的观点,我附上了一张图片。现在A 的高度是3,B 的高度也是3。但是我们调用heapify 的次数会增加,因为现在A 将为n/2 调用heapify,即11/2 ~ 5,在B 中我们调用在主循环内为15/2 ~ 7 堆化。这应该是最坏的情况吗?
我确信我的直觉有误,但不知道在哪里。

【问题讨论】:

    标签: algorithm data-structures heapsort


    【解决方案1】:

    这里的“最坏情况”是指较大子树相对于n最大的情况。

    在你的图 (A) 中,树有 11 个节点 (n = 11),其中 7 个属于较大的子树,因此较大的子树有 7n /11 ≈ 0.636n 个节点。

    在你的图(B)中,树有十五个节点(n = 11),其中七个属于每个子树,所以每个子树有7n i>/15 ≈ 0.467n 个节点。

    所以虽然图(A)中较大的子树和图(B)中的绝对节点数相同(即7个),但前者大于后者相对到n,因为后者有更大的n

    【讨论】:

    • largest relative to n 信息给我们带来了什么?是否可以肯定地说没有特别的最坏情况,因为树中元素的位置被严格规定为尽可能完整的树?时间受n的数量影响,而不是n的排列?
    • @YashPatel:在分析算法或数据结构时,我们会分析其最坏的情况,因为这给了我们一个保证:没有其他情况更糟。在这种堆结构的情况下,这种“最坏情况”分析告诉我们,子树的大小最多是树总大小的三分之二。
    • 好的,让我们假设左边的树有整棵树的三分之二大小。所以这是最坏的情况。现在,如果我们在根节点上调用 heapify 并且节点似乎通过右子树,那么它将执行比左子树少一个递归步骤。但是当节点通过左子树时,我们可以有更好的最坏情况。通常,我们对输入(如其排列、分布等)做出最坏的情况,而不是在 n 的值上。但是在这方面,我们通过使最后一个级别半满来关注 n。为什么?
    • @YashPatel:堆是一种数据结构,其 API 有“插入元素”、“检查是否为空”、“检索最大元素”和“删除最大元素”。该数据结构的实现——节点、数组等——并不包含在这些 API 定义中。有许多不同类型的数据结构可以以不同的方式支持这些 API,并具有不同的性能特征。因此,在任何给定时间数据结构中的元素数量是用例的基本特征,也是我们比较不同数据结构的唯一方法[续]
    • [续] 提供这些 API 的目的是量化给定数量元素的最坏情况性能。
    猜你喜欢
    • 2011-10-15
    • 2015-06-25
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 2014-08-01
    • 2013-11-10
    • 1970-01-01
    • 2021-08-30
    相关资源
    最近更新 更多