<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Fibonacci-Heap</id>
	<title>Fibonacci-Heap - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Fibonacci-Heap"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Fibonacci-Heap&amp;action=history"/>
	<updated>2026-05-31T12:39:15Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Fibonacci-Heap&amp;diff=13853&amp;oldid=prev</id>
		<title>imported&gt;Ulanwp: Fehlenden Sprachparameter eingefügt; 1 Datumsparameter konvertiert; 1 Vorlage Toter Link aus Abschnitt Weblinks entfernt, macht dort keinen Sinne mehr</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Fibonacci-Heap&amp;diff=13853&amp;oldid=prev"/>
		<updated>2026-03-06T14:37:34Z</updated>

		<summary type="html">&lt;p&gt;Fehlenden Sprachparameter eingefügt; 1 Datumsparameter konvertiert; 1 Vorlage Toter Link aus Abschnitt Weblinks entfernt, macht dort keinen Sinne mehr&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;In der [[Informatik]] ist ein &amp;#039;&amp;#039;&amp;#039;Fibonacci-Heap&amp;#039;&amp;#039;&amp;#039; ({{EnS|&amp;#039;&amp;#039;heap&amp;#039;&amp;#039;}} ‚Halde‘) eine [[Datenstruktur]], ähnlich einem [[Binomial-Heap]], die eine [[Vorrangwarteschlange]] realisiert. Das heißt, dass Elemente mit festgelegter Priorität in beliebiger Reihenfolge [[Effizienz (Informatik)|effizient]] im [[Heap (Datenstruktur)|Heap]] gespeichert werden können und stets ein Element mit höchster Priorität entnommen werden kann. Die Priorität der Elemente wird diesen durch [[Schlüssel (Informatik)|Schlüssel]] aufgeprägt. Über der Menge der Schlüssel muss daher eine [[Totalordnung]] bestehen, wie sie zum Beispiel die Kleiner-Gleich-Relation (≤) über den [[ganze Zahl|ganzen Zahlen]] darstellt. Fibonacci-Heaps wurden erstmals [[1984]] von [[Michael L. Fredman]] und [[Robert Tarjan|Robert E. Tarjan]] beschrieben. Ihr Name rührt von der Analyse der Datenstruktur her, bei der [[Fibonacci-Folge|Fibonacci-Zahlen]] eine große Rolle spielen.&lt;br /&gt;
&lt;br /&gt;
== Operationen ==&lt;br /&gt;
Fibonacci-Heaps unterstützen effizient die [[Operation (Informatik)|Operationen]]:&lt;br /&gt;
* &amp;#039;&amp;#039;insert&amp;#039;&amp;#039; – zum Einfügen eines Elementes,&lt;br /&gt;
* &amp;#039;&amp;#039;remove&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;delete&amp;#039;&amp;#039; – zum Entfernen eines Elementes,&lt;br /&gt;
* &amp;#039;&amp;#039;getMin&amp;#039;&amp;#039; – zum Finden des Elements mit dem minimalen Schlüssel,&lt;br /&gt;
* &amp;#039;&amp;#039;extractMin&amp;#039;&amp;#039; – zur Rückgabe und zum Entfernen eines Elementes mit minimalem Schlüssel, also höchster Priorität,&lt;br /&gt;
* &amp;#039;&amp;#039;decreaseKey&amp;#039;&amp;#039; – zum Verringern des Schlüssels eines Elementes und&lt;br /&gt;
* &amp;#039;&amp;#039;merge&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;union&amp;#039;&amp;#039; – zum Verschmelzen zweier Heaps.&lt;br /&gt;
&lt;br /&gt;
== Laufzeiten ==&lt;br /&gt;
Alle [[Operation (Informatik)|Operationen]] lassen sich mit einer [[Logarithmus|logarithmischen]] [[Asymptotische Laufzeit|Worst-Case-Laufzeit]], also &amp;lt;math&amp;gt;\mathcal{O}(\log n)&amp;lt;/math&amp;gt;, implementieren, wobei &amp;#039;&amp;#039;n&amp;#039;&amp;#039; die Zahl der aktuell im Heap befindlichen Elemente ist. Lediglich die Operationen &amp;#039;&amp;#039;remove&amp;#039;&amp;#039;, &amp;#039;&amp;#039;extractMin&amp;#039;&amp;#039; und &amp;#039;&amp;#039;decreaseKey&amp;#039;&amp;#039; benötigen im Worst-Case lineare [[Laufzeit (Informatik)|Laufzeit]], also &amp;lt;math&amp;gt;\mathcal{O}(n)&amp;lt;/math&amp;gt;. Amortisiert sind die Kosten für fast alle anderen Operationen allerdings konstant, das heißt &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Folglich sind – bei [[Amortisierte Laufzeitanalyse|amortisierter Laufzeitanalyse]] – Fibonacci-Heaps [[binärer Heap|binären Heaps]] oder [[Binomial-Heap]]s bei der Ausführung der Operationen &amp;#039;&amp;#039;insert&amp;#039;&amp;#039; und &amp;#039;&amp;#039;merge&amp;#039;&amp;#039; überlegen. Allerdings eignen sie sich wegen der schlechten Worst-Case-Laufzeit von &amp;#039;&amp;#039;remove&amp;#039;&amp;#039;, &amp;#039;&amp;#039;extractMin&amp;#039;&amp;#039; und &amp;#039;&amp;#039;decreaseKey&amp;#039;&amp;#039; weniger für [[Online-Algorithmus|Online-Algorithmen]], bei denen jede einzelne Operation effizient ausgeführt werden muss.&lt;br /&gt;
&lt;br /&gt;
[[Laufzeit (Informatik)|Laufzeiten]] im Vergleich:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Operation&lt;br /&gt;
! Lineare Liste&lt;br /&gt;
! Sortierte Liste&lt;br /&gt;
! (Min-)Heap&lt;br /&gt;
! Unbalancierter Binärbaum&lt;br /&gt;
! Fibonacci-Heap&lt;br /&gt;
|-&lt;br /&gt;
| insert&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(\log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(\log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(\log n)&amp;lt;/math&amp;gt;*&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| getMin&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| extractMin&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(\log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(\log n)&amp;lt;/math&amp;gt;*&lt;br /&gt;
|-&lt;br /&gt;
| decreaseKey&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(\log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(\log n)&amp;lt;/math&amp;gt;*&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt;*&lt;br /&gt;
|-&lt;br /&gt;
| remove&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(\log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt;**&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(\log n)&amp;lt;/math&amp;gt;*&lt;br /&gt;
|-&lt;br /&gt;
| merge&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(n + m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(m \cdot \log(n+m))&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(n + m)&amp;lt;/math&amp;gt;&lt;br /&gt;
| &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
(*) Amortisierte Kosten&amp;lt;br /&amp;gt;(**) Bei bekannter Position, sonst &amp;lt;math&amp;gt;\mathcal{O}(\log n)&amp;lt;/math&amp;gt;*&lt;br /&gt;
&lt;br /&gt;
== Datenstruktur ==&lt;br /&gt;
[[Datei:Fibonacci heap.png|mini|250x250px|Dieser Fibonacci-Heap hat drei [[Baum (Graphentheorie)|Bäume]] mit [[Grad (Graphentheorie)|Grad]] 0, 1 und 3. Drei [[Knoten (Graphentheorie)|Knoten]] sind markiert. Daher ist das Potential des [[Heap (Datenstruktur)|Heaps]] gleich 9 (3 Bäume + 2 × 3 markierte Knoten).]]&lt;br /&gt;
Ein Fibonacci-Heap besteht aus einer [[Liste (Datenstruktur)|Liste]] von [[Baum (Graphentheorie)|Bäumen]] mit geordneten Nachfolgern, deren [[Knoten (Graphentheorie)|Knoten]] Schlüssel und möglicherweise eine Markierung enthalten. Die durch den Schlüssel aufgeprägte Priorität jedes Knotens ist mindestens so groß wie die Priorität seiner Kinder. Dies wird als [[Heap (Datenstruktur)#Heap-Bedingung|Heap-Bedingung]] bezeichnet. Bei den hier dargestellten &amp;#039;&amp;#039;Min-Heaps&amp;#039;&amp;#039; ist die größere Priorität durch einen kleineren Schlüssel dargestellt.&lt;br /&gt;
&lt;br /&gt;
Sowohl für die Liste der Bäume als auch für die Listen der Kindknoten in den Knoten der Bäume werden zyklische [[doppelt verkettete Liste]]n verwendet.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich wird ein [[Zeiger (Informatik)|Zeiger]] auf das Element mit der größten Priorität, also dem kleinsten Schlüssel, verwaltet.&lt;br /&gt;
&lt;br /&gt;
Ein Fibonacci-Heap wird &amp;#039;&amp;#039;normalisiert&amp;#039;&amp;#039; genannt, wenn alle [[Baum (Graphentheorie)|Bäume]] unterschiedlichen [[Grad (Graphentheorie)|Wurzelgrad]] haben, d.&amp;amp;nbsp;h. wenn die Wurzeln der Bäume in der Liste alle unterschiedlich viele Kindknoten haben.&lt;br /&gt;
&lt;br /&gt;
Ein Fibonacci-Heap ist eine Sammlung von [[Baum (Graphentheorie)|Bäumen]], die die Minimum-Heap-Eigenschaft erfüllen, d. h. der Schlüssel eines Kindes ist immer größer oder gleich dem Schlüssel des Vaters. Dies bedeutet, dass sich der kleinste Schlüssel immer an der Wurzel eines der Bäume befindet. Im Vergleich zu [[Binomial-Heap]]s ist die Struktur eines Fibonacci-Heap flexibler. Die Bäume haben keine vorgeschriebene Form und im Extremfall kann der [[Heap (Datenstruktur)|Heap]] jedes Element in einem getrennten Baum haben. Diese Flexibilität ermöglicht es, einige Vorgänge verzögert auszuführen, wodurch die Arbeit für spätere Vorgänge verschoben wird. Das Zusammenführen von Heaps erfolgt beispielsweise einfach durch Verketten der zwei [[Liste (Datenstruktur)|Listen]] von Bäumen, und die [[Operation (Informatik)|Operation]] &amp;#039;&amp;#039;decreaseKey&amp;#039;&amp;#039; schneidet manchmal einen [[Knoten (Graphentheorie)|Knoten]] von seinem übergeordneten Knoten ab und bildet einen neuen Baum.&lt;br /&gt;
&lt;br /&gt;
Irgendwann muss jedoch eine Reihenfolge in den Heap eingeführt werden, um die gewünschte [[Laufzeit (Informatik)|Laufzeit]] zu erreichen. Insbesondere wird der [[Grad (Graphentheorie)|Grad]] der [[Knoten (Graphentheorie)|Knoten]] (hier bedeutet Grad die Anzahl der Kinder) ziemlich niedrig gehalten: Jeder Knoten hat höchstens den Grad &amp;lt;math&amp;gt;\mathcal{O}(\log n)&amp;lt;/math&amp;gt; und die Größe eines Teilbaums, der in einem Knoten des Grades k verwurzelt ist, beträgt mindestens &amp;#039;&amp;#039;F&amp;lt;sub&amp;gt;k+2&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039;, wobei &amp;#039;&amp;#039;F&amp;lt;sub&amp;gt;k&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039; die &amp;#039;&amp;#039;k&amp;#039;&amp;#039;-te [[Fibonacci-Zahl]] ist. Dies wird durch die Regel erreicht, dass wir höchstens ein Kind von jedem Nicht-Wurzelknoten abschneiden können. Wenn ein zweites Kind abgeschnitten wird, muss der Knoten selbst von seinem übergeordneten Knoten abgeschnitten werden und wird zur Wurzel eines neuen Baums. Die Anzahl der Bäume wird in der Operation &amp;#039;&amp;#039;extractMin&amp;#039;&amp;#039; verringert, bei der Bäume miteinander verknüpft werden.&lt;br /&gt;
&lt;br /&gt;
Aufgrund einer aufgelockerten Struktur können einige [[Operation (Informatik)|Operationen]] lange dauern, während andere sehr schnell ausgeführt werden. Für die amortisierte Laufzeitanalyse verwenden wir die [[Potentialmethode]], indem wir so tun, als ob sehr schnelle Vorgänge etwas länger dauern als sie tatsächlich sind. Diese zusätzliche Zeit wird dann später kombiniert und von der tatsächlichen [[Laufzeit (Informatik)|Laufzeit]] langsamer Operationen abgezogen. Die für die spätere Verwendung eingesparte Zeit wird zu jedem Zeitpunkt von einer potenziellen Funktion gemessen. Das Potenzial eines Fibonacci-Heap ist gegeben durch &amp;#039;&amp;#039;Potential = t + 2m&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Dabei ist t die Anzahl der [[Baum (Graphentheorie)|Bäume]] im Fibonacci-Heap und &amp;#039;&amp;#039;m&amp;#039;&amp;#039; die Anzahl der markierten [[Knoten (Graphentheorie)|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 (Informatik)|Laufzeit]] für eine Operation ergibt sich aus der Summe der tatsächlichen Zeit und &amp;#039;&amp;#039;c&amp;#039;&amp;#039;-mal der Potentialdifferenz, wobei &amp;#039;&amp;#039;c&amp;#039;&amp;#039; eine Konstante ist.&lt;br /&gt;
&lt;br /&gt;
Somit hat die Wurzel jedes [[Baum (Graphentheorie)|Baums]] in einem Heap eine Zeiteinheit gespeichert. Diese Zeiteinheit kann später verwendet werden, um diesen Baum zum amortisierten Zeitpunkt 0 mit einem anderen Baum zu verknüpfen. Außerdem sind in jedem markierten [[Knoten (Graphentheorie)|Knoten]] zwei Zeiteinheiten gespeichert. Man kann den Knoten von seinem übergeordneten Knoten abschneiden. In diesem Fall wird der Knoten zu einer Wurzel und die zweite Zeiteinheit bleibt wie in jeder anderen Wurzel darin gespeichert.&lt;br /&gt;
&lt;br /&gt;
== Implementierung ==&lt;br /&gt;
=== Operation &amp;#039;&amp;#039;insert&amp;#039;&amp;#039; ===&lt;br /&gt;
Beim Einfügen eines Elementes mittels &amp;#039;&amp;#039;insert&amp;#039;&amp;#039; wird dieses einfach als eigener [[Baum (Graphentheorie)|Baum]] in die [[Liste (Datenstruktur)|Liste]] der Bäume eingefügt und gegebenenfalls der [[Zeiger (Informatik)|Zeiger]] auf das minimale Element aktualisiert, wenn der Schlüssel des eingefügten Elementes kleiner als der des bisherigen minimalen Elementes ist. Die [[Laufzeit (Informatik)|Laufzeit]] ist folglich konstant: &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Operation &amp;#039;&amp;#039;merge&amp;#039;&amp;#039; ===&lt;br /&gt;
Ähnlich einfach gestaltet sich das Verschmelzen zweier [[Heap (Datenstruktur)|Heaps]] mittels &amp;#039;&amp;#039;merge&amp;#039;&amp;#039;. Hier werden die [[Liste (Datenstruktur)|Listen]] der zu verschmelzenden [[Baum (Graphentheorie)|Bäume]] einfach verkettet und der [[Zeiger (Informatik)|Zeiger]] auf das minimale Element gegebenenfalls umgesetzt, wenn der Schlüssel des minimalen Elementes des hinzugefügten Heaps kleiner als der des bisherigen minimalen Elementes ist. Die [[Laufzeit (Informatik)|Laufzeit]] ist wieder konstant: &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Operation &amp;#039;&amp;#039;decreaseKey&amp;#039;&amp;#039; ===&lt;br /&gt;
[[Datei:Fibonacci heap-decreasekey.png|mini|250x250px|Fibonacci-Heap nach Verringern des Schlüssels von [[Knoten (Graphentheorie)|Knoten]] 9 auf 0. Dieser Knoten sowie seine beiden markierten Vorfahren werden aus dem [[Baum (Graphentheorie)|Baum]] mit Wurzel 1 herausgeschnitten und als neue Wurzeln platziert.]]&lt;br /&gt;
Auch die [[Operation (Informatik)|Operation]] &amp;#039;&amp;#039;decreaseKey&amp;#039;&amp;#039; wird in einem Fibonacci-Heap recht faul durchgeführt: Der Schlüssel des zu aktualisierenden Elementes wird zuerst auf den neuen Wert gesetzt. Nun kann es sein, dass die Heap-Eigenschaft, d. h. alle Kinder sind größer als der Vater, nicht mehr erfüllt ist. Um diese wiederherzustellen, löscht man das aktualisierte Element aus der Kindliste seines Vaterknotens und fügt ihn als eigenen [[Baum (Graphentheorie)|Baum]] in die [[Liste (Datenstruktur)|Liste]] der Bäume ein.&lt;br /&gt;
&lt;br /&gt;
Um zu vermeiden, dass durch solche [[Operation (Informatik)|Operationen]] der [[Heap (Datenstruktur)|Heap]] zu sehr in die Breite wächst, denn dann würde &amp;#039;&amp;#039;extractMin&amp;#039;&amp;#039; sehr lange dauern, stellt man nun die Bedingung, dass von jedem [[Knoten (Graphentheorie)|Knoten]] nur ein Kindknoten weggenommen werden darf, ansonsten muss der Knoten selbst aus der Kindliste seines Vaterknotens entfernt werden (Prozedur &amp;#039;&amp;#039;Cut&amp;#039;&amp;#039;) usw. Um dies zu realisieren, tritt nun die oben erwähnte 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 &amp;#039;&amp;#039;Cut&amp;#039;&amp;#039; rekursiv auf den Vater auf. Es zeigt sich nach reiflicher mathematischer Analyse, dass die Anzahl an Knoten in einem [[Baum (Graphentheorie)|Baum]] des [[Grad (Graphentheorie)|Grades]] &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt;, d. h. die Wurzel des Baumes hat &amp;lt;math&amp;gt;k&amp;lt;/math&amp;gt; Kinder, dann durch die &amp;lt;math&amp;gt;(k+2)&amp;lt;/math&amp;gt;-te [[Fibonacci-Zahl]] &amp;lt;math&amp;gt;F_{k+2} \geq \varphi^k&amp;lt;/math&amp;gt; nach unten beschränkt ist, wobei &amp;lt;math&amp;gt;\varphi&amp;lt;/math&amp;gt; der [[Goldener Schnitt|goldene Schnitt]] &amp;lt;math&amp;gt;\frac{1+\sqrt{5}}{2}&amp;lt;/math&amp;gt; ist. Dies ist für die [[Funktion (Programmierung)|Funktion]] &amp;#039;&amp;#039;extractMin&amp;#039;&amp;#039; von enormer Wichtigkeit.&lt;br /&gt;
&lt;br /&gt;
=== Operation &amp;#039;&amp;#039;extractMin&amp;#039;&amp;#039; sowie &amp;#039;&amp;#039;cleanup&amp;#039;&amp;#039; ===&lt;br /&gt;
[[Datei:Fibonacci heap extractmin1.png|mini|170x170px|Der [[Knoten (Graphentheorie)|Knoten]] mit dem minimalen Schlüssel 1 wurde gelöscht und seine untergeordneten Elemente wurden als getrennte [[Baum (Graphentheorie)|Bäume]] hinzugefügt.]]&lt;br /&gt;
[[Datei:Fibonacci heap extractmin2.png|mini|140x140px|Fibonacci-Heap nach Abschluss der [[Operation (Informatik)|Operation]] &amp;#039;&amp;#039;extractMin&amp;#039;&amp;#039;. Zunächst werden die [[Knoten (Graphentheorie)|Knoten]] 3 und 6 miteinander verbunden. Dann wird das Ergebnis mit dem [[Baum (Graphentheorie)|Baum]] mit der Wurzel 2 verknüpft.]]&lt;br /&gt;
Nun zu der zentralen [[Funktion (Programmierung)|Funktion]]: &amp;#039;&amp;#039;extractMin&amp;#039;&amp;#039;. Der Anfang dieser Funktion gestaltet sich recht einfach: Das minimale Element, auf das ja ein [[Zeiger (Informatik)|Zeiger]] zeigt, wird ausgegeben, all seine Kinder werden als einzelne [[Baum (Graphentheorie)|Bäume]] zur Wurzelliste hinzugefügt und das Element selbst wird aus dem [[Heap (Datenstruktur)|Heap]] entfernt. Nun muss ein neues Minimum bestimmt werden. Da aber keine der bisherigen Funktionen den Heap in die Tiefe wachsen lässt, würde dies eine lineare Zeit dauern. Daher wird der Heap vorher mit der Prozedur &amp;#039;&amp;#039;cleanup&amp;#039;&amp;#039; „aufgeräumt“. Danach werden alle Elemente der Wurzelliste durchgegangen, um ein neues Minimum zu finden.&lt;br /&gt;
&lt;br /&gt;
Die Prozedur &amp;#039;&amp;#039;cleanup&amp;#039;&amp;#039;: Hierfür wird zuerst ein [[Feld (Datentyp)|Array]] &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; von &amp;lt;math&amp;gt;0&amp;lt;/math&amp;gt; bis &amp;lt;math&amp;gt;2 \cdot \log n&amp;lt;/math&amp;gt; initialisiert. In diesem soll nach dem &amp;#039;&amp;#039;cleanup&amp;#039;&amp;#039; an Stelle &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; ein [[Zeiger (Informatik)|Zeiger]] auf einen [[Baum (Graphentheorie)|Baum]] stehen, wenn in der Wurzelliste ein Element mit [[Grad (Graphentheorie)|Grad]] &amp;lt;math&amp;gt;d&amp;lt;/math&amp;gt; existiert. Es werden also alle Elemente der Wurzelliste in dieses Array eingeordnet. Kommt es dabei zu einer Überschneidung, wenn zwei Elemente den gleichen Grad haben, so wird das Element mit dem kleineren Schlüssel zum Vater des anderen gemacht, der Grad desselben wird erhöht und es wird in das Array einsortiert. Die obige mathematische Analyse versichert, dass höchstens &amp;lt;math&amp;gt;2 \cdot \log n&amp;lt;/math&amp;gt; Elemente im Array stehen. Schließlich muss die neue Wurzelliste aufgebaut werden. Dazu werden alle Elemente des Arrays &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; durchgegangen und zu einer Liste verschmolzen. Die Laufzeit ist also &amp;lt;math&amp;gt;\mathcal{O}(\log n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Operation &amp;#039;&amp;#039;remove&amp;#039;&amp;#039; ===&lt;br /&gt;
Das Entfernen eines Elementes aus dem [[Heap (Datenstruktur)|Heap]] mittels &amp;#039;&amp;#039;remove&amp;#039;&amp;#039; erfolgt, indem zunächst mit &amp;#039;&amp;#039;decreaseKey&amp;#039;&amp;#039; der Schlüssel des zu entfernenden Elementes auf einen Wert kleiner als dem des bisherigen Minimums gesetzt wird. Dadurch wird dieses Element zum neuen minimalen Element. Anschließend kann es mit &amp;#039;&amp;#039;extractMin&amp;#039;&amp;#039; entfernt werden. Die Laufzeit von &amp;#039;&amp;#039;decreaseKey&amp;#039;&amp;#039; ist konstant, die von &amp;#039;&amp;#039;extractMin&amp;#039;&amp;#039; beträgt &amp;lt;math&amp;gt;\mathcal{O}(\log n)&amp;lt;/math&amp;gt;, also ergibt sich für die [[Operation (Informatik)|Operation]] &amp;#039;&amp;#039;remove&amp;#039;&amp;#039; eine [[Laufzeit (Informatik)|Laufzeit]] von ebenfalls  &amp;lt;math&amp;gt;\mathcal{O}(\log n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Bemerkungen ==&lt;br /&gt;
Die [[Operation (Informatik)|Operationen]] &amp;#039;&amp;#039;remove&amp;#039;&amp;#039; und &amp;#039;&amp;#039;decreaseKey&amp;#039;&amp;#039; setzen voraus, dass man die Position der entsprechenden Elemente im [[Heap (Datenstruktur)|Heap]] kennt. Im Allgemeinen ist es nämlich nicht möglich, effizient ein Element im Heap zu suchen. Daher muss die Operation &amp;#039;&amp;#039;insert&amp;#039;&amp;#039; einen [[Zeiger (Informatik)|Zeiger]] auf den Behälter für das eingefügte Element zurückliefern, den sich das aufrufende Programm im Bedarfsfall an geeigneter Stelle merkt.&lt;br /&gt;
&lt;br /&gt;
== Anwendungen ==&lt;br /&gt;
Der [[Algorithmus von Dijkstra]] zum Finden eines [[Kürzester Pfad|kürzesten Pfades]] beziehungsweise der [[Algorithmus von Prim]] zum Finden eines [[minimal spannender Baum|minimal spannenden Baumes]] in einem [[Graph (Graphentheorie)|Graphen]]  mit &amp;#039;&amp;#039;n&amp;#039;&amp;#039; [[Knoten (Graphentheorie)|Knoten]] und &amp;#039;&amp;#039;m&amp;#039;&amp;#039; [[Kante (Graphentheorie)|Kanten]] lassen sich mit Fibonacci-Heaps mit der [[asymptotische Laufzeit|Laufzeit]] von &amp;lt;math&amp;gt;\mathcal{O}(n \cdot\log (n) + m)&amp;lt;/math&amp;gt; implementieren. Mit einem [[binärer Heap|binären]] oder [[Binomial-Heap|binomialen Heap]] wären hier nur Laufzeiten von &amp;lt;math&amp;gt;\mathcal{O}((n + m)\cdot \log (n))&amp;lt;/math&amp;gt; möglich.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* {{cite journal |first1=Michael L. |last1=Fredman |first2=Robert E. |last2=Tarjan |date=1987 |title=Fibonacci heaps and their uses in improved network optimization algorithms |journal=[[Journal of the ACM]] |volume=34 |issue=3 |pages=596–615 |doi=10.1145/28869.28874 |language=en}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Datenstruktur]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Ulanwp</name></author>
	</entry>
</feed>