前一篇博文记录了二项堆的一些操作,本文介绍与之相似的堆结构——斐波那契堆。
斐波那契堆是可合并堆,一些操作可以在常数滩还时间内完成,而二项堆中的一些操作需要O(lgn);
定义
一个斐波那契堆是一序列具有最小堆序的有根树的集合。也就会说,每棵树都遵循最小堆性质:每个节点的关键字不小于它父节点的关键字。
注:斐波那契堆里的树可以不是二项树,并且根链表是无序的。
结构
斐波那契堆是由一组最小堆有序树构成的。每个节点的度数为其子节点的数目。树的度数为其根节点的度数。
斐波那契堆中的树都是有根的但是无序。每个节点x包含指向父节点的指针p[x]和指向任意一个子结点的child[x]。x的所有子节点都用双向循环链表链接起来,叫做x的子链表。子链表中的每一个节点y都有指向它的左兄弟的left[y]和右兄弟的right[y]。如果节点y是x仅有的子节点,则left[y]=right[y]=y。
斐波那契堆中所有树的根节点也用一个双向循环链表链接起来。
每个节点x的域
- 父节点p[x]
- 指向任一子女的指针child[x]——结点x的子女被链接成一个环形双链表,称为x的子女表
- 左兄弟left[x]
- 右兄弟right[x]——当left[x] = right[x] = x时,说明x是独子。
- 子女的个数degree[x]
- 布尔值域mark[x]——标记是否失去了一个孩子
操作
1、初始化
/*创建并返回一个空的FibonacciHeap*/
FibHeap Make_FibHeap()
{
FibHeap heap=NULL;
heap=(FibHeap)malloc(sizeof(FiboHeap));
if(NULL==heap)
{
printf("malloc heap is failed.\n");
exit(1);
}
memset(heap,0,sizeof(FiboHeap));
return heap;
}
/*初始化节点*/
FibHeapNode intial_Nod