斐波那契堆(Fibonacci Heap)
1. 定义
FibHeap是一个树的集合,且树满足最小堆性质。根表不要求树根的度有序,head指向根表中值最小
的结点。全部使用双向循环链表。
KEY:防止超出O(lgn)的操作出现,也即防止出现度超过O(lgn)的树出现,只要能保证D(n)<=
lgn,其性能优于二项堆。
2. 数据结构
- 结点的域
p:父指针
left,right:左右指针
key:值
degree:度
child:指向任意孩子
mark:非常重要的标志位。创建结点或结点成为孩子时,mark=false,结点失去一个孩子时,mark=true。 - 根表以及结点间 双向循环链表
3. 预定义
- 势函数定义
f(H)=t(H)+2m(H)
f表示势函数,t表示树的个数,m表示mark=true的结点数。 - 平摊分析
C^i = C_i + f(i) - f(i-1)
C^i:平摊成本
C_i:操作的实际成本
f(i-1):操作前的势能
f(i):操作后的势能 - 任意结点的最大度上界 D(n)
- 无序二项树U_k
不要求按子树的度的大小排列。
4. 五个基本操作
- 创