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 abstracteCoadă 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

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ă