我试图了解斐波那契堆,在堆中插入元素的伪代码是:
Fibonacci-Heap-Insert(H,x)
degree[x] := 0
p[x] := NIL
child[x] := NIL
left[x] := x
right[x] := x
mark[x] := FALSE
concatenate the root list containing x with root list H
if min[H] = NIL or key[x]<key[min[H]]
then min[H] := x
n[H]:= n[H]+1
以下是我不明白的一些事情,
- 什么是
root list containing x
以及如何将它与包含 H 的根列表连接起来?
在提取 min 时,我们执行以下操作:
Fibonacci-Heap-Extract-Min(H)
z:= min[H]
if x <> NIL
then for each child x of z
do add x to the root list of H
p[x]:= NIL
remove z from the root list of H
if z = right[z]
then min[H]:=NIL
else
min[H]:=right[z]
CONSOLIDATE(H)
n[H] := n[H]-1
return z
(这里是其他功能,合并和链接,http://www.cse.yorku.ca/~aaw/Jason/FibonacciHeapAlgorithm.html)
在前面的insert函数中,我们将x的child和p设置为nil,在提取min时,
if <> nil
总是为false,所以如果我们多次调用该函数,它永远不会给出准确的min。如果这个结构被称为斐波那契“堆”,它在哪里维护堆属性?
如果我们在 Dijkstra 算法中使用二进制堆而不是斐波那契堆,所花费的时间会几乎与使用数组或链表一样慢吗?
谁能解释我遇到的困难?谢谢你。