当前课程知识点:数据结构(下) > 第十章 优先级队列 > (b3)完全二叉堆:删除与下滤 > 10b3-2: 实例
我们来看一下这样一个具体的实例。首先确认,这的确是一个完全二叉堆,
而且按照我们的习惯,上边是我们的逻辑结构,下边是对应的物理实现。
不出意外,这个数据集中的最大元5的确位于堆顶,或者说在向量中是首元素。
现在就假设我们需要将这个最大元摘除掉。
按照刚才所设计的算法,为了在此后尽快地恢复结构性,我们需要将它的末元素1
放在堆顶的位置取而代之。
此时的情况应该如这个图所示:也就是说此前的末元素1的确被前移至堆顶的位置。
然而正如我们所预期,此前位于底层,相对而言数值更小的元素,
在被放到堆顶的位置之后,通常都很难胜任堆顶的角色。正所谓“高处不胜寒”,
比如就这个例子而言,此时无论是它的左孩子还是右孩子,在数值上都要严格地比它大,
也就是在此局部违反了堆序性。
所幸的是,在其它的位置,堆序性依然得以延续。
接下来为了恢复这里的堆序性,按照刚才设计的算法,我们应该在两个孩子之间挑选出数值更大的那个。
就这个例子而言,自然是数值为4的这个节点。
于是我们只需令这个节点与它的左孩子4互换位置。
需要再次提醒大家的是,这种逻辑上的互换在物理上都是在向量的内部完成。
只不过与其说是交换完全二叉堆的节点,不如更准确地说是交换向量中的元素。
这次交换之后的情况应该如这个图所示,我们可以看到,在向量内部,4和1在物理上交换了位置,
而相应的在逻辑上,节点1和4也互换了位置。
我们可以看到,这样一次交换的确修复了这一层次的逆序问题,
然而此前惹是生非的节点1在下降了一层之后有可能依然会带来麻烦。
是的,它依然没有完全符合堆序性。
我们看到,尽管此时它的右孩子比它要小,但是它的左孩子却依然比它要大。
为了修复这一缺陷,我们依然需要将违反堆序性的这样一对父子交换位置,这也是最后一次交换。
因为正如我们在这个图中所看到的,节点1在交换之后已经成为了一片叶子,
根本没有了后代,因此逆序性也无从谈起。
因此最终整个数据结构又重新恢复为了一个完全二叉堆。
那么,这样一个连续不断的逐层下滤的过程又当如何具体实现为代码呢?
实现的效率又能达到多高呢?
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-OJ系统说明
--关于OJ
--1-注册与登录
--2-界面与选课
--3-提交测试
-关于课程教材与讲义
--课程教材与讲义
-关于讨论区
--关于讨论区
-微信平台
--html
-PA晋级申请
--PA晋级
-(a)概述
--07A-1 纵览
--07A-5 接口
-(a)概述--作业
-(b1)BST:查找
-第七章 二叉搜索树--(b1)BST:查找
-(b2)BST:插入
-(b2)BST:插入--作业
-(b3)BST:删除
-第七章 二叉搜索树--(b3)BST:删除
-(c)平衡与等价
-(c)平衡与等价--作业
-(d1)AVL树:重平衡
-第七章 二叉搜索树--(d1)AVL树:重平衡
-(d2)AVL树:插入
-(d2)AVL树:插入--作业
-(d3)AVL树:删除
-(d3)AVL树:删除--作业
-(d4)AVL树:(3+4)-重构
-(d4)AVL树:(3+4)-重构--作业
-本章测验
--章节测验
-(a1)伸展树:逐层伸展
--习题
-(a2)伸展树:双层伸展
--习题
-(a3)伸展树:算法实现
--习题
-(b1)B-树:动机
--习题
-(b2)B-树:结构
--习题
-(b3)B-树:查找
--习题
-(b4)B-树: 插入
--习题
-(b5)B-树: 删除
--习题
-(xa1)红黑树:动机
--习题
-(xa2)红黑树:结构
--习题
-(xa3)红黑树:插入
--习题
-(xa4)红黑树:删除
-本章测验
--习题
-(b)散列:原理
--09B-3 数组
--09B-4 原理
--09B-5 散列
--09B-6 冲突
--习题
-(c)散列:散列函数
--习题
-(d1)散列:排解冲突(1)
--习题
-(d2)散列:排解冲突(2)
--习题
-(e)桶/计数排序
--习题
-本章测验
--本章测试
-(a1)需求与动机
--习题
-(a2)基本实现
--习题
-(b1)完全二叉堆:结构
--习题
-(b2)完全二叉堆:插入与上滤
--习题
-(b3)完全二叉堆:删除与下滤
--习题
-(b4)完全二叉堆:批量建堆
--习题
-(c)堆排序
--习题
-(xa1)左式堆:结构
--习题
-(xa2)左式堆:合并
--习题
-(xa3)左式堆:插入与删除
-本章测验
--本章测试
-(a)ADT
--习题
-(b1)串匹配
--习题
-(b2)蛮力匹配
--习题
-(c1)KMP算法:从记忆力到预知力
--习题
-(c2)KMP算法:查询表
--习题
-(c3)KMP算法:理解next[]表
--习题
-(c4)KMP算法:构造next[]表
--习题
-(c5)KMP算法:分摊分析
--习题
-(c6)KMP算法:再改进
-(d1)BM_BC算法:以终为始
-(d2)BM_BC算法:坏字符
-(d3)BM_BC算法:构造bc[]
-(d4)BM_BC算法:性能分析
-(e1)BM_GS算法:好后缀
-(e2)BM_GS算法:构造gs表
-(e3)BM_GS算法:综合性能
-(f1)Karp-Rabin算法:串即是数
-(f2)Karp-Rabin算法:散列
-本章测验
--本章测试
-(a1)快速排序:算法A
-- 12a1-5: 实例
--习题
-(a2)快速排序:性能分析
--习题
-(a4)快速排序:变种
-(b1)选取:众数
-(b3)选取:通用算法
--习题
-(c1) 希尔排序:Shell序列
--习题
-(c2)希尔排序:逆序对
-本章测验
--本章测试