斐波那契堆對乙個集合支援以下操作:
(1)向集合插入乙個元素(均攤複雜度log(n));
(2)集合最小值(o(1));
(3)刪除最小值(o(log(n)));
(4)兩個斐波那契堆合併(均攤複雜度o(1)) ;
(5)將其中某個元素的值更改為另乙個更小的值(均攤複雜度o(1));
(6)刪除乙個元素(log(n)).
1 #include 2 #include 3 #include4 #include 5
using
namespace
std;67
8 template9
class
fibonacciheap
1029
};30
public
:31 typedef fibonacciheapnode*iterator;
3233
private
:34 fibonacciheapnode*m_minnode;
35int
m_nodenumber;
36value_type m_minvalue;
37 fibonacciheapnode**m_arrforconsolidate;
38int
m_arrforconsolidatesize;
3940 fibonacciheapnode*newnode()
4152
53/**54
將a插入b之前55*
*/56
void insertnode(fibonacciheapnode *a,fibonacciheapnode*b)
5763
64void linkheap(fibonacciheapnode* y,fibonacciheapnode*x)
6574
else
7578 y->father=x;
79 y->marked=false
;80 x->degree++;
8182}83
84/*
**85
合併根鍊錶 直到根煉表上每乙個根有不同的度數(degree)86*
*/87
void
consolidate()
88while(cur!=m_minnode);
9899
100if(m_arrforconsolidatesize101106
107108
for(int i=0;i<=maxdegree;i++) m_arrforconsolidate[i]=null;
109 cur=m_minnode;
110for(int i=0;i)
111125
linkheap(y,x);
126 m_arrforconsolidate[d++]=null;
127}
128 m_arrforconsolidate[d]=x;
129 cur=next;
130}
131132 m_minnode=null;
133for(int i=0;i<=maxdegree;i++)
134142
else
143149
150}
151}
152}
153}
154155/**
156x是y的兒子 切下x 並把x接入根鍊錶
157*
*/158
void cut(fibonacciheapnode*x,fibonacciheapnode*y)
159167
else
168175
}176
insertnode(x,m_minnode);
177 x->father=null;
178 x->marked=false
;179 y->degree--;
180}
181182
void cascadingcut(fibonacciheapnode*y)
183193
}194
}195
196 iterator search(fibonacciheapnode* cur,const
reference key)
197while(tmp!=cur);
208return
null;
209}
210211
void freeall(fibonacciheapnode*rt)
212while(cur!=rt);
220for(int i=0;i)
221227
}228
229public
:230
fibonacciheap(value_type minvalue):
231 m_minnode(null),m_nodenumber(0),m_minvalue(minvalue),m_arrforconsolidatesize(0
){}232
233 ~fibonacciheap()
234238
239void insert(const
reference key)
240248
else
249254 m_nodenumber++;
255}
256257
value_type getminvalue()
258261
262/*
*263
將h合併到該樹上
264之後將銷毀h
265*
*/266
void unionheap(fibonacciheap* &h)
267275
else
276291
}292
293 m_nodenumber+=h->m_nodenumber;
294delete
h;295 h=null;
296}
297298
void
removeminvalue()
299while(curson!=sonbegin);
313 curson=sonbegin;
314for(int i=0;i)
315320
}321
322if(z->left==z)
323326
else
327333
delete
z;334 m_nodenumber--;
335}
336337
void decreasekey(fibonacciheapnode* x,const
reference key)
338347
if(x->keykey) m_minnode=x;
348}
349350/**
351刪除指標x
352*
*/353
void remove(fibonacciheapnode*x)
354359
360/*
*361
刪除x362**/
363void remove(const
reference x)
364367
368/*
*369
查詢key 返回乙個指標 找不到返回null
370*
*/371 iterator search(const
reference key)
372375
376 };
斐波那契堆
以下是實現的程式 肯定可以再優化的。include include include include using namespace std class node delete m child m child null class fibonacciheap node insert int key v...
斐波那契堆
ifndef finbonacci heap h define finbonacci heap h include stdlib.h include math.h define error0 printf error at file s line d n file line 定義乙個求有符號的無窮大...
斐波那契堆
斐波那契堆同二項堆一樣,也是一種可合併堆。相對於二項堆,斐波那契堆的優勢在於如果不涉及刪除元素的操作,則它的平攤執行時間為o 1 但是由於其演算法過於複雜,因而實際上更多的是用二項堆。乙個斐波那契堆具有如下性質 堆有一組有序樹組成,但是堆中的樹不一定是二項樹 斐波那契堆中的樹之間是無序的 二項堆中的...