本文主要是介绍算法导论期末复习(斐波那契堆),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
斐波那契堆
1、斐波那契堆结构
斐波那契堆是由一组最小有序树构成的—无序二项树
其中有序对应的是,父母节点都比孩子节点小。无序是兄弟结点之间并没有先后顺序之分。
与二项堆类似每个斐波那契堆中的结点 x x x 都有以下结构:
1.父节点指针p[x]。如果结点为堆中无序树的根节点则p[x]=nil。
2.指向任意一个孩子结点的指针child[x]。
3.左右兄弟结点left[x],right[x]。如果没有左右兄弟,则left[x]=right[x]=nil。并且最右边孩子结点的right[x]=树中第一个节点。
4.记录孩子结点个数的域degree[x]
5.标记结点mark[x]。如果该节点成为另一个节点的孩子结点后,失去了结点,则该节点标记为true。
6.min[H],指向斐波那契堆 H 中的最小值所在结点的指针。
具体实例可看下图:
此外还需要了解表示斐波那契堆属性的符号:
-
t(H) 根表中树的个数(根表存储堆中无序树的根节点)。
-
n(H) 堆中结点的个数
-
m(H) 表示堆中被标记结点的个数
-
D(n)表示根表中根结点结点的最大度数的上界 (斐波那契堆中D(n)= l g n lgn lgn)
由上面所描述,我们定义斐波那契堆的势函数为:
f ( H ) = t ( H ) + m ( H ) f(H)= t(H) + m(H) f(H)=t(H)+m(H)
当H=0时,该势函数显然成立。
2、斐波那契堆的操作
1)可合并堆的操作
①.、创建斐波那契堆
创建一个空的斐波那契堆。所有参数都为空。
②、插入节点
如果该节点已被分配,直接将该节点插入根表中。比较和min(H)的大小,确定min(H)的值。
操作的平摊代价分析:O(1)
③、寻找最小结点
min(H)
④、合并两个斐波那契堆
简单的将两个斐波那契堆的根表合并。由势函数的定义可知道,堆势
⑤、抽取最小节点
过程描述:
由于是最小结点一定在树的根节点,所以将最小结点的孩子结点都加入到根节点,抽取最小结点 x 。将min(H)=right(x) , 然后不断合并堆中度数相同的结点。直到根表中根节点度数没有相同的
这篇关于算法导论期末复习(斐波那契堆)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!