当然你得知道堆的物理结构是数组,小堆是下面的数大。
然后去计算悲观预期,即最坏的情况
1.建小堆:
①向下调(从下往上对每棵小树)
从倒数第二层开始对每个小树进行调整。
结果:
F(h)=2^(h-2)*1 + 2^(h-3)*2 + ... + 2^1*(h-2) + 2^0*(h-1)
分析:
倒数第二层为2^(h-2)*1,2^(h-2)即为倒数第二层的节点个数,假设每个数都比儿子节点大,都要向下调整,调整需要调整1次(这里当然替换大的儿子节点)。那么这么多个节点就要调整这么多次。
后面同理。
然后是化简结果,需要使用错位相减法。
F(h)= 2^(h-2)*1 + 2^(h-3)*2 + ... + 2^2*(h-3)+2^1*(h-2) + 2^0*(h-1)
2*F(h)=2^(h-1)*1 + 2^(h-2)*2 + 2^(h-3)*3 +... + 2^2*(h-2) + 2^1*(h-1)
∴F(h)=2^(h-1) + 2^(h-2) + 2^(h-3) + ... + 2^2 + 2^1 - (h-1)
即F(h)=2^(h-1) + 2^(h-2) + 2^(h-3) + ... + 2^2 + 2^1 + 2^0 - h
所以F(h)=2^h-1 - h
(我们是用h计算,最后还是要回到节点个数)
关系:
h是树的高度
N是节点个数
有2^h-1 = N
∴F(N) = N - log₂(N+1)
因为后者影响小
所以时间复杂度为O(N)
②向上调
F(h) = 2^1*1 + 2^2*2 + ... + 2^(h-2)*(h-2) + 2^(h-1)*(h-1)
...
时间复杂度为 O(N*log₂N)
————
————
我们发现向下调是对节点数多的调少量次,对上面节点数少的调多量次
而向上调是对节点数少的调少量次,对节点数多的调多量次
所以向下调时间复杂度更小