<?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=Heap_%28Datenstruktur%29</id>
	<title>Heap (Datenstruktur) - 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=Heap_%28Datenstruktur%29"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Heap_(Datenstruktur)&amp;action=history"/>
	<updated>2026-06-12T08:31:16Z</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=Heap_(Datenstruktur)&amp;diff=24059&amp;oldid=prev</id>
		<title>imported&gt;Carolus requiescat: Die letzte Textänderung von ~2025-44603-5 wurde verworfen und die Version 258088686 von Trelrokx wiederhergestellt. Wer ist denn wir? Bitte neutral und objektiv formulieren</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Heap_(Datenstruktur)&amp;diff=24059&amp;oldid=prev"/>
		<updated>2025-09-12T13:36:37Z</updated>

		<summary type="html">&lt;p&gt;Die letzte Textänderung von &lt;a href=&quot;/index.php/Spezial:Beitr%C3%A4ge/~2025-44603-5&quot; title=&quot;Spezial:Beiträge/~2025-44603-5&quot;&gt;~2025-44603-5&lt;/a&gt; wurde verworfen und die Version &lt;a href=&quot;/index.php/Spezial:Permanenter_Link/258088686&quot; title=&quot;Spezial:Permanenter Link/258088686&quot;&gt;258088686&lt;/a&gt; von Trelrokx wiederhergestellt. Wer ist denn wir? Bitte neutral und objektiv formulieren&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Redundanztext&lt;br /&gt;
|3=Binärer Heap&lt;br /&gt;
|4=Heap (Datenstruktur)&lt;br /&gt;
|2=Mai 2025|1=[[Spezial:Beiträge/141.30.244.84|141.30.244.84]] 00:43, 13. Mai 2025 (CEST)}}&lt;br /&gt;
[[Datei:Min-heap-1.svg|mini|hochkant=1.7|Beispiel eines Min-Heaps]]&lt;br /&gt;
Ein &amp;#039;&amp;#039;&amp;#039;{{lang|en|Heap}}&amp;#039;&amp;#039;&amp;#039; (englisch wörtlich: &amp;#039;&amp;#039;Haufen&amp;#039;&amp;#039; oder &amp;#039;&amp;#039;Halde&amp;#039;&amp;#039;) in der [[Informatik]] ist eine zumeist auf [[Baum (Graphentheorie)|Bäumen]] basierende [[Abstrakter Datentyp|abstrakte]] [[Datenstruktur]]. In einem Heap können Objekte oder Elemente abgelegt und aus diesem wieder entnommen werden. Sie dienen damit der Speicherung von [[Menge (Mathematik)|Mengen]]. Den Elementen ist dabei ein [[Nummerung|Schlüssel]] zugeordnet, der die Priorität der Elemente festlegt. Häufig werden auch die Elemente selbst als Schlüssel verwendet.&lt;br /&gt;
&lt;br /&gt;
Über die Menge der Schlüssel muss daher eine totale [[Ordnungsrelation|Ordnung]] festgelegt sein, über welche die Reihenfolge der eingefügten Elemente festgelegt wird. Beispielsweise könnte die Menge der [[Ganze Zahl|ganzen Zahlen]] zusammen mit dem [[Vergleichsoperator]] &amp;lt; als Schlüsselmenge fungieren.&lt;br /&gt;
&lt;br /&gt;
Der Begriff Heap wird häufig als bedeutungsgleich zu einem [[Binärbaum#Partiell geordneter Baum|partiell geordneten Baum]] verstanden (siehe Abbildung). Gelegentlich versteht man einschränkend nur eine besondere Implementierungsform eines partiell geordneten Baums, nämlich die Einbettung in ein [[Feld (Datentyp)|Feld]] (Array), als Heap.&lt;br /&gt;
&lt;br /&gt;
Verwendung finden Heaps vor allem dort, wo es darauf ankommt, schnell ein Element mit höchster Priorität aus dem Heap zu entnehmen ([[Highest In – First Out|HIFO-Prinzip]]), beispielsweise bei [[Vorrangwarteschlange]]n.&lt;br /&gt;
&lt;br /&gt;
== Operationen ==&lt;br /&gt;
Je nach Art unterstützen Heaps eine ganze Reihe von [[Operation (Informatik)|Operationen]]. Die wichtigsten Operationen sind:&lt;br /&gt;
&lt;br /&gt;
=== Heapify ===&lt;br /&gt;
Heapify ist eine Operation, um die Elemente des Heaps neu anzuordnen, um die Heap-Bedingung aufrechtzuerhalten. Sie erfolgt, wenn ein bestimmter Knoten ein Ungleichgewicht im Heap verursacht. Die Heapify kann in zwei Methoden erfolgen:&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Up-Heapify&amp;#039;&amp;#039; folgt dem Bottom-Up-Ansatz. In diesem Fall wird geprüft, ob die Knoten die Heap-Bedingung erfüllen, indem man in Richtung der Wurzel geht, und wenn Knoten nicht die Heap-Bedingung erfüllen, werden bestimmte Operationen ausgeführt, damit der Baum der Heap-Bedingung folgt.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Down-Heapify&amp;#039;&amp;#039; folgt dem Top-Down-Ansatz. In diesem Fall wird geprüft, ob die Knoten die Heap-Bedingung erfüllen, indem man in Richtung der Blätter geht, und bestimmte Operationen ausführt, um die Heap-Bedingung herzustellen.&lt;br /&gt;
&lt;br /&gt;
=== Insert ===&lt;br /&gt;
Das Einfügen eines Elements in den Heap erfolgt, indem das neue Element an das Ende des Heaps gesetzt wird. Weil das neu eingesetzte Element die Eigenschaften des Heaps verzerren kann, wird die Operation &amp;#039;&amp;#039;Up-Heapify&amp;#039;&amp;#039; durchgeführt, um die Eigenschaften des Heaps in einem Bottom-up-Ansatz zu erhalten.&lt;br /&gt;
&lt;br /&gt;
=== Remove ===&lt;br /&gt;
Das Entfernen eines Elements erfolgt, indem das gelöschte Element durch das letzte Element im Heap ersetzt wird. Dann wird das letzte Element aus dem Heap gelöscht. Nun wird das letzte Element an einer Stelle im Heap platziert. Es kann die Heap-Bedingung nicht erfüllen, sodass die Operation &amp;#039;&amp;#039;Down-Heapify&amp;#039;&amp;#039; durchgeführt wird, um die Eigenschaften des Heaps aufrechtzuerhalten.&lt;br /&gt;
&lt;br /&gt;
=== Find-max oder Find-min ===&lt;br /&gt;
Das maximale Element im Max-Heap und das minimale Element im Min-Heap ist die Wurzel des Heaps.&lt;br /&gt;
&lt;br /&gt;
=== Extract Min oder Extract Max ===&lt;br /&gt;
Diese Operation gibt das maximale Element im Max-Heap oder das minimale Element im Min-Heap zurück. Dieses Element ist die Wurzel des Heaps.&lt;br /&gt;
&lt;br /&gt;
Daneben werden häufig auch die [[Operation (Informatik)|Operationen]] &amp;#039;&amp;#039;changeKey&amp;#039;&amp;#039; zum Anpassen des Schlüssels und &amp;#039;&amp;#039;merge&amp;#039;&amp;#039; zum Verschmelzen zweier Heaps bereitgestellt. Die Operation &amp;#039;&amp;#039;changeKey&amp;#039;&amp;#039; wird häufig durch die Nacheinanderausführung der Operationen &amp;#039;&amp;#039;remove&amp;#039;&amp;#039; und &amp;#039;&amp;#039;insert&amp;#039;&amp;#039; gebildet, wobei nach dem Entfernen und vor dem erneuten Einfügen der Schlüssel angepasst wird. In einigen Fällen bieten Heaps statt &amp;#039;&amp;#039;changeKey&amp;#039;&amp;#039; lediglich die Operation &amp;#039;&amp;#039;decreaseKey&amp;#039;&amp;#039; an, bei der der Schlüssel lediglich verkleinert werden darf.&lt;br /&gt;
&lt;br /&gt;
== Heap-Bedingung ==&lt;br /&gt;
Man unterscheidet Heaps in Min-Heaps und Max-Heaps. Bei &amp;#039;&amp;#039;Min-Heaps&amp;#039;&amp;#039; bezeichnet man die Eigenschaft, dass die Schlüssel der Kinder eines Knotens stets größer als oder gleich dem Schlüssel ihres Elternknoten sind, als &amp;#039;&amp;#039;Heap-Bedingung&amp;#039;&amp;#039;. Dies bewirkt, dass an der Wurzel des Baumes stets ein Element mit minimalem Schlüssel im Baum zu finden ist. Umgekehrt verlangt die Heap-Bedingung bei &amp;#039;&amp;#039;Max-Heaps&amp;#039;&amp;#039;, dass die Schlüssel der Kinder eines Knotens stets kleiner als oder gleich die ihres Elternknoten sind. Hier befindet sich an der Wurzel des Baumes immer ein Element mit maximalem Schlüssel.&lt;br /&gt;
&lt;br /&gt;
Mathematisch besteht der Unterschied zwischen beiden Varianten nur in ihrer gegensätzlichen [[Ordnungsrelation|Ordnung]] der Elemente. Da die Definition von &amp;#039;&amp;#039;auf-&amp;#039;&amp;#039; und &amp;#039;&amp;#039;absteigend&amp;#039;&amp;#039; rein willkürlich ist, ist es also eine Auslegungsfrage, ob es sich bei einer konkreten Implementierung um einen Min-Heap oder um einen Max-Heap handelt.&lt;br /&gt;
&lt;br /&gt;
Oft kommt es auch vor, dass ein Heap die Heap-Eigenschaft in beiden Richtungen abbilden soll. In diesem Fall werden einfach zwei Heaps geschaffen, wobei der eine nach der Kleiner- und der andere nach der Größer-Relation anordnet. Eine derartige Datenstruktur wird dann &amp;#039;&amp;#039;&amp;#039;Doppelheap&amp;#039;&amp;#039;&amp;#039; oder kurz &amp;#039;&amp;#039;&amp;#039;Deap&amp;#039;&amp;#039;&amp;#039; genannt.&lt;br /&gt;
&lt;br /&gt;
Bei der Verwendung von Doppel-Heaps ist zu beachten, dass nicht jede Implementierung von Heaps dabei ihr Laufzeitverhalten für die einzelnen Operationen behält. Zum Beispiel unterstützen [[Fibonacci-Heap]]s nur ein &amp;#039;&amp;#039;decreaseKey&amp;#039;&amp;#039; zum Verringern der Schlüssel mit amortisiert konstanter [[Laufzeit (Informatik)|Laufzeit]]. Ein allgemeineres &amp;#039;&amp;#039;changeKey&amp;#039;&amp;#039; zum Ändern des Schlüssels, welches man im Falle eines derartigen Doppel-Heaps benötigen würde, braucht aber amortisiert mindestens logarithmische Laufzeit.&lt;br /&gt;
&lt;br /&gt;
Eine Variante von Heaps, die die Heap-Bedingung nur eingeschränkt bzw. in abgewandelter Form unterstützt, sind sogenannte [[Min-Max-Heap]]s. Dabei handelt es sich um Doppel-Heaps, die durch die abgewandelte Form der Heap-Bedingung die Daten in nur einem Baum halten können.&lt;br /&gt;
&lt;br /&gt;
== Implementierung ==&lt;br /&gt;
[[Datei:Heap-as-array.svg|mini|Beispiel eines vollständigen binären Max-Heaps, der in einem [[Feld (Datentyp)|Feld]] (Array) gespeichert wird.]]&lt;br /&gt;
Heaps werden normalerweise mit einer impliziten Heap-Datenstruktur implementiert, bei der es sich um eine implizite [[Datenstruktur]] handelt, die aus einem [[Feld (Datentyp)|Feld]] (Array) fester Größe oder einem dynamischen Array besteht, wobei jedes Element den Knoten eines Baums darstellt, dessen Eltern-Kind-Relation implizit durch seinen Index definiert wird. Nachdem ein Element in einen Heap eingefügt oder aus einem Heap gelöscht wurde, kann die Heap-Eigenschaft verletzt werden und der Heap muss durch Austauschen von Elementen innerhalb des Arrays ausgeglichen werden.&lt;br /&gt;
&lt;br /&gt;
In einer impliziten Heap-Datenstruktur enthält das erste oder letzte Element die [[Wurzel (Graphentheorie)|Wurzel]]. Die nächsten beiden Elemente des Arrays enthalten seine untergeordneten Elemente. Die nächsten vier Elemente enthalten die vier Kinder der beiden Kindknoten usw. Somit würden sich die Kinder des Knotens an Position n an den Positionen &amp;#039;&amp;#039;2n&amp;#039;&amp;#039; und &amp;#039;&amp;#039;2n + 1&amp;#039;&amp;#039; in einem Array mit Startindex 1 oder an den Positionen &amp;#039;&amp;#039;2n + 1&amp;#039;&amp;#039; und &amp;#039;&amp;#039;2n + 2&amp;#039;&amp;#039; in einem Array mit Startindex 0 befinden. Die Berechnung des Index des übergeordneten Knotens des Elements an Position n ist ebenfalls unkompliziert. Bei einem Array mit Startindex 1 befindet sich das übergeordnete Element an Position &amp;#039;&amp;#039;n / 2&amp;#039;&amp;#039;. Bei einem Array mit Startindex 0 das übergeordnete Element an der Position &amp;#039;&amp;#039;(n - 1) / 2&amp;#039;&amp;#039;. Dies ermöglicht das Durchlaufen des [[Baum (Datenstruktur)|Baums]] durch einfache Indexberechnungen. Das Ausbalancieren eines Heaps erfolgt durch Austauschen von Elementen, die nicht in Ordnung sind. Da wir einen Heap aus einem Array erstellen können, ohne zusätzlichen Speicher zu benötigen, kann [[Heapsort]] verwendet werden, um ein Array [[in-place]] zu sortieren.&lt;br /&gt;
&lt;br /&gt;
Verschiedene Arten von Heaps implementieren die Operationen auf unterschiedliche Weise. Insbesondere erfolgt das Einfügen jedoch häufig durch Hinzufügen des neuen Elements am Ende des Heaps im ersten verfügbaren freien Platz. Dies verstößt im Allgemeinen gegen die Heap-Eigenschaft. Daher werden die Elemente nach oben verschoben, bis die Heap-Eigenschaft wiederhergestellt wurde. In ähnlicher Weise wird das Löschen der [[Wurzel (Graphentheorie)|Wurzel]] durchgeführt, indem die Wurzel entfernt und dann das letzte Element in die Wurzel eingefügt und zum Ausgleich gesiebt wird. Das Ersetzen erfolgt also durch Löschen der Wurzel und Einfügen des neuen Elements in die Wurzel und Durchsieben, wobei ein Aufwärtsschritt im Vergleich zum Absenken des letzten Elements gefolgt vom Aufsteigen des neuen Elements vermieden wird.&lt;br /&gt;
&lt;br /&gt;
== Programmierung ==&lt;br /&gt;
Das folgende Beispiel in der [[Programmiersprache]] [[C++]] zeigt die Implementierung der wichtigsten [[Operation (Informatik)|Operationen]] für einen binären Min-Heap.&amp;lt;ref&amp;gt;GeeksforGeeks: [https://www.geeksforgeeks.org/binary-heap/ Binary Heap]&amp;lt;/ref&amp;gt;&amp;lt;syntaxhighlight lang=&amp;quot;c++&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;iostream&amp;gt;&lt;br /&gt;
&lt;br /&gt;
using namespace std;&lt;br /&gt;
&lt;br /&gt;
void swap(int*, int*); // Hilfsfunktion, die zwei Elemente vertauscht&lt;br /&gt;
&lt;br /&gt;
// Deklariert die Klasse für den Heap&lt;br /&gt;
class MinHeap&lt;br /&gt;
{&lt;br /&gt;
    int* elements_; // Pointer auf das Array für die Elemente des Heap&lt;br /&gt;
    int capacity_; // Maximale Größe des Heap&lt;br /&gt;
    int size_; // Größe, die die Anzahl der Elemente des Heap speichert&lt;br /&gt;
public:&lt;br /&gt;
    MinHeap(int);&lt;br /&gt;
    ~MinHeap();&lt;br /&gt;
    void MinHeapify(int);&lt;br /&gt;
    int getParent(int index) { return (index - 1) / 2; }&lt;br /&gt;
    int getLeftChild(int index) { return 2 * index + 1; }&lt;br /&gt;
    int getRightChild(int index) { return 2 * index + 2; }&lt;br /&gt;
    int extractMinimum();&lt;br /&gt;
    void decreaseKey(int, int);&lt;br /&gt;
    int getMinimumKey() { return elements_[0]; }&lt;br /&gt;
    void deleteKey(int);&lt;br /&gt;
    void insertKey(int);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
MinHeap::MinHeap(int capacity) // Konstruktor&lt;br /&gt;
{&lt;br /&gt;
    size_ = 0;&lt;br /&gt;
    capacity_ = capacity;&lt;br /&gt;
    elements_ = new int[capacity];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
MinHeap::~MinHeap()  // Destruktor&lt;br /&gt;
{&lt;br /&gt;
    delete[] elements_;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Fügt einen neuen Schlüssel ein&lt;br /&gt;
void MinHeap::insertKey(int key)&lt;br /&gt;
{&lt;br /&gt;
    if (size_ == capacity_) // Wenn Kapazität überschritten, Funktion verlassen&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    size_++; // Erhöht die Größe des Heap um 1&lt;br /&gt;
    int index = size_ - 1;&lt;br /&gt;
    elements_[index] = key; // Fügt den Schlüssel am Ende ein&lt;br /&gt;
    // Der eingefügte Schlüssel wird so lange nach oben geschoben, wie das übergeordnete Element kleiner ist. Damit wird sichergestellt, dass die Heap-Bedingung erfüllt ist.&lt;br /&gt;
    while (index != 0 &amp;amp;&amp;amp; elements_[getParent(index)] &amp;gt; elements_[index]) // Wenn das Elternelement größer als der Schlüssel ist, werden die Elemente vertauscht.&lt;br /&gt;
    {&lt;br /&gt;
        swap(&amp;amp;elements_[index], &amp;amp;elements_[getParent(index)]);&lt;br /&gt;
        index = getParent(index); // Aktualisiert den Index des Schlüssels&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Verringert den Wert des Schlüssels mit dem gegebenen Index&lt;br /&gt;
void MinHeap::decreaseKey(int index, int value)&lt;br /&gt;
{&lt;br /&gt;
    if (value &amp;gt;= elements_[index]) // Wenn der neue Wert nicht kleiner als der aktuelle Wert ist, Funktion verlassen&lt;br /&gt;
    {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    elements_[index] = value;&lt;br /&gt;
    while (index != 0 &amp;amp;&amp;amp; elements_[getParent(index)] &amp;gt; elements_[index])&lt;br /&gt;
    {&lt;br /&gt;
        swap(&amp;amp;elements_[index], &amp;amp;elements_[getParent(index)]);&lt;br /&gt;
        index = getParent(index);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Entfernt das minimale Element vom Heap&lt;br /&gt;
int MinHeap::extractMinimum()&lt;br /&gt;
{&lt;br /&gt;
    if (size_ &amp;lt;= 0)&lt;br /&gt;
    {&lt;br /&gt;
        return INT_MAX;&lt;br /&gt;
    }&lt;br /&gt;
    if (size_ == 1)&lt;br /&gt;
    {&lt;br /&gt;
        size_--;&lt;br /&gt;
        return elements_[0];&lt;br /&gt;
    }&lt;br /&gt;
    // Speichert den minimalen Wert und entfernt ihn vom Heap&lt;br /&gt;
    int root = elements_[0];&lt;br /&gt;
    elements_[0] = elements_[size_ - 1];&lt;br /&gt;
    size_--;&lt;br /&gt;
    MinHeapify(0);&lt;br /&gt;
    return root;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Löscht den Schlüssel mit dem gegebenen Index&lt;br /&gt;
void MinHeap::deleteKey(int index)&lt;br /&gt;
{&lt;br /&gt;
    decreaseKey(index, INT_MIN); // Setzt den Wert auf minus unendlich&lt;br /&gt;
    extractMinimum();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Rekursive Methode, die die Heap-Bedingung für den Teilbaum mit dem gegebenen Index herstellt. Es wird vorausgesetzt, dass die Teilbäume die Heap-Bedingung schon erfüllen.&lt;br /&gt;
void MinHeap::MinHeapify(int index)&lt;br /&gt;
{&lt;br /&gt;
    int leftChild = getLeftChild(index);&lt;br /&gt;
    int rightChild = getRightChild(index);&lt;br /&gt;
    int rightIndex = index;&lt;br /&gt;
    if (leftChild &amp;lt; size_ &amp;amp;&amp;amp; elements_[leftChild] &amp;lt; elements_[index])&lt;br /&gt;
    {&lt;br /&gt;
        rightIndex = leftChild;&lt;br /&gt;
    }&lt;br /&gt;
    if (rightChild &amp;lt; size_ &amp;amp;&amp;amp; elements_[rightChild] &amp;lt; elements_[rightIndex])&lt;br /&gt;
    {&lt;br /&gt;
        rightIndex = rightChild;&lt;br /&gt;
    }&lt;br /&gt;
    if (rightIndex != index)&lt;br /&gt;
    {&lt;br /&gt;
        swap(&amp;amp;elements_[index], &amp;amp;elements_[rightIndex]); // Vertauscht das Wurzel-Element mit dem Wurzel-Element des rechten Teilbaums&lt;br /&gt;
        MinHeapify(rightIndex); // Aufruf der rekursiven Methode für den rechten Teilbaum&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Vertauscht zwei Elemente des Heap&lt;br /&gt;
void swap(int* element1, int* element2)&lt;br /&gt;
{&lt;br /&gt;
    int element = *element1;&lt;br /&gt;
    *element1 = *element2;&lt;br /&gt;
    *element2 = element;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Varianten von Heaps ==&lt;br /&gt;
Es existieren zahlreiche Arten von Heaps mit unterschiedlich gutem [[Asymptotische Laufzeit|Laufzeitverhalten]] für die verschiedenen [[Operation (Informatik)|Operationen]], die sie zur Verfügung stellen. Beispiele für Heaps sind:&lt;br /&gt;
&lt;br /&gt;
=== Binärer Heap ===&lt;br /&gt;
Ein [[binärer Heap]] kann effizient mit linearem Zeitaufwand in [[Landau-Notation|&amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;]] konstruiert werden, wobei &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; die Anzahl der Elemente aus der Eingabe bezeichnet. Folgende Operationen arbeiten auf einem Heap und haben eine [[Asymptotische Laufzeit|Worst-Case-Laufzeit]] von &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt;:&lt;br /&gt;
* &amp;#039;&amp;#039;insert&amp;#039;&amp;#039; – fügt ein neues Element in den Heap ein&lt;br /&gt;
* &amp;#039;&amp;#039;remove&amp;#039;&amp;#039; – entfernt ein Element&lt;br /&gt;
* &amp;#039;&amp;#039;extractMin&amp;#039;&amp;#039; – extrahiert das Element mit dem kleinsten Schlüssel&lt;br /&gt;
* &amp;#039;&amp;#039;decreaseKey&amp;#039;&amp;#039; – verringert den Schlüsselwert eines Elements&lt;br /&gt;
Die Operation &amp;#039;&amp;#039;getMin&amp;#039;&amp;#039; liefert das kleinste Element im Heap zurück und benötigt dafür konstanten Rechenaufwand.&lt;br /&gt;
&lt;br /&gt;
=== Binomial-Heap ===&lt;br /&gt;
[[Binomial-Heap|Binomial-Heaps]] unterstützen effizient die 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; – zum Entfernen eines Elementes,&lt;br /&gt;
* &amp;#039;&amp;#039;extractMin&amp;#039;&amp;#039; – zur Rückgabe und zum Entfernen eines Elementes mit minimalem Schlüssel (=höchster Priorität),&lt;br /&gt;
* &amp;#039;&amp;#039;changeKey&amp;#039;&amp;#039; – zum Ändern des Schlüssels eines Elementes und&lt;br /&gt;
* &amp;#039;&amp;#039;merge&amp;#039;&amp;#039; – zum Verschmelzen zweier Heaps.&lt;br /&gt;
Alle Operationen lassen sich mit einer [[Asymptotische Laufzeit|Worst-Case-Laufzeit]] von &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt; implementieren, wobei &amp;#039;&amp;#039;&amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;&amp;#039;&amp;#039; die Zahl der aktuell im Heap befindlichen Elemente ist.&lt;br /&gt;
&lt;br /&gt;
=== Fibonacci-Heap ===&lt;br /&gt;
Ein [[Fibonacci-Heap]] ist ähnlich wie ein [[Binomial-Heap]] in einer [[Vorrangwarteschlange]] realisiert. Das heißt, dass Elemente mit festgelegter Priorität in beliebiger Reihenfolge [[Effizienz (Informatik)|effizient]] im 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 [[Nummerung|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.&lt;br /&gt;
&lt;br /&gt;
Weitere Varianten sind der [[Min-Max-Heap]], der [[Linksbaum]], der [[Treap]] und der [[Radix Heap|Radix-Heap]].&lt;br /&gt;
&lt;br /&gt;
Außerdem gibt es mit [[Soft Heap]]s eine Variante bei der ein besseres Laufzeitverhalten erreicht wird, indem ein bestimmter Anteil der Schlüssel verdorben werden kann. Diese verdorbenen Schlüssel haben nicht mehr ihren ursprünglichen Wert.&lt;br /&gt;
&lt;br /&gt;
== Laufzeitverhalten ==&lt;br /&gt;
Die folgende Tabelle gibt die [[Laufzeit (Informatik)|Laufzeiten]] von verschiedenen Heaps bezüglich ihrer Operationen an.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|- style=&amp;quot;background-color:#e9e9e9&amp;quot; |&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; | Operation&lt;br /&gt;
! [[Binärer Heap]]&lt;br /&gt;
! [[Binomial-Heap]]&lt;br /&gt;
! [[Fibonacci-Heap]]&lt;br /&gt;
!!colspan=&amp;quot;2&amp;quot; | [[Pairing-Heap]]&lt;br /&gt;
! [[Linksbaum]]&lt;br /&gt;
! [[2-3-Heap]]&lt;br /&gt;
|- style=&amp;quot;background-color:#e9e9e9&amp;quot; |&lt;br /&gt;
!&lt;br /&gt;
!&lt;br /&gt;
! amortisiert&lt;br /&gt;
! amortisiert&lt;br /&gt;
! amortisiert !!&lt;br /&gt;
|-&lt;br /&gt;
| extract-min&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}(\log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
|| &amp;lt;math&amp;gt;\mathcal{O}(\log n)&amp;lt;/math&amp;gt; ||&amp;lt;math&amp;gt;\mathcal{O}(\log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| remove&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}(\log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
|| &amp;lt;math&amp;gt;\mathcal{O}(\log n)&amp;lt;/math&amp;gt; ||&amp;lt;math&amp;gt;\mathcal{O}(\log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| insert&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;
|| &amp;lt;math&amp;gt;\mathcal{O}(\log n)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt; vermutet)&lt;br /&gt;
|| &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt; oder &amp;lt;math&amp;gt;\mathcal{O}(\log n)&amp;lt;/math&amp;gt; ||&amp;lt;math&amp;gt;\mathcal{O}(\log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| decrease-key&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;
|| &amp;lt;math&amp;gt;\mathcal{O}(\log n)&amp;lt;/math&amp;gt; (&amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt; vermutet)&lt;br /&gt;
|| &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt; oder &amp;lt;math&amp;gt;\mathcal{O}(\log n)&amp;lt;/math&amp;gt; ||&amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| merge&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; (&amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt; vermutet)&lt;br /&gt;
|| &amp;lt;math&amp;gt;\mathcal{O}(1)&amp;lt;/math&amp;gt; oder &amp;lt;math&amp;gt;\mathcal{O}(\log n)&amp;lt;/math&amp;gt; ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Anwendung ==&lt;br /&gt;
Heaps haben ein breites Spektrum an Anwendungen. Häufig ist vor allem der Einsatz in [[Vorrangwarteschlange]]n, wie sie bei [[Server|Servern]] oder [[Betriebssystem|Betriebssystemen]] zur Festlegung der Ausführungsreihenfolge von Aufgaben benötigt werden.&lt;br /&gt;
&lt;br /&gt;
Daneben gibt es aber auch Anwendungen, die nicht explizit den Einsatz von [[Warteschlange (Datenstruktur)|Warteschlangen]] verlangen. Allgemein stellt ein Heap eine ideale [[Datenstruktur]] für [[Greedy-Algorithmus|Greedy-Algorithmen]] dar, die schrittweise lokale optimierte Entscheidungen treffen. So wird zum Beispiel beim [[Sortierverfahren|Sortieralgorithmus]] [[Heapsort]] ein [[Binärer Heap]] zum Sortieren eingesetzt. [[Fibonacci-Heap]]s finden beim [[Algorithmus von Dijkstra]] bzw. [[Algorithmus von Prim|Prim]] Anwendung.&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Liste (Datenstruktur)]]&lt;br /&gt;
* [[Menge (Datenstruktur)]]&lt;br /&gt;
* [[Stapelspeicher]]&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* {{BibISBN|0262032937|Seite=127}}&lt;br /&gt;
* {{BibISBN|0201896850|Seite=144–155}}&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
{{Commonscat|Heap data structures|Heaps}}&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Datenstruktur]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Carolus requiescat</name></author>
	</entry>
</feed>