结构之美——优先队列基本结构(四)——二叉堆、d堆、左式堆、斜堆
2015-08-14 15:53
239 查看
实现优先队列结构主要是通过堆完成,主要有:二叉堆、d堆、左式堆、斜堆、二项堆、斐波那契堆、pairing
堆等。
存储时使用层序。
减小元素:减小节点的值,上滤调整堆。
增大元素:增加节点的值,下滤调整堆。
删除非顶点节点:直接删除会出问题。方法:减小元素的值到无穷小,上滤后删除。
Merge:insert one by one
存储时使用层序。
左式堆:
1.一棵二叉树
2.零路径长:左儿子≧右儿子,父节点= min{儿子} +1(这条性质导致了左式堆的严重左偏)
零路径长度:
原则:根值大的堆与根值小的堆的右子堆合并(根值:根位置的元素值,并非零路径长度)
具体分三种情况(设堆H1的根值小于H2)
H1只有一个节点
H1根无右孩子
H1根有右孩子
(1.1).H1只有一个节点,若出现不满足:零路径长:左儿子≧右儿子,交换左右孩子。
(1.2).H1根无右孩子,若出现不满足:零路径长:左儿子≧右儿子,交换左右孩子。
(1.3).H1根有右孩子
1.初始状态,H1的根6,H2的根为8,将H2合并到H1。
2.将H1构造成根无右孩子的形式:
3.将元素10, merge到H2,要首先将H2构造成根无右孩子的形式,递归,merge,若出现不满足:零路径长:左儿子≧右儿子,交换左右孩子……
——》
——》
——》
4.
5.
deleteMin:delete root,merge
时间复杂度:merge与右路径长度之和成正比;最坏O(logN)
缺点:交换需判断;维护零路径长
特点:merge无条件交换。
时间复杂度:最坏O(N);最好Ω(1);平均O(logN)
如果是不支持所谓的合并操作union的话,普通的堆数据结构就是一种很理想的数据结构(堆排序)。 但是如果想要支持集合上的合并操作的话,最好是使用二项堆或者是斐波那契堆,普通的堆在union操作上最差的情况是O(n),但是二项堆和斐波那契堆是O(lgn)。
Binary heap Binomial heap Fibonacci heap
二叉堆(最坏情况) 二项堆(最坏情况)(斐波那契堆(平摊))
完整的PPT下载:http://download.csdn.net/detail/sangni007/4850483
堆等。
1. 二叉堆
1.1. 定义
完全二叉树,根最小。存储时使用层序。
1.2. 操作
(1). insert(上滤)
插入末尾 26,不断向上比较,大于26则交换位置,小于则停止。(2). deleteMin(下滤)
提取末尾元素,放在堆顶,不断下滤:(3). 其他操作:
都是基于insert(上滤)与deleteMin(下滤)的操作。减小元素:减小节点的值,上滤调整堆。
增大元素:增加节点的值,下滤调整堆。
删除非顶点节点:直接删除会出问题。方法:减小元素的值到无穷小,上滤后删除。
Merge:insert one by one
2. d叉堆
2.1. 定义
完全d叉树,根最小。存储时使用层序。
2.2. 操作:
操作跟二叉堆基本一致:insert,deleteMin,增大元素,减小元素,删除非顶元素,merge。2.3 二叉堆与d叉堆的对比:
3. 左式堆
3.1. 定义
零路径长度:到没有两个儿子的节点最短距离左式堆:
1.一棵二叉树
2.零路径长:左儿子≧右儿子,父节点= min{儿子} +1(这条性质导致了左式堆的严重左偏)
零路径长度:
3.2. 操作:
(1) merge :原则:根值大的堆与根值小的堆的右子堆合并(根值:根位置的元素值,并非零路径长度)
具体分三种情况(设堆H1的根值小于H2)
H1只有一个节点
H1根无右孩子
H1根有右孩子
(1.1).H1只有一个节点,若出现不满足:零路径长:左儿子≧右儿子,交换左右孩子。
(1.2).H1根无右孩子,若出现不满足:零路径长:左儿子≧右儿子,交换左右孩子。
(1.3).H1根有右孩子
1.初始状态,H1的根6,H2的根为8,将H2合并到H1。
2.将H1构造成根无右孩子的形式:
3.将元素10, merge到H2,要首先将H2构造成根无右孩子的形式,递归,merge,若出现不满足:零路径长:左儿子≧右儿子,交换左右孩子……
——》
——》
——》
4.
5.
3.3. 性质分析:
insert:mergedeleteMin:delete root,merge
时间复杂度:merge与右路径长度之和成正比;最坏O(logN)
缺点:交换需判断;维护零路径长
4. 斜堆
4.1. 定义
二叉树,根最小。由此可见:特点:merge无条件交换。
时间复杂度:最坏O(N);最好Ω(1);平均O(logN)
4.2性能比较:
5. 总结
如果是不支持所谓的合并操作union的话,普通的堆数据结构就是一种很理想的数据结构(堆排序)。 但是如果想要支持集合上的合并操作的话,最好是使用二项堆或者是斐波那契堆,普通的堆在union操作上最差的情况是O(n),但是二项堆和斐波那契堆是O(lgn)。
Binary heap Binomial heap Fibonacci heap
二叉堆(最坏情况) 二项堆(最坏情况)(斐波那契堆(平摊))
Procedure (worst-case) (worst-case) (amortized)
--------------------------------------------------------------
MAKE-HEAP (1) (1) (1)
INSERT (lg n) O(lg n) (1)
MINIMUM (1) O(lg n) (l)
EXTRACT-MIN (lg n) (1g n) O(lg n)
UNION (n) O(lg n) (1)
DECREASE-KEY (lg n) (lg n) (1)
DELETE (1g n) (lg n) O(lg n)
完整的PPT下载:http://download.csdn.net/detail/sangni007/4850483
相关文章推荐
- 关于Java多线程小结
- 深入浅出TCP协议的2MSL TIME_WAIT状态
- cocoapods的使用
- (大数据工程师学习路径)第三步 Git Community Book----高级技能
- Firebug控制台详解,让调试js代码变得更简单
- noip1998 幂方分解 (模拟)
- input文本框没有onchange事件,可以通过下面两种方法实现当input内容改变时触发事件
- 结构之美——优先队列三大结构(三)——Pairing Heap
- ttl485
- 算法编程中一些常用的知识点(updating)
- 经典动态规划问题 背包问题 [POJ3211][POJ2063][HDU1114][POJ1276][POJ1014][POJ1742][ZOJ3631]
- 黑马程序员———C语言———【枚举、typedef、宏、static和extern、文件操作】
- leetcode先刷_Path Sum
- 在jQuery中处理XML数据的大致方法
- 矩阵树定理
- 《数据结构与算法分析——c语言描述》读后笔记 2
- 使用jsp读取HTML格式文件
- jquery validate使用和扩展规则
- 学生信息管理系统总结
- 树-堆结构练习——合并果子之哈夫曼树