堆实现。最糟糕的案例提取复杂性

时间:2014-03-26 21:13:28

标签: data-structures heap complexity-theory

您好我正在使用python学习算法。我正在阅读本书中的一些示例问题,其中要求说明为什么在作为数组实现的堆上的提取操作的最坏情况时间为O(log n)?我不知道从哪里开始,我正在接近考试。有人可以帮我证明一下吗? 感谢

2 个答案:

答案 0 :(得分:6)

假设我们有一个最大堆。我将说明n = 7,但逻辑与更大尺寸的堆相同。

enter image description here 当根节点被更改为包含所有节点的最小值时,我们会发生最糟糕的提取情况(我们在O(1)中提取根并将数组中的最后一个元素作为根)。

enter image description here 现在,当我们在根上调用Max-Heapify时,该值必须与其子级在每个级别进行交换,直到达到最低级别。

enter image description here

enter image description here

这是因为,在每次交换之后,该值仍将小于其子项(因为它是最小值),直到它达到不再有子项的最低级别。

在这样的堆中,最大化根目录的交换次数将等于 树的高度, log(n)。因此最坏情况下的运行时间是 O(log n)

答案 1 :(得分:0)

假设最小优先级队列:

忽略实际提取O(1),请记住,当您从堆中提取最小值时,将最后一个元素与第一个元素交换,然后通过将此元素与其子元素进行比较来恢复堆属性并进行交换因此。使用堆属性,任何节点p的子节点都在索引2p2p + 1。因此,在最坏的情况下,要找到任何节点的子节点,就必须检查节点:

{2p,2 * 2p,2 * 2 * 2p,...,N - 1}

{2p,4p,8p,...,lg 2 N(p)}

{(2 1 )p,(2 2 )p,(2 3 )p,...,(2 < sup> lg 2 N )p}

正如您所看到的,在最坏的情况下要检查的最大元素数是lg 2 (N)

这是展示这个属性的一种非常粗略的方式,我道歉