www.wikidata.de-de.nina.az
In der Informatik ist ein Fibonacci Heap englisch heap Halde eine Datenstruktur ahnlich einem Binomial Heap die eine Vorrangwarteschlange realisiert Das heisst dass Elemente mit festgelegter Prioritat in beliebiger Reihenfolge effizient im Heap gespeichert werden konnen und stets ein Element mit hochster Prioritat entnommen werden kann Die Prioritat der Elemente wird diesen durch Schlussel aufgepragt Uber der Menge der Schlussel muss daher eine Totalordnung bestehen wie sie zum Beispiel die Kleiner Gleich Relation uber den ganzen Zahlen darstellt Fibonacci Heaps wurden erstmals 1984 von Michael L Fredman und Robert E Tarjan beschrieben Ihr Name ruhrt von der Analyse der Datenstruktur her bei der Fibonacci Zahlen eine grosse Rolle spielen Inhaltsverzeichnis 1 Operationen 2 Laufzeiten 3 Datenstruktur 4 Implementierung 4 1 Operation insert 4 2 Operation merge 4 3 Operation decreaseKey 4 4 Operation extractMin sowie cleanup 4 5 Operation remove 5 Bemerkungen 6 Anwendungen 7 Literatur 8 WeblinksOperationen BearbeitenFibonacci Heaps unterstutzen effizient die Operationen insert zum Einfugen eines Elementes remove oder delete zum Entfernen eines Elementes getMin zum Finden des Elements mit dem minimalen Schlussel extractMin zur Ruckgabe und zum Entfernen eines Elementes mit minimalem Schlussel also hochster Prioritat decreaseKey zum Verringern des Schlussels eines Elementes und merge oder union zum Verschmelzen zweier Heaps Laufzeiten BearbeitenAlle Operationen lassen sich mit einer logarithmischen Worst Case Laufzeit also O log n displaystyle mathcal O log n nbsp implementieren wobei n die Zahl der aktuell im Heap befindlichen Elemente ist Lediglich die Operationen remove extractMin und decreaseKey benotigen im Worst Case lineare Laufzeit also O n displaystyle mathcal O n nbsp Amortisiert sind die Kosten fur fast alle anderen Operationen allerdings konstant das heisst O 1 displaystyle mathcal O 1 nbsp Folglich sind bei amortisierter Laufzeitanalyse Fibonacci Heaps binaren Heaps oder Binomial Heaps bei der Ausfuhrung der Operationen insert und merge uberlegen Allerdings eignen sie sich wegen der schlechten Worst Case Laufzeit von remove extractMin und decreaseKey weniger fur Online Algorithmen bei denen jede einzelne Operation effizient ausgefuhrt werden muss Laufzeiten im Vergleich Operation Lineare Liste Sortierte Liste Min Heap Unbalancierter Binarbaum Fibonacci Heapinsert O 1 displaystyle mathcal O 1 nbsp O n displaystyle mathcal O n nbsp O log n displaystyle mathcal O log n nbsp O log n displaystyle mathcal O log n nbsp O 1 displaystyle mathcal O 1 nbsp getMin O n displaystyle mathcal O n nbsp O 1 displaystyle mathcal O 1 nbsp O 1 displaystyle mathcal O 1 nbsp O 1 displaystyle mathcal O 1 nbsp O 1 displaystyle mathcal O 1 nbsp extractMin O n displaystyle mathcal O n nbsp O 1 displaystyle mathcal O 1 nbsp O log n displaystyle mathcal O log n nbsp O 1 displaystyle mathcal O 1 nbsp O log n displaystyle mathcal O log n nbsp decreaseKey O 1 displaystyle mathcal O 1 nbsp O n displaystyle mathcal O n nbsp O log n displaystyle mathcal O log n nbsp O log n displaystyle mathcal O log n nbsp O 1 displaystyle mathcal O 1 nbsp remove O n displaystyle mathcal O n nbsp O n displaystyle mathcal O n nbsp O log n displaystyle mathcal O log n nbsp O 1 displaystyle mathcal O 1 nbsp O log n displaystyle mathcal O log n nbsp merge O 1 displaystyle mathcal O 1 nbsp O n m displaystyle mathcal O n m nbsp O m log n m displaystyle mathcal O m cdot log n m nbsp O n m displaystyle mathcal O n m nbsp O 1 displaystyle mathcal O 1 nbsp Amortisierte Kosten Bei bekannter Position sonst O log n displaystyle mathcal O log n nbsp Datenstruktur Bearbeiten nbsp Dieser Fibonacci Heap hat drei Baume mit Grad 0 1 und 3 Drei Knoten sind markiert Daher ist das Potential des Heaps gleich 9 3 Baume 2 3 markierte Knoten Ein Fibonacci Heap besteht aus einer Liste von Baumen mit geordneten Nachfolgern deren Knoten Schlussel und moglicherweise eine Markierung enthalten Die durch den Schlussel aufgepragte Prioritat jedes Knotens ist mindestens so gross wie die Prioritat seiner Kinder Dies wird als Heap Bedingung bezeichnet Bei den hier dargestellten Min Heaps ist die grossere Prioritat durch einen kleineren Schlussel dargestellt Sowohl fur die Liste der Baume als auch fur die Listen der Kindknoten in den Knoten der Baume werden zyklische doppelt verkettete Listen verwendet Zusatzlich wird ein Zeiger auf das Element mit der grossten Prioritat also dem kleinsten Schlussel verwaltet Ein Fibonacci Heap wird normalisiert genannt wenn alle Baume unterschiedlichen Wurzelgrad haben d h wenn die Wurzeln der Baume in der Liste alle unterschiedlich viele Kindknoten haben Ein Fibonacci Heap ist eine Sammlung von Baumen die die Minimum Heap Eigenschaft erfullen d h der Schlussel eines Kindes ist immer grosser oder gleich dem Schlussel des Vaters Dies bedeutet dass sich der kleinste Schlussel immer an der Wurzel eines der Baume befindet Im Vergleich zu Binomial Heaps ist die Struktur eines Fibonacci Heap flexibler Die Baume haben keine vorgeschriebene Form und im Extremfall kann der Heap jedes Element in einem getrennten Baum haben Diese Flexibilitat ermoglicht es einige Vorgange verzogert auszufuhren wodurch die Arbeit fur spatere Vorgange verschoben wird Das Zusammenfuhren von Heaps erfolgt beispielsweise einfach durch Verketten der zwei Listen von Baumen und die Operation decreaseKey schneidet manchmal einen Knoten von seinem ubergeordneten Knoten ab und bildet einen neuen Baum Irgendwann muss jedoch eine Reihenfolge in den Heap eingefuhrt werden um die gewunschte Laufzeit zu erreichen Insbesondere wird der Grad der Knoten hier bedeutet Grad die Anzahl der Kinder ziemlich niedrig gehalten Jeder Knoten hat hochstens den Grad O log n displaystyle mathcal O log n nbsp und die Grosse eines Teilbaums der in einem Knoten des Grades k verwurzelt ist betragt mindestens Fk 2 wobei Fk die k te Fibonacci Zahl ist Dies wird durch die Regel erreicht dass wir hochstens ein Kind von jedem Nicht Wurzelknoten abschneiden konnen Wenn ein zweites Kind abgeschnitten wird muss der Knoten selbst von seinem ubergeordneten Knoten abgeschnitten werden und wird zur Wurzel eines neuen Baums Die Anzahl der Baume wird in der Operation extractMin verringert bei der Baume miteinander verknupft werden Aufgrund einer aufgelockerten Struktur konnen einige Operationen lange dauern wahrend andere sehr schnell ausgefuhrt werden Fur die amortisierte Laufzeitanalyse verwenden wir die Potentialmethode indem wir so tun als ob sehr schnelle Vorgange etwas langer dauern als sie tatsachlich sind Diese zusatzliche Zeit wird dann spater kombiniert und von der tatsachlichen Laufzeit langsamer Operationen abgezogen Die fur die spatere Verwendung eingesparte Zeit wird zu jedem Zeitpunkt von einer potenziellen Funktion gemessen Das Potenzial eines Fibonacci Heap ist gegeben durch Potential t 2m Dabei ist t die Anzahl der Baume im Fibonacci Heap und m die Anzahl der markierten Knoten Ein Knoten wird markiert wenn mindestens einer seiner untergeordneten Knoten abgeschnitten wurde da dieser Knoten zu einem untergeordneten Knoten eines anderen Knotens gemacht wurde Alle Wurzeln sind nicht markiert Die amortisierte Laufzeit fur eine Operation ergibt sich aus der Summe der tatsachlichen Zeit und c mal der Potentialdifferenz wobei c eine Konstante ist Somit hat die Wurzel jedes Baums in einem Heap eine Zeiteinheit gespeichert Diese Zeiteinheit kann spater verwendet werden um diesen Baum zum amortisierten Zeitpunkt 0 mit einem anderen Baum zu verknupfen Ausserdem sind in jedem markierten Knoten zwei Zeiteinheiten gespeichert Man kann den Knoten von seinem ubergeordneten Knoten abschneiden In diesem Fall wird der Knoten zu einer Wurzel und die zweite Zeiteinheit bleibt wie in jeder anderen Wurzel darin gespeichert Implementierung BearbeitenOperation insert Bearbeiten Beim Einfugen eines Elementes mittels insert wird dieses einfach als eigener Baum in die Liste der Baume eingefugt und gegebenenfalls der Zeiger auf das minimale Element aktualisiert wenn der Schlussel des eingefugten Elementes kleiner als der des bisherigen minimalen Elementes ist Die Laufzeit ist folglich konstant O 1 displaystyle mathcal O 1 nbsp Operation merge Bearbeiten Ahnlich einfach gestaltet sich das Verschmelzen zweier Heaps mittels merge Hier werden die Listen der zu verschmelzenden Baume einfach verkettet und der Zeiger auf das minimale Element gegebenenfalls umgesetzt wenn der Schlussel des minimalen Elementes des hinzugefugten Heaps kleiner als der des bisherigen minimalen Elementes ist Die Laufzeit ist wieder konstant O 1 displaystyle mathcal O 1 nbsp Operation decreaseKey Bearbeiten nbsp Fibonacci Heap nach Verringern des Schlussels von Knoten 9 auf 0 Dieser Knoten sowie seine beiden markierten Vorfahren werden aus dem Baum mit Wurzel 1 herausgeschnitten und als neue Wurzeln platziert Auch die Operation decreaseKey wird in einem Fibonacci Heap recht faul durchgefuhrt Der Schlussel des zu aktualisierenden Elementes wird zuerst auf den neuen Wert gesetzt Nun kann es sein dass die Heap Eigenschaft d h alle Kinder sind grosser als der Vater nicht mehr erfullt ist Um diese wiederherzustellen loscht man das aktualisierte Element aus der Kindliste seines Vaterknotens und fugt ihn als eigenen Baum in die Liste der Baume ein Um zu vermeiden dass durch solche Operationen der Heap zu sehr in die Breite wachst denn dann wurde extractMin sehr lange dauern stellt man nun die Bedingung dass von jedem Knoten nur ein Kindknoten weggenommen werden darf ansonsten muss der Knoten selbst aus der Kindliste seines Vaterknotens entfernt werden Prozedur Cut usw Um dies zu realisieren tritt nun die oben erwahnte Markierung eines Knotens in Erscheinung ein Knoten ist genau dann markiert wenn er kein Knoten der Wurzelliste ist und ein Kind aus seiner Kindliste entfernt wurde Wird nun ein Kind entfernt dessen Vater markiert war ruft man die Prozedur Cut rekursiv auf den Vater auf Es zeigt sich nach reiflicher mathematischer Analyse dass die Anzahl an Knoten in einem Baum des Grades k displaystyle k nbsp d h die Wurzel des Baumes hat k displaystyle k nbsp Kinder dann durch die k 2 displaystyle k 2 nbsp te Fibonacci Zahl F k 2 f k displaystyle F k 2 geq varphi k nbsp nach unten beschrankt ist wobei f displaystyle varphi nbsp der goldene Schnitt 1 5 2 displaystyle frac 1 sqrt 5 2 nbsp ist Dies ist fur die Funktion extractMin von enormer Wichtigkeit Operation extractMin sowie cleanup Bearbeiten nbsp Der Knoten mit dem minimalen Schlussel 1 wurde geloscht und seine untergeordneten Elemente wurden als getrennte Baume hinzugefugt nbsp Fibonacci Heap nach Abschluss der Operation extractMin Zunachst werden die Knoten 3 und 6 miteinander verbunden Dann wird das Ergebnis mit dem Baum mit der Wurzel 2 verknupft Nun zu der zentralen Funktion extractMin Der Anfang dieser Funktion gestaltet sich recht einfach Das minimale Element auf das ja ein Zeiger zeigt wird ausgegeben all seine Kinder werden als einzelne Baume zur Wurzelliste hinzugefugt und das Element selbst wird aus dem Heap entfernt Nun muss ein neues Minimum bestimmt werden Da aber keine der bisherigen Funktionen den Heap in die Tiefe wachsen lasst wurde dies eine lineare Zeit dauern Daher wird der Heap vorher mit der Prozedur cleanup aufgeraumt Danach werden alle Elemente der Wurzelliste durchgegangen um ein neues Minimum zu finden Die Prozedur cleanup Hierfur wird zuerst ein Array A displaystyle A nbsp von 0 displaystyle 0 nbsp bis 2 log n displaystyle 2 cdot log n nbsp initialisiert In diesem soll nach dem cleanup an Stelle d displaystyle d nbsp ein Zeiger auf einen Baum stehen wenn in der Wurzelliste ein Element mit Grad d displaystyle d nbsp existiert Es werden also alle Elemente der Wurzelliste in dieses Array eingeordnet Kommt es dabei zu einer Uberschneidung wenn zwei Elemente den gleichen Grad haben so wird das Element mit dem kleineren Schlussel zum Vater des anderen gemacht der Grad desselben wird erhoht und es wird in das Array einsortiert Die obige mathematische Analyse versichert dass hochstens 2 log n displaystyle 2 cdot log n nbsp Elemente im Array stehen Schliesslich muss die neue Wurzelliste aufgebaut werden Dazu werden alle Elemente des Arrays A displaystyle A nbsp durchgegangen und zu einer Liste verschmolzen Die Laufzeit ist also O log n displaystyle mathcal O log n nbsp Operation remove Bearbeiten Das Entfernen eines Elementes aus dem Heap mittels remove erfolgt indem zunachst mit decreaseKey der Schlussel des zu entfernenden Elementes auf einen Wert kleiner als dem des bisherigen Minimums gesetzt wird Dadurch wird dieses Element zum neuen minimalen Element Anschliessend kann es mit extractMin entfernt werden Die Laufzeit von decreaseKey ist konstant die von extractMin betragt O log n displaystyle mathcal O log n nbsp also ergibt sich fur die Operation remove eine Laufzeit von ebenfalls O log n displaystyle mathcal O log n nbsp Bemerkungen BearbeitenDie Operationen remove und decreaseKey setzen voraus dass man die Position der entsprechenden Elemente im Heap kennt Im Allgemeinen ist es namlich nicht moglich effizient ein Element im Heap zu suchen Daher muss die Operation insert einen Zeiger auf den Behalter fur das eingefugte Element zuruckliefern den sich das aufrufende Programm im Bedarfsfall an geeigneter Stelle merkt Anwendungen BearbeitenDer Algorithmus von Dijkstra zum Finden eines kurzesten Pfades beziehungsweise der Algorithmus von Prim zum Finden eines minimal spannenden Baumes in einem Graphen mit n Knoten und m Kanten lassen sich mit Fibonacci Heaps mit der Laufzeit von O n log n m displaystyle mathcal O n cdot log n m nbsp implementieren Mit einem binaren oder binomialen Heap waren hier nur Laufzeiten von O n m log n displaystyle mathcal O n m cdot log n nbsp moglich Literatur BearbeitenMichael L Fredman Robert E Tarjan Fibonacci heaps and their uses in improved network optimization algorithms In Journal of the ACM 34 Jahrgang Nr 3 1987 S 596 615 doi 10 1145 28869 28874 Weblinks BearbeitenGnarley Trees beinhaltet u a Animation als Java Applet auch zu anderen Datenstrukturen Abgerufen von https de wikipedia org w index php title Fibonacci Heap amp oldid 228564004