比较实用的堆有二叉堆(完全二叉树),因为其空间需求最小(可用数组实现),编程复杂度最低。
但是,在特殊情况时,需要常用合并操作并且n较大时,二叉堆的合并操作的复杂度是o(n),如果n是较大的值,可能是比较难以接受的,所以就有了可并堆。
本文主要学习可并堆的理论上的知识点。
1、二叉堆
定义:
二叉堆满足堆特性:
1)父结点的键值总是大于或等于(小于或等于)任何一个子结点的键值,且每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)
2)完全二叉树,结点i的儿子是2*i+1和2*i+2,父亲是i/2(下标从0开始);
3)当且仅当它满足以下两个条件之一时,才能称之为堆:
3-1)a[i]<=a[i*2+1]且a[i]<=a[i*2+2](即小根堆,节点的值不大于两个儿子的值)
3-2)a[i]>=a[i*2+1]且a[i]>=a[i*2+2](即大根堆,节点的值不小于两个儿子的值)
各种操作的时间复杂度
1)构建O(n)
2)插入O(logn)
3)取最小结点O(1)
4)删除最小结点O(logn)
5)删除任意结点O(logn)
6)合并O(n)
2、可并堆
定义
1)可并堆(Mergeable Heap)也是一种抽象数据类型,它除了支持优先队列的三个基本操作(Insert, Minimum, Delete-Min),
还支持一个额外的操作——合并操作:
2)H ← Merge(H1,H2)
Merge() 构造并返回一个包含H1和H2所有元素的新堆H。
各种可并堆:
(1)斜堆(SkewHeap)
(2)左偏树(LeftistTree)
(3)二项堆(BinomialHeap)
(4)配对堆(PairingHeap)
(5)斐波那契堆(FibonacciHeap)
各种操作的复杂度比较:
(1)斜堆( SkewHeap)
满足堆性质:
(1)父结点的键值总是大于或等于(小于或等于)任何一个子结点的键值
(2)每个结点的左子树和右子树都是斜堆
(3)结构看起来与普通的二叉树类似
合并A,B链两个斜堆
合并操作:merge( A, B)
(1)将以A,B为根结点的两个斜堆合并,再返回合并后的新斜堆的根结点。
(2)小根堆为例&#x