【建堆算法:向上调整算法和向下调整算法的时间复杂度计算】

         因为堆是完全二叉树,而满二叉树也是完全二叉树,且满二叉树算是最坏情况,此处为了简化使用满二叉树来证明(时间复杂度本来看的就是近似值,多几个节点不影响最终结果):  

向下调整算法:

这里需要用到满二叉树的一些性质:

1.假设树的高度为h,根节点视为第一层,则第h层节点的个数为2^{h-1}

2.此二叉树总结点个数N=2^{h}-1,则h=log_{2}(N+1)

        为了保证每次调整后,已经调整过的部分不被打乱,我们需要从倒数第二层开始调整,最坏的情况就是每个节点都向下调整了h_{1}-1次(h_{1}表示以该节点为根节点的子树的高度),设向下调整的总次数为关于h的函数F(h),则F(h)表示如下:

F(h)=2^{h-2}*1+2^{h-3}*2+2^{h-4}*3+......+2^{1}+(h-2)+2^{0}*(h-1)

利用错位相减法,求F(h)很容易:

 

则:F(h)=2^{h}-1-h ,利用上面的性质2,可得T(N)=N+1-1-log_{2}(N+1)

T(N)=N-log_{2}(N+1)

 因为要计算时间复杂度,所以我们要逐步去掉影响不大的部分:

T(N)=N-logN

又当N足够大时,logN与N相比,可以忽略不计

故向下调整算法时间复杂度:O(N)

向上调整算法:

        为了保证每次调整后,已经调整过的部分不被打乱,我们需要从第二层开始调整,最坏的情况就是每个节点都向上调整了 h_{2}-1次(h_{2}表示以该节点所在的层数),设向上调整的总次数为关于h的函数F(h),则F(h)表示如下:

F(h)=2^{1}*1+2^{2}*2+2^{3}*3+......+2^{h-2}*(h-2)+2^{h-1}*(h-1)

 

 则:F(h)=2-2^{h}+2^{h}(h-1)=2+2^{h}*(h-2)

T(N)=2+(N+1)*log_{2}(N+1)

 因为要计算时间复杂度,所以我们要逐步去掉影响不大的部分:

故向上调整算法时间复杂度:O(N*logN)

结论:

向下调整算法时间复杂度:O(N)

向上调整算法时间复杂度:O(N*logN)

        其实在写出调整次数的式子时我们就已经可以得出结论了,对于向下调整算法,层数越高的结点,需调整的次数越少,而层数越高结点越多,也就是大多数结点只需要调整少次,而向上调整算法恰恰相反,大多数结点需要调整多数次,而基于满二叉树结构的特点,我们发现最后一层节点数占总结点数的几乎一半,对于最后一层的调整次数对整体影响很大,因此我们需要让最后一层调整少次,对应以上过程,我们选择向下调整算法更优。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值