斐波那契堆

2021-09-07 23:13:00 字數 4020 閱讀 9172

斐波那契堆對乙個集合支援以下操作:

(1)向集合插入乙個元素(均攤複雜度log(n));

(2)集合最小值(o(1));

(3)刪除最小值(o(log(n)));

(4)兩個斐波那契堆合併(均攤複雜度o(1)) ;

(5)將其中某個元素的值更改為另乙個更小的值(均攤複雜度o(1));

(6)刪除乙個元素(log(n)).

1 #include 2 #include 3 #include 

4 #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 但是由於其演算法過於複雜,因而實際上更多的是用二項堆。乙個斐波那契堆具有如下性質 堆有一組有序樹組成,但是堆中的樹不一定是二項樹 斐波那契堆中的樹之間是無序的 二項堆中的...