当前课程知识点:数据结构(下) > 第十章 优先级队列 > (xa2)左式堆:合并 > 10xa2-4: 实例
以下,我们就来通过一个具体的实例加深对左式堆合并算法的理解和领悟:
假设在这里我们需要将一个规模为4的堆与另一规模为3的堆合并起来。
首先通过比较,我们能够确认前者的树根在数值上要大于后者的树根,
因此二者无需互换,我们分别称之为a和b。
相应地,a的右孩子也自然就是12。
于是按照算法,我们将原先的问题转化为a的右子堆与b堆的合并问题。
在新的这个递归层次,我们依然需要比较两个子堆的根节点,
因为在数值上15更大,所以我们此时应该将它们互换名称,将前者记作b,将后者记作a。
于是,问题进而转化为这样的形式,也就是将15这个堆与12这个堆进行合并,
既然此时的a是15,那么a的右子树也自然就是8,
于是按照算法的流程,问题进一步转化为子堆8与子堆12的合并问题。
同样,在经过一次数值上的比较之后,我们确认将二者互换名称,
也就是说我们接下来应当把12作为a,把8作为b。
此时,a的右孩子为空,
因此在再接下来的递归层之上,将直接返回节点8,并且将8作为12的右孩子,
也就是说在此局部应该是这样。
请特别注意,在这层递归返回之前,还有一项特别重要的任务,你还记得吗?
是的,还需要确认12满足左倾性,
实际上它这个时候恰恰并不满足,因为我们注意到,它当前的左子树为空。
当然,只要留意了这个问题,它的解决并不困难,你也应该记得是怎么处理的——
没错,令它的左右子堆互换位置,这也就是为什么我们得到了这样一个局部结构。
接下来,我们的递归返回到节点15,
同样地,我们也需要确认这个节点的左倾性。
那么此时它的两个孩子,它们的NPL值又是多少呢?
是的,都应该是1,因此,左倾性在这个节点上并没有受到破坏,
因此我们可以继续逆行而上,继续返回到节点的根,也就是17,
此时的17是否满足左倾性呢?我们来查验一下它的左右孩子NPL值各是多少,你也不妨心算一下。
没错,左孩子的NPL值是1,而右孩子的NPL值为2,
也就是说此时的节点17恰恰违反了左倾性。
同样地,关键在于发现问题,解决问题并不困难,在这种情况下,我们也只需经过一次对换,
交换17的两个孩子,在节点17的左右孩子交换之后,
这个数据结构也就整体上恢复为一个左式堆。
不要忘了,构成这个堆的成员不多不少恰好都来自于最初待合并的两个子堆。
也就是说,我们已经顺利地完成了这样一个合并的任务。
当然,通过这个实例也可以验证我们最初的设计目标:
也就是整个的合并过程的确是围绕右侧链来进行。
因此,整个算法的时间复杂度也自然不会超过右侧链的长度,
我们此前已经就此作出过界定,也就是说它在渐进意义下绝对不会超过log(n),
这个结果再好不过了。
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试