构建堆的时间复杂度

请考虑以下用于构建输入数组A的堆的算法。

BUILD-HEAP(A) 
    heapsize := size(A); 
    for i := floor(heapsize/2) downto 1 
        do HEAPIFY(A, i); 
    end for 
END

快速查看上述算法表明,运行时间是O(NLG(n))的,因为每次调用Heapify成本O(LG(n))的Build-Heap进行上)这样的调用。
这个上限虽然正确,但并不是渐近的。

我们可以通过观察推导出一个更严格的约束:Heapify的运行时间取决于树的高度h'(等于lg(n),其中n是节点数),并且大多数子树的高度是小的。
随着我们沿着树向上移动,身高'h'增加。构建堆的第3行从最后一个内部节点(heapsize / 2)的索引运行一个循环,高度= 1,到具有height = lg(n)的root(1)的索引。因此,Heapify为每个节点花费不同的时间哦)

为了找到构建堆的时间复杂度,我们必须知道具有高度h的节点数。
为此,我们使用的事实是,大小为n的堆最多有\ left \ lceil \ frac {n} {2 ^ {h + 1}} \ right \ rceil个具有高度为h的节点。

我们得出的时间复杂度,我们表达构建堆的总时间复杂度:

(1) \ begin {flalign *} T(n)&= \ sum_ {h = 0} ^ {lg(n)} \ left \ lceil \ frac {n} {2 ^ {h + 1}} \ right \ rceil * O (h)\\&= O(n * \ sum_ {h = 0} ^ {lg(n)} \ frac {h} {2 ^ {h}})\\&= O(n * \ sum_ {h = 0} ^ {\ infty} \ frac {h} {2 ^ {h}})\\ \ end {flalign *}

步骤2使用Big-O符号的属性来忽略上限函数和常数2(2 ^ {h + 1} = 2.2 ^ h)。同样在第三步中,由于我们使用Big-O符号,所以求和的上限可以增加到无穷大。

Sum of infinite G.P.(x <1)

(2) \ begin {align *} \ sum_ {n = 0} ^ {\ infty} {x} ^ {n} = \ frac {1} {1-x} \ end {align *}

在区分双方并乘以x时,我们得到

(3) \ begin {align *} \ sum_ {n = 0} ^ {\ infty} n {x} ^ {n} = \ frac {x} {(1-x)^ {2}} \ end {align *}

将(3)中得到的结果返回到我们的推导(1)中,我们得到

(4) \ begin {flalign *}&= O(n * \ frac {\ frac {1} {2}} {(1  -  \ frac {1} {2})^ 2})\\&= O(n * 2 )\\&= O(n)\\ \ end {flalign *}

因此证明建立二叉堆的时间复杂度是上)

转载于:https://www.cnblogs.com/wongyi/p/7685061.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值