当前课程知识点:数据结构(下) > 第十章 优先级队列 > (xa1)左式堆:结构 > 10xa1-2: 堆之合并
引入左式堆的动机非常直接了当,一言以蔽之,也就是为了能够有效地完成堆合并。
具体地,对于任何的堆A与堆B,我们如何才能快速地将它们合二为一?
稍加思索,你可能会认为这并不是什么问题,因为借助业已掌握的方法,我们完全可以实现这个过程。
然而很遗憾,回到我们这门课程的核心,也就是计算效率,
我们会发现已有的方法都不足用。
比如,你可能会在两个堆中选择更大的那个作为基础,
然后将另一个堆中的元素逐一取出并加入到前者当中,
当更小的那个堆缩减为空时,也就自然完成了整体的合并,
整个算法的描述也异常简练,实际上主体的操作完全可以汇总为这样一句,
然而我们很快就会看到这个算法的效率是很低的,为此我们不妨将两个堆的规模分别记作n和m,
并且不失一般性地假设前者不小于后者,于是整个算法共需迭代m次,
在每次迭代中为了从b中摘除最大元,我们需要花费log(m)的时间,
而为了将这个元素汇入到a中,我们又需要花费log(n+m)的时间,
总体而言我们大约需要mlog(n)的时间,
至此我相信你也会对这个效率不甚满意——是的,因为它的确存在改进的空间和可能。
是的,你可能会想起Floyd批量建堆算法,
实际上更为高效的一种办法就是将这两个堆中的元素首先简单地混合起来,
然后借助Floyd算法将这n+m个元素整理为一个完全二叉堆,
你应该会记得,Floyd算法只需线性时间,这一算法的效率明显优于此前的那个算法。
然而即使是这个线性的效率,也依然不能令我们满意。你能看出我们不满意的原因吗?
没错,作为Floyd算法的输入在默认情况下,所有的元素都是无序排列的。
然而现在却并非如此,事实上它们被分成了两组,
而且我们也已经分别知道了它们内部的偏序关系,
很遗憾刚才这个线性的算法却没有利用到我们业已掌握的这些信息。
因此从这一角度出发,我们完全有理由相信应该会存在更为高效的数据结构及相应的算法。
事实上,左式堆正是问题的答案。
-选课之前
--写在选课之前
--宣传片
-考核方式
--考核方式
-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)希尔排序:逆序对
-本章测验
--本章测试