算法导论 — 6.2 维护堆的性质

笔记

本节主要考虑如何保持堆(最大堆)的性质。给定最大堆 A A A中的一个元素 i i i,它有可能不符合最大堆的性质,即 A [ i ] A[i] A[i]有可能小于它的孩子,但是它的两棵子树已经满足了最大堆的性质。我们通过一个MAX-HEAPIFY过程来使得以 A [ i ] A[i] A[i]为根的子树满足最大堆性质,MAX-HEAPIFY是通过让 A [ i ] A[i] A[i]在最大堆中“逐层下降”来达成这一目标的。
  在这里插入图片描述
  简单描述一下MAX-HEAPIFY的执行过程。先从 A [ i ] 、 A [ L E F T ( i ) ] 、 A [ R I G H T ( i ) ] A[i]、A[{\rm LEFT}(i)]、A[{\rm RIGHT}(i)] A[i]A[LEFT(i)]A[RIGHT(i)]中找出最大值,并将最大值的下标保存在 l a r g e s t largest largest中。如果 A [ i ] A[i] A[i]是最大的,那么以 i i i为根的子树已经满足最大堆性质,无需再做调整。如果 A [ i ] A[i] A[i]不是最大的,那么最大值必然是 A A A的某个孩子,交换 A [ i ] A[i] A[i] A [ l a r g e s t ] A[largest] A[largest],将 A [ l a r g e s t ] A[largest] A[largest]放置到子树的根的位置,使得 i 、 L E F T ( i ) 、 R I G H T ( i ) i、{\rm LEFT}(i)、{\rm RIGHT}(i) iLEFT(i)RIGHT(i)这三个结点满足最大堆性质。然而,由于 A [ i ] A[i] A[i]被放置到了 l a r g e s t largest largest位置,那么现在的 A [ l a r g e s t ] A[largest] A[largest]也有可能小于它的孩子,因此还需要对以 A [ l a r g e s t ] A[largest] A[largest]为根的子树递归调用MAX-HEAPIFY。可以看到,如果 A [ i ] A[i] A[i]不满足最大堆性质,那么 A [ i ] A[i] A[i]就会逐层下降,直到满足最大堆性质为止,或者直到降到最底层为止。
  下图给出了一个例子。初始时 A [ i ] = 4 A[i] = 4 A[i]=4,然后逐层下降,一直降到了最底层。
  在这里插入图片描述
  MAX-HEAPIFY的核心是让不满足最大堆性质元素逐层下降,而逐层下降的次数不会超过整棵树的高度,因此MAX-HEAPIFY的时间复杂度为 O ( h ) O(h) O(h),也就是 O ( l g n ) O({\rm lg}n) O(lgn)

练习

6.2-1 参照图6-2的方法,说明MAX-HEAPIFY(A, 3)在数组A = <27, 17, 3, 16, 13, 10, 1, 5, 7, 12, 4, 8, 9, 0>上的操作过程。
  
  在这里插入图片描述

6.2-2 参考过程MAX-HEAPIFY,写出能够维护最小堆的MIN-HEAPIFY(A, i)伪代码,并比较MIN-HEAPIFY与MAX-HEAPIFY的运行时间。
  
  在这里插入图片描述
  显然,MIN-HEAPIFY与MAX-HEAPIFY的运行时间一样,也为 O ( l g n ) O({\rm lg}n) O(lgn)

6.2-3 当元素 A [ i ] A[i] A[i]比其孩子的值都大时,调用MAX-HEAPIFY(A, i)会有什么结果?
  
  元素 A [ i ] A[i] A[i]比其孩子的值都大时, A [ i ] A[i] A[i]满足最大堆的性质,调用MAX-HEAPIFY(A, i)不会有任何改变。

6.2-4 i &gt; A . h e a p _ s i z e / 2 i &gt; A.heap\_size/2 i>A.heap_size/2时,调用MAX-HEAPIFY(A, i)会有什么结果?
  
  根据练习6.1-7的结论,当 i &gt; A . h e a p _ s i z e / 2 i &gt; A.heap\_size/2 i>A.heap_size/2时, A [ i ] A[i] A[i]一定为叶结点,故调用MAX-HEAPIFY(A, i)不会有任何改变。

6.2-5 MAX-HEAPIFY的代码效率较高,但第10行中的递归调用可能例外,它可能使某些编译器产生低效的代码。请用循环控制结构取代递归,重写MAX-HEAPIFY代码。
  
  在这里插入图片描述

6.2-6 证明:对一个大小为 n n n的堆,MAX-HEAPIFY的最坏情况运行时间为 Ω ( l g n ) Ω({\rm lg}n) Ω(lgn)。(提示:对于 n n n个结点的堆,可以通过对每个结点设定恰当的值,使得从根结点到叶结点路径上的每个结点都会递归调用MAX-HEAPIFY。)
  
  利用练习6.1-2的结论,含有 n n n个元素的堆高度为 ⌊ l g n ⌋ ⌊{\rm lg}n⌋ lgn。MAX-HEAPIFY的最坏情况为,从树的根结点开始,逐层下降,直到最底层。因此MAX-HEAPIFY的最坏情况运行时间为 Ω ( l g n ) Ω({\rm lg}n) Ω(lgn)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值