结构之美——优先队列三大结构(三)——Pairing Heap

转自http://dsqiu.iteye.com/blog/1714961

1.Pairing Heap简介

斐波那契堆主要有两个缺点:编程实现难度较大和实际效率没有理论的那么快(由于它的存储结构和四个指针)。Pairing Heap的提出就是弥补斐波那契堆的两个缺点——编程简单操作的时间复杂度和斐波那契堆一样。

Pairing Heap其实就是一个具有堆(最大堆或最小堆)性质的树,它的特性不是由它的结构决定的,而是由于它的操作(插入,合并,减小一个关键字等)决定的。

 

1.1Pairing Heap的ADT

 

C代码
PairingHeapNode
{
	int							key;
	struct	PairingHeapNode*	child;
	struct	PairingHeapNode*	sibling;
	struct	PairingHeapNode*	prev;

}PairHeap;


 

2.Pairing Heap 的操作

注意:图解过程是以最大堆来演示的,但是代码是以最小堆来写的,见谅!

2.1.合并两个子堆


C代码  

 

2.2. 插入一个结点


C代码

2.3.增加(减小)一个关键字


 


C代码   

2.5.删除最小结点


 

 

3.Pairing Heap完整代码实现

 

C代码
 

 

小结

终于到小结了,这篇文章写得比较吃力,如斐波那契堆的“减小一个关键字”的操作我就对使用级联剪切还没有找到解释,还有还没有找到Pairing Heap的定义,唯独只有自己理解和揣测(比如pairing heap没有明确的定义,本人个人理解pairing heap的独特性一定在他的操作,即行为决定特征)但总归还是相对完整,希望能对你有说帮助。如果你有任何建议、批评或补充,还请你不吝提出,不甚感激。更多参考请移步互联网。

 

 

 

 

参考:

①酷~行天下: http://mindlee.net/2011/09/26/binomial-heaps/

Björn B. Brandenburg:http://www.cs.unc.edu/~bbb/#binomial_heaps

③酷~行天下: http://mindlee.net/2011/09/29/fibonacci-heaps/

④Adoo's blog :http://www.roading.org/algorithm/introductiontoalgorithm/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E5%A0%86fibonacci-heaps.html

⑤Golden_Shadow:http://blog.csdn.net/golden_shadow/article/details/6216921

Sartaj Sahni:http://www.cise.ufl.edu/~sahni/dsaaj/enrich/c13/pairing.htm

⑦C++ template Fibonacci heap, with demonstration:http://ideone.com/9jYnv

⑧"The pairing heap: a new form of self-adjusting heap":http://www.cs.cmu.edu/afs/cs.cmu.edu/user/sleator/www/papers/pairing-heaps.pdf

Vikas Tandi :http://programmingpraxis.com/2009/08/14/pairing-heaps/

⑩http://www.cise.ufl.edu/~sahni/cop5536/slides/lec156.pdf

⑩+1: 算法导论和维基百科

你可能感兴趣的:(数据结构,Introduction,to,Algorithms)