Fibonacciho hromada

Fibonacciho halda ( angl.  Fibonacci halda ) je datová struktura , která je množinou stromů uspořádaných v souladu s vlastností neklesající pyramidy. Fibonacciho haldy představili Michael Fredman a Robert Tarjan v roce 1984 .

Struktura je implementací abstraktního datového typu " Prioritní fronta " a je pozoruhodná tím, že operace, které nevyžadují odstranění, mají amortizovanou dobu běhu (u binární haldy a binomické haldy je amortizovaná doba běhu ). Kromě standardních operací , , , Fibonacci halda umožňuje provést operaci sloučení dvou hald v čase. INSERTMINDECREASE-KEYUNION

Struktura

Operace

Vytváření nové Fibonacciho haldy

Procedura Make_Fib_Heap vrací objekt haldy Fibonacci a = NULL. Nejsou tam žádné stromy .

Zůstatková cena postupu se rovná jeho skutečným nákladům .

Vložení uzlu

Fib_Heap_Insert 1 ← 0 2 ← NULL 3 ← NULL 4 ← 5 ← 6 ← NEPRAVDA 7 Připojení seznamu kořenů obsahujících , k seznamu kořenů 8 if = NULL nebo 9 pak ← 10 ← + 1

Zůstatková cena postupu se rovná jeho skutečným nákladům .

Nalezení minimálního uzlu

Procedura Fib_Heap_Minimum vrací .

Zůstatková cena postupu se rovná jeho skutečným nákladům .

Spojení dvou Fibonacciho hald

Fib_Heap_Union 1 ← Make_Fib_Heap() 2 ← 3 Přidání seznamu kořenů do seznamu kořenů 4 pokud ( = NULL) nebo ( ≠ NULL a < ) 5 pak ← 6 ← 7 Uvolněte předměty a 8 se vraťte

Zůstatková cena postupu se rovná jeho skutečným nákladům .

Extrahování minimálního uzlu

Fib_Heap_Extract_Min 1 ← 2 , pokud ≠ NULL 3 pak pro každého potomka uzlu 4 proveďte Přidat do kořenového seznamu 5 ← NULL 6 Odebrat z kořenového seznamu 7 if = 8 pak ← NULL 9 jinak ← 10 Konsolidovat 11 ← 12 vrátit

V jedné z fází operace vytěžování minimálního uzlu se provádí zhutnění ( angl.  konsolidace ) seznamu kořenů . K tomu použijte pomocný postup Consolidate. Tento postup používá pomocné pole . If , then je aktuálně kořen se stupněm .

Konsolidujte 1 pro ← 0 až 2 do ← NULL 3 pro každý uzel v kořenovém seznamu 4 proveďte ← 5 ← 6 , zatímco ≠ NULL 7 do ← //Uzel se stejným stupněm jako 8 , pokud 9 , pak vyměňte ↔ 10 Fib_Heap_Link 11 ← NULL 12 ← 13 ← 14 ← NULL 15 pro ← 0 až 16 proveďte, pokud ≠ NULL 17 pak Přidat do kořenového seznamu 18 if = NULL nebo 19 pak ← Fib_Heap_Link 1 Odebrat z kořenového seznamu 2 Vytvořit podřízený uzel , přírůstek 3 ← FALSE

Amortizované náklady na extrakci minimálního uzlu jsou .

Klesající klíč

Fib_Heap_Decrease_Key 1 , pokud 2 , pak chyba "Nový klíč je větší než aktuální" 3 ← 4 ← 5 pokud ≠ NULL a 6 pak Vyjmout 7 Cascading_Cut 8 , pokud 9 pak ← Vyjmout 1 Odebrat ze seznamu podřízených uzlů , zmenšit 2 Přidat do seznamu kořenů 3 ← NULL 4 ← NEPRAVDA Cascading_Cut 1 ← 2 , pokud ≠ NULL 3 pak if = FALSE 4 pak ← TRUE 5 else Cut 6 Cascading_Cut

Amortizované náklady na snížení klíče nepřesahují .

Smazání uzlu

Fib_Heap_Delete 1 Fib_Heap_Decrease_Key ∞ 2 Fib_Heap_Extract_Min

Amortizovaná doba trvání postupu je .

Viz také

Odkazy

Literatura