Delete - oder DekreaseKey-Operation bleibt ein Binomialwald ein Binomialwald.
Überblick:
Operationen | worst case | amortisiert |
Insert | ||
---|---|---|
Merge | ||
FindMin | ||
DecreaseKey | ||
Delete | ||
DeleteMin |
Operationen:x verliert Kind; y= P(x) : (Vater von x) while (y markiert) do entferne y; füge y unmarkiert in die Liste ein; if (P(y)=NIL) then exit fi y= P(y); od markiere y;
while true do füge Liste der Kinder in die Wurzelliste ein; lösche x, x=Vater(x); if Markierung(x)=0 then Markierung(x)=1 exit else hänge x samt Unterbaum in Wurzelliste; entferne Markierung von x da x Wurzel; x = Vater(x); fi od
Man beachte, daß an jedem Knoten, insbesondere jeder Wurzel, der Rang gespeichert ist. Zwar vereinfacht dies die Implementierung, doch müssen noch immer Paare von Wurzeln gleichen Rangs gefunden werden. Dies wird wie folgt realisiert: Wir verwenden ein array, dessen Indizies je für einen Rang stehen. Die Elemente sind Zeiger auf eine Wurzel dieses Rangs. Es ist garantiert, daß ein Element nur dann unbesetzt ist, wenn tatsächlich keine Wurzel entsprechenden Rangs existiert. Nach dem Entfernen des Knoten x aus der Wurzelliste fügen wir die Kinder eines nach dem anderen in die Wurzelliste ein und aktualisiern in jedem Schritt das array. Soll eine bereits besetzte Position des arrays beschrieben werden, so wird ein Link-Schritt ausgeführt und versucht, einen Pointer auf die neue Wurzel in die nächsthöhere Position im array zu schreiben. Dies zieht evtl. weitere Link-Schritte nach sich. Nach Abschluß dieser Operation enthält die Fibonacci-Heap nur verschiedene Bäume. Liegt der kanonische Fall vor, daß ausschließlich Binomialbäume im Spiel sind, so erhalten wir durch DeleteMin -Operation eine Binomial-Queue.Min-Pointer; entferne x aus der Liste; Konkataniere Kinderliste vom x mit der Wurzelliste; while ( Bäume von selben Wurzel-Rang i) do erzeuge Baum vom Wurzel-Rang i+1; od update Min-Pointer;
entferne x; y=P(x); füge x unmittelbar in die Wurzelliste ein; Key(x) := Key(x) - ;while (y markiert) do entferne y; füge y unmarkiert in die Wurzelliste ein; if (P(y)=NILL) then exit fi y=P(y); od markiere y;