Gramada de Fibonacci
Heap Fibonacci ( ing. Fibonacci heap ) este o structură de date care este un set de arbori ordonați în conformitate cu proprietatea unei piramide nedescrescătoare. Mulțile Fibonacci au fost introduse de Michael Fredman și Robert Tarjan în 1984 .
Structura este o implementare a tipului de date abstracte „ Coadă prioritară ” și este remarcabilă prin faptul că operațiunile care nu necesită ștergere au un timp de rulare amortizat de (pentru un heap binar și un heap binomial , timpul de rulare amortizat este de ). Pe lângă operațiunile standard , , , heap-ul Fibonacci vă permite să efectuați operația de îmbinare a două heap-uri în timp.
INSERTMINDECREASE-KEYUNION
Structura
- Mormanul Fibonacci este o colecție de copaci .
- Fiecare arbore din este supus proprietății heap ( eng. min-heap property ): cheia fiecărui nod nu este mai mică decât cheia nodului părinte.
- Fiecare nod din conține următoarele indicatoare și câmpuri:
- - câmpul în care este stocată cheia;
- — pointer către nodul părinte;
- — un pointer către unul dintre nodurile copil;
- - pointer către nodul soră stânga;
- - indicatorul către nodul soră din dreapta;
- - un câmp care stochează numărul de noduri copii;
- — o valoare booleană care indică dacă nodul a pierdut vreun nod copil de când a devenit un nod copil al unui alt nod.
- Nodurile copil sunt combinate cu ajutorul indicatorilor și într-o listă ciclică dublu legată de noduri copil (de exemplu , listă de copii ) .
- Rădăcinile tuturor copacilor din sunt conectate prin intermediul indicatorilor și într-o listă ciclică dublu legată de rădăcini ( eng. root list ).
- Pentru întregul heap Fibonacci, este stocat și un pointer către nodul cu cheia minimă , care este rădăcina unuia dintre arbori. Acest nod este numit nodul minim .
- Numărul curent de noduri în este stocat în .
Operațiuni
Crearea unui nou heap Fibonacci
Procedura Make_Fib_Heap returnează un obiect Fibonacci heap și = NULL. Nu sunt copaci .
Costul amortizat al unei proceduri este egal cu costul real al acesteia .
Inserarea unui Nod
Fib_Heap_Insert
1 ← 0
2 ← NULL
3 ← NULL
4 ←
5 ←
6 ← FALS
7 Atașarea unei liste de rădăcini care conține , la o listă de rădăcini
8 dacă = NULL sau
9 atunci ←
10 ← + 1
Costul amortizat al unei proceduri este egal cu costul real al acesteia .
Găsirea nodului minim
Procedura Fib_Heap_Minimum returnează un .
Costul amortizat al unei proceduri este egal cu costul real al acesteia .
Unirea a două grămezi Fibonacci
Fib_Heap_Union
1 ← Make_Fib_Heap()
2 ←
3 Adăugarea unei liste de rădăcini la o listă de rădăcini
4 dacă ( = NULL) sau ( ≠ NULL și < )
5 apoi ←
6 ←
7 Eliberați obiectele și
8 reveniți
Costul amortizat al unei proceduri este egal cu costul real al acesteia .
Extragerea nodului minim
Fib_Heap_Extract_Min
1 ←
2 dacă ≠ NULL
3 apoi pentru fiecare copil al nodului
4 face Add to root list
5 ← NULL
6 Eliminați din lista rădăcină
7 dacă =
8 , atunci ← NULL
9 else ←
10 Consolidează
11 ←
12 returnează
La una dintre etapele operației de extragere a nodului minim se efectuează compactarea ( ing. consolidare ) a listei de rădăcini . Pentru a face acest lucru, utilizați procedura de ajutor Consolidate. Această procedură folosește o matrice auxiliară . Dacă , atunci este în prezent o rădăcină cu grad .
Consolidați
1 pentru ← 0 la
2 face ← NULL
3 pentru fiecare nod din lista rădăcină
4 face ←
5 ←
6 în timp ce ≠ NULL
7 face ← //Nod cu același grad ca
8 dacă
9 atunci schimbă ↔
10 Fib_Heap_Link
11 ← NULL
12 ←
13 ←
14 ← NULL
15 pentru ← 0 până la
16 faceți dacă ≠ NULL
17 apoi Adăugați la lista rădăcină
18 dacă = NULL sau
19 apoi ←
Fib_Heap_Link
1 Eliminați din lista rădăcină
2 Faceți un nod copil , incrementați
3 ← FALSE
Costul amortizat al extragerii nodului minim este de .
Tasta descrescătoare
Fib_Heap_Decrease_Key
1 dacă
2 , atunci eroarea „Cheia nouă este mai mare decât cea actuală”
3 ←
4 ←
5 dacă ≠ NULL și
6 atunci Cut
7 Cascading_Cut
8 dacă
9 atunci ←
Tăiați
1 Eliminați din lista nodurilor copil , reduceți
2 Adăugați la lista rădăcinilor
3 ← NULL
4 ← FALS
Cascading_Cut
1 ←
2 dacă ≠ NULL
3 atunci dacă = FALS
4 apoi ← ADEVĂRAT
5 altfel Cut
6 Cascading_Cut
Costul amortizat al reducerii cheii nu depășește .
Ștergerea unui nod
Fib_Heap_Delete
1 Fib_Heap_Decrease_Key ∞
2 Fib_Heap_Extract_Min
Timpul de derulare amortizat al procedurii este de .
Vezi și
Link -uri
Literatură
- Thomas H. Kormen et al.Algoritmi : construcție și analiză. - Ed. a II-a. - M . : Editura Williams , 2007. - S. 1296. - ISBN 5-8459-0857-4 .
- Mehlhorn, Kurt, Sanders, Peter. 6.2.2 Fibonacci Heaps // Algoritmi și structuri de date: Cutia de instrumente de bază. - Springer, 2008. - 300 p. — ISBN 978-3-540-77978-0 .