在heapify上更紧密的绑定

时间:2011-07-31 10:04:04

标签: algorithm heap

我想使用siftdown方法计算heapify上更严格的限制,所以我按如下方式进行:

在每个级别i,在最坏的情况下,该级别上的每个键都可以转到叶级h(其中h是树的高度)。
由于在i级有2个 i 节点,所以完成的工作总数为

Σ0≤i≤h(h - i)* 2 i

但我无法继续前进。我知道它必须来O(n),但我无法达到它。请帮我解决这个问题。

2 个答案:

答案 0 :(得分:2)

S =Σ0≤i≤h(h - i)* 2 i

S = h + 2(h - 1)+4(h - 2)+ ... + 2 h - 1 ......(1)

将两边乘以2,

2S = 2h + 4(h - 1)+ 8(h - 2)+ ... + 2 h ...(2)

从(2)中减去(1),

S = h -2h + 2 + 4 + 8 + .... + 2 h

= -h - 1 +(1 + 2 + 4 + 8 + ... + 2 h

=(2 h + 1 -1) - (h + 1)

[注:1 + 2 + 4 + 8 + ... + 2 h =(2 h + 1 - 1)

由于高度为h的完整二叉树在2h到2h + 1个节点之间,因此上述总和为O(n),其中n是堆中节点的数量。

答案 1 :(得分:1)

如果不是从i从顶部开始运行,那么从底部算起来会更容易一些。因此,如果我们说i是从底部开始的高度,我们会将您的总和转换为:

Σi* 2 h-i

= 2 h *Σi/ 2 i

= 2 h * O(1)

= O(2 logn )= O(n)

我用log交换了h,因为这是一个二进制堆。

我会证明为什么这笔钱是O(1):

和是i / 2 i 项的有限和,所以如果我们显示无穷和(i - >无穷大)的收敛,那么显然每个有限和(即所有n)总和小于该值(因为所有项都是正数)。意味着每个有限和由一个常数界定,即O(1)。

我们只剩下无限Σi/ 2 i 收敛的证明。我们可以使用无数的收敛性测试,让我们使用Σ1/ i 2 收敛的简单结果,并表明对于足够大的i,我们的总和将上限:

我们希望展示足够大的i:

i / 2 i < 1 / I 2

发生iff i 3 < 2 i ,例如,i> 10

QED