当前课程知识点:数据结构(下) > 第十章 优先级队列 > (b2)完全二叉堆:插入与上滤 > 10b2-1: 上滤
好,接下来我们就来学习在一个完全二叉堆中,
如何有效地插入一个新的元素。
我们将会看到,插入过程中的核心技巧是所谓的“上滤”过程。
为了在完全二叉堆中引入一个新词条e,
我们只需在物理上将它作为末元素
直接插入至对应的向量之中——
没错,向量。
请记住,尽管在逻辑上我们可以将优先级队列理解成一棵完全二叉树,
但是在物理上它依旧是一个不折不扣的向量。
向量在物理上增加一个末元素,
相当于在这棵完全二叉树底层向空缺部分拓展一个节点。
我们可以看到,将新的词条作为末元素接入向量的好处在于,
可以使得完全二叉堆的结构性得以延续。
当然,另一条件,也就是堆序性如果也能够得以延续,
我们也能够大功告成。
然而很遗憾,在新的节点引入之后,
堆序性未必能够延续。
当然,即便如此,情况也不致太糟糕,
唯一可能违背堆序性的只有新插入的这个节点与它的父亲。
也就是说,新插入的这个节点拥有一个父亲,
而且在数值上,新插入的这个节点要大于它的父亲。
既然找到了问题的症结,我们也就自然得到了解决的办法。
没错,在这种情况下我们只需将新插入的节点e与它的父亲互换位置,
从而转化为这样一种状态。
不难看出,经过这样的转换之后,
不仅顺利地解决了节点e与它此前的父亲的逆序性,
不难看出,经过这样的转换之后,
不仅顺利地解决了节点e与它此前的父亲的逆序性,
同时其它所有节点之间的堆序性也不致受到影响。
当然,问题未必就此完全地解决:
因为e有可能依然会有一个新的父亲,
而且如果不巧e有可能依然会大于这个新的父亲,
也就是说e和它新的父亲再次违反堆序性。
你应该知道如何解决这个问题了,
是的,我们只需再次套用此前的策略,
令e和它新的父亲互换位置,
从而进入这样一种状态。
同样,经过这样一次交换,在刚才这一层的逆序性得到了修复,
而且不致同时影响到其它的节点。
接下来如果依然存在问题,
也只可能是e和它新的父亲违背堆序性。
果真如此,我们可以继续令e和它的父亲互换位置,
从而转入这样一种状态。
好消息是,这样一种反复交换过程满足某种单调性。
不难看出,每经过这样一次交换,e的高度就会上升一层。
同时违反堆序性的情形如果存在,也必然会上升一层。
既然这样一个逐层调整的过程充其量不过抵达到树根,
因此也迟早会终止于某个位置。
而一旦这个过程终止,也就意味着堆序性在这个完全二叉堆得到了彻底的恢复。
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试