<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=141.30.244.84</id>
	<title>Wikipedia (Deutsch) – Lokale Kopie - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=141.30.244.84"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php/Spezial:Beitr%C3%A4ge/141.30.244.84"/>
	<updated>2026-06-21T06:35:36Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Bin%C3%A4rer_Heap&amp;diff=24058</id>
		<title>Binärer Heap</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Bin%C3%A4rer_Heap&amp;diff=24058"/>
		<updated>2025-05-12T22:43:45Z</updated>

		<summary type="html">&lt;p&gt;141.30.244.84: Redundanz&lt;/p&gt;
&lt;hr /&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:Binary heap indexing.png|mini|Binärer &#039;&#039;Min-Heap&#039;&#039;]]&lt;br /&gt;
Ein &#039;&#039;&#039;Binärer [[Heap (Datenstruktur)|Heap]]&#039;&#039;&#039; ist eine [[Datenstruktur]] aus der [[Informatik]] zum [[Effizienz (Informatik)|effizienten]] [[Sortieren]] von Elementen. Das asymptotisch optimale [[Sortierverfahren]] [[Heapsort]] verwendet als zentrale Datenstruktur einen binären Heap. Des Weiteren wird der binäre Heap zur Implementierung einer [[Vorrangwarteschlange]], in der das Element mit der höchsten Priorität effizient abgefragt und entfernt werden kann, verwendet.&lt;br /&gt;
Die Priorität der Elemente wird diesen durch [[Nummerung|Schlüssel]] aufgeprägt. Über der Menge der Schlüssel muss daher eine totale [[Ordnungsrelation|Ordnung]] bestehen, wie sie zum Beispiel die Kleiner-Relation (&amp;lt;) über den [[Ganze Zahl|ganzen Zahlen]] darstellt.&lt;br /&gt;
&lt;br /&gt;
In der Literatur wird oft der Zusatz &#039;&#039;binär&#039;&#039; weggelassen, so dass je nach Zusammenhang der &#039;&#039;Heap&#039;&#039; als archetypische (binäre) Heap-Struktur (implementiert in einem Array) oder die Klasse aller [[Heap (Datenstruktur)|Heap-Datenstrukturen]] gemeint ist.&lt;br /&gt;
Des Weiteren wird bei Verwendung der Ordnungsrelation &amp;lt;math&amp;gt;&amp;lt;&amp;lt;/math&amp;gt; bzw. &amp;lt;math&amp;gt;&amp;gt;&amp;lt;/math&amp;gt; ein Heap als &#039;&#039;Min-Heap&#039;&#039; bzw. &#039;&#039;Max-Heap&#039;&#039; bezeichnet.&lt;br /&gt;
Da sich die Operationen im Min- und Max-Heap nur durch die verwendete Ordnungsrelation unterscheiden, wird im Folgenden der binäre Heap und die Operationen darauf am Beispiel des Min-Heap definiert.&lt;br /&gt;
&lt;br /&gt;
== Definition Min-Heap ==&lt;br /&gt;
&lt;br /&gt;
Ein [[Binärbaum]] &amp;lt;math&amp;gt;H&amp;lt;/math&amp;gt; ist ein Min-Heap, wenn für jeden Knoten &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; mit &amp;lt;math&amp;gt;i\neq\text{root}&amp;lt;/math&amp;gt; gilt:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\text{key}(H, i) \geq \text{key}(H, \text{parent}(i))&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wobei &amp;lt;math&amp;gt;\text{parent}(i)&amp;lt;/math&amp;gt; den [[Gewurzelter Baum#Weitere Begriffe|Elternknoten]] von &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; bezeichnet.&lt;br /&gt;
&lt;br /&gt;
Diese Eigenschaft wird als (Min-)Heap-Eigenschaft bezeichnet.&lt;br /&gt;
&lt;br /&gt;
Ein Heap ist also ein [[Binärbaum#Partiell geordneter Baum|partiell geordneter Baum]]. Zwischen Kinder- und Eltern-Knoten besteht eine Ordnung, aber die Kinder-Knoten sind nicht untereinander geordnet.&lt;br /&gt;
&lt;br /&gt;
== Operationen ==&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&lt;br /&gt;
[[Asymptotische Laufzeit|Worst-Case-Laufzeit]] von &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;insert&#039;&#039; – fügt ein neues Element in den Heap ein&lt;br /&gt;
* &#039;&#039;remove&#039;&#039; – entfernt ein Element&lt;br /&gt;
* &#039;&#039;extractMin&#039;&#039; – extrahiert das Element mit dem kleinsten Schlüssel&lt;br /&gt;
* &#039;&#039;decreaseKey&#039;&#039; – verringert den Schlüsselwert eines Elements&lt;br /&gt;
&lt;br /&gt;
Die Operation &#039;&#039;getMin&#039;&#039; liefert das kleinste Element im Heap zurück und benötigt dafür konstanten Rechenaufwand.&lt;br /&gt;
&lt;br /&gt;
== Struktur ==&lt;br /&gt;
Ein Binärer Heap besteht aus einem [[Binärbaum]], bei dem alle Schichten bis auf die letzte vollständig aufgefüllt sein müssen. Die letzte Schicht des Baumes muss linksbündig aufgefüllt werden. Diese Struktur garantiert, dass der Baum [[Balancierter Baum|balanciert]] ist.&lt;br /&gt;
&lt;br /&gt;
Zusätzlich muss der Binärbaum die Heap-Bedingung erfüllen: am Beispiel des Min-Heaps (siehe Abbildung) muss der Schlüssel jedes [[Kindknoten|Kindes]] eines Knotens größer-gleich dem Schlüssel des Knotens selbst sein. Die Heap-Eigenschaft garantiert, dass sich an der [[Wurzel (Graphentheorie)|Wurzel]] immer der Knoten mit dem kleinsten Key befindet.&lt;br /&gt;
&lt;br /&gt;
Häufig wird ein Binärer Heap nicht explizit mit Zeigern konstruiert, sondern durch ein Array abgebildet. Will man einen Binären Heap in einem [[Feld (Datentyp)|Array]] speichern, so wird die Wurzel des Baums an der ersten Position im Array gespeichert. Bei einer Array-Indizierung beginnend mit &amp;lt;math&amp;gt;1&amp;lt;/math&amp;gt; werden die beiden Nachfolger des Knotens an der &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt;-ten Position an der &amp;lt;math&amp;gt;2i&amp;lt;/math&amp;gt;-ten und &amp;lt;math&amp;gt;2i+1&amp;lt;/math&amp;gt;-ten Position gespeichert, entsprechend der [[Kekule-Nummer]]ierung. Analog dazu sind die Nachfolger des Knotens mit Index &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; an der &amp;lt;math&amp;gt;2i+1&amp;lt;/math&amp;gt;-ten und &amp;lt;math&amp;gt;2i+2&amp;lt;/math&amp;gt;-ten Position gespeichert, wenn die Array-Indizierung mit 0 beginnt.&lt;br /&gt;
&lt;br /&gt;
[[Datei:Binary tree array.svg|500px|zentriert|mini|Beispiel für die implizite Darstellung eines Binärbaums in einem Array. Die eingezeichneten Pfeile sind implizit durch die Funktionen für die Berechnung der Kinder bzw. Eltern-Indizes gegeben.]]&lt;br /&gt;
&lt;br /&gt;
== Algorithmen ==&lt;br /&gt;
&lt;br /&gt;
Bei der Analyse der Algorithmen wird die Heapgröße bzw. die Anzahl der Elemente im Heap-Array mit &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; bezeichnet.&lt;br /&gt;
&lt;br /&gt;
=== Heapify ===&lt;br /&gt;
&lt;br /&gt;
Die Basis mehrerer Heap-Operationen bildet die Funktion &#039;&#039;heapify&#039;&#039;. Sie stellt gegebenenfalls die Heap-Bedingung eines Binärbaums wieder her, vorausgesetzt, dass der linke und der rechte Teilbaum die Heap-Bedingung erfüllen. Dazu tauscht &#039;&#039;heapify&#039;&#039; solange rekursiv absteigend Kind- mit Eltern-Knoten, bis die Heap-Eigenschaft nicht mehr verletzt ist.&lt;br /&gt;
&lt;br /&gt;
Anders formuliert, wenn einer der beiden Kindknoten zur aktuell betrachteten Elternebene aufsteigt, sinkt der Elternknoten in der Folge rekursiv so weit herab, bis er die Ebene seines Gewichtes erreicht hat. Wegen des sukzessiven Tauschens (oder „Schiebens“) von einem Knoten in einen Teilbaum herab, wird die &#039;&#039;heapify&#039;&#039; Operation auch als &#039;&#039;sift-down&#039;&#039; ([[Sieben (Klassierverfahren)|„Sieben“]]) bzw. Sift-Down-Phase bezeichnet.&lt;br /&gt;
&lt;br /&gt;
In [[Pseudocode]]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void heapify(Array H, int i)&lt;br /&gt;
  assert(isheap(H, left(i)) &amp;amp;&amp;amp; isheap(H, right(i)))&lt;br /&gt;
  int min = i&lt;br /&gt;
  if (left(i) &amp;lt; H.size &amp;amp;&amp;amp; H.key(left(i)) &amp;lt; H.key(min))&lt;br /&gt;
    min = left(i)&lt;br /&gt;
  if (right(i) &amp;lt; H.size &amp;amp;&amp;amp; H.key(right(i)) &amp;lt; H.key(min))&lt;br /&gt;
    min = right(i)&lt;br /&gt;
  if (min != i) {&lt;br /&gt;
    H.swap(i, min)&lt;br /&gt;
    heapify(H, min)&lt;br /&gt;
  }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Hilfsfunktionen &#039;&#039;left&#039;&#039; bzw. &#039;&#039;right&#039;&#039; berechnen den Index des linken bzw. rechten Kind-Knotens im Heap-Array, &#039;&#039;key&#039;&#039; abstrahiert von dem Zugriff auf dieses Array und &#039;&#039;swap&#039;&#039; vertauscht zwei Elemente in dem Array, in dem der Heap gespeichert ist. Die Funktion traversiert den Baum nur in die Tiefe, so dass ihre Laufzeit in &amp;lt;math&amp;gt;O(\text{height}(H))&amp;lt;/math&amp;gt; ist. Da die Höhe des Baums logarithmisch von der Anzahl seiner Elemente abhängt, benötigt die Funktion &#039;&#039;heapify&#039;&#039; im Worst-Case logarithmische Laufzeit bzgl. der Größe des Heaps, also &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt;. &#039;&#039;heapify&#039;&#039; benötigt nur eine konstante Anzahl zusätzlicher Speicherzellen, weil sie [[Endrekursion|tail rekursiv]] ist. Das heißt, dass die Rekursion manuell oder automatisch durch eine Schleife ohne Stack ersetzt werden kann:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void heapify(Array H, int a)&lt;br /&gt;
  int i = a&lt;br /&gt;
  do {&lt;br /&gt;
    assert(isheap(H, left(i)) &amp;amp;&amp;amp; isheap(H, right(i))&lt;br /&gt;
    int min = i&lt;br /&gt;
    if (left(i) &amp;lt; H.size &amp;amp;&amp;amp; H.key(left(i)) &amp;lt; H.key(min))&lt;br /&gt;
      min = left(i)&lt;br /&gt;
    if (right(i) &amp;lt; H.size &amp;amp;&amp;amp; H.key(right(i)) &amp;lt; H.key(min))&lt;br /&gt;
      min = right(i)&lt;br /&gt;
    if (min == i)&lt;br /&gt;
      break&lt;br /&gt;
    H.swap(i, min)&lt;br /&gt;
    i = min&lt;br /&gt;
  } while(true)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Build ===&lt;br /&gt;
&lt;br /&gt;
Die Funktion &#039;&#039;build&#039;&#039; konstruiert einen Heap aus einem Array, indem sie iterativ die Funktion &#039;&#039;heapify&#039;&#039; aufruft. Sie beginnt bei den Blättern, die per Definition die Heap-Eigenschaft erfüllen, und arbeitet sich schrittweise zur Wurzel vor. Diese Arbeitsweise wird auch als bottom-up bezeichnet. Als Pseudocode:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void build(Array a)&lt;br /&gt;
  if (a.empty)&lt;br /&gt;
    return&lt;br /&gt;
  for (int i = a.size/2-1; i&amp;gt;=0; --i)&lt;br /&gt;
    heapify(a, i)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aus der Struktur des binären Heap, der in einem Array gespeichert ist, ergibt sich, dass ab Position &amp;lt;math&amp;gt;n/2-1&amp;lt;/math&amp;gt; nur noch Blätter, also 1-elementige Heaps, gespeichert sind. Das heißt ab &amp;lt;math&amp;gt;n/2-1&amp;lt;/math&amp;gt; beginnt die unterste Ebene (Level) des binären Baums. Da die Baumelemente im Array in [[Binärbaum#Traversierung|level-order]] gespeichert sind, läuft die Iteration sukzessive jeweils vom letzten bis ersten Elements eines Levels.&lt;br /&gt;
&lt;br /&gt;
Die Laufzeit von &#039;&#039;build&#039;&#039; ist in &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt;, was nicht direkt offensichtlich ist. Denn &#039;&#039;heapify&#039;&#039; ist in &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt; und wird &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt;-mal aufgerufen. Die lineare Laufzeit ergibt sich aus folgender Gleichung:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\sum_{h=0}^{\left\lfloor\log n\right\rfloor} \left\lceil \frac{n}{2^{h+1}} \right\rceil O(h) = O\left(n \sum_{h=0}^{\left\lfloor\log n\right\rfloor} \frac{h}{2^h} \right) = O(n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
wobei &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; über die Baumhöhe iteriert und &amp;lt;math&amp;gt;\frac{n}{2^{h+1}}&amp;lt;/math&amp;gt; die Anzahl der Teilbäume auf Level &amp;lt;math&amp;gt;h+1&amp;lt;/math&amp;gt; bzw. die Anzahl der Kinder aller Knoten der Höhe &amp;lt;math&amp;gt;h&amp;lt;/math&amp;gt; berechnet.&lt;br /&gt;
&lt;br /&gt;
=== Decrease-Key ===&lt;br /&gt;
&lt;br /&gt;
Wird der Schlüssel eines Heap-Elements &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; verringert, so muss gegebenenfalls die Heap-Eigenschaft in den Vorgängerknoten wiederhergestellt werden.&lt;br /&gt;
Die Heap-Eigenschaft in den Kinder-Teilbäumen von &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; wird durch die &#039;&#039;decrease-key&#039;&#039; Operation nicht verändert. &#039;&#039;decrease-key&#039;&#039; arbeitet wie &#039;&#039;build&#039;&#039; bottom-up:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void decrease(Array H, int i, newkey)&lt;br /&gt;
  assert(isheap(H, 0))&lt;br /&gt;
  assert(H.key(i) &amp;gt;= newkey)&lt;br /&gt;
  H.key(i) = newkey&lt;br /&gt;
  while (i &amp;gt; 0 &amp;amp;&amp;amp; H.key(i) &amp;lt; H.key(parent(i)))&lt;br /&gt;
    H.swap(i, parent(i))&lt;br /&gt;
    i = parent(i)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Insert ===&lt;br /&gt;
&lt;br /&gt;
Das Einfügen eines Elementes mittels &#039;&#039;insert&#039;&#039; erfolgt, indem das Heap-Array um ein neues Element am Ende mit dem Wert &amp;lt;math&amp;gt;\inf&amp;lt;/math&amp;gt; erweitert wird, worauf die Funktion &#039;&#039;decrease&#039;&#039; mit dem einzufügenden Schlüssel aufgerufen wird, damit die möglicherweise verletzte Heap-Eigenschaft wieder hergestellt wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void insert(Array H, newkey)&lt;br /&gt;
  assert(isheap(H))&lt;br /&gt;
  int i = H.size&lt;br /&gt;
  H.resize(i+1)&lt;br /&gt;
  H.key(i) = inf&lt;br /&gt;
  decrease(H, i, newkey)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Laufzeit ist entsprechend &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Remove ===&lt;br /&gt;
&lt;br /&gt;
Das Entfernen eines Elementes mittels &#039;&#039;remove&#039;&#039; geschieht, indem das zu entfernende Element aus seiner Position &#039;&#039;i&#039;&#039; im Heap entfernt und an seine Stelle das sich am Ende des Heaps befindende Element gesetzt wird. Anschließend muss die Heap-Eigenschaft an Position &#039;&#039;i&#039;&#039; wiederhergestellt werden. Dabei kann es sowohl vorkommen, dass das Element auf Position &#039;&#039;i&#039;&#039; größer ist als sein Elternknoten, als auch dass es kleiner ist. Dementsprechend muss es mittels &#039;&#039;heapify&#039;&#039; nach unten oder mittels &#039;&#039;decrease&#039;&#039; nach oben verschoben werden.&lt;br /&gt;
&lt;br /&gt;
Der &#039;&#039;decrease&#039;&#039;-Fall mag nicht offensichtlich sein. Wieso sollte das vormals letzte Element des Arrays kleiner sein als ein viel weiter oben im Baum gelöschtes Element? Das liegt daran, dass ein Heap nur eine partielle und keine totale Ordnung repräsentiert. Betrachtet man den ersten gemeinsamen Vorfahren von zu löschendem und letztem Element, so kann es sein, dass sich in dem einen Teilbaum mit dem letzten Element nur sehr kleine Elemente befinden, wohingegen der andere Teilbaum mit dem zu löschenden Element größere Elemente enthält. Hier ist ein Beispiel einer solchen Situation. Das Element mit dem Index &#039;&#039;5&#039;&#039; soll gelöscht werden:&lt;br /&gt;
&lt;br /&gt;
h1 = [0, 1, &#039;&#039;&#039;2&#039;&#039;&#039;, 2, 1, &#039;&#039;&#039;&#039;&#039;2&#039;&#039;&#039;&#039;&#039;, 2, 2, 2, &#039;&#039;&#039;1&#039;&#039;&#039;] // ist ein korrekter Heap&amp;lt;br/&amp;gt;&lt;br /&gt;
-&amp;gt; [0, 1, &#039;&#039;&#039;2&#039;&#039;&#039;, 2, 1, &#039;&#039;&#039;1&#039;&#039;&#039;, 2, 2, 2, &#039;&#039;&#039;&#039;&#039;2&#039;&#039;&#039;&#039;&#039;] // nach dem Swap mit dem letzten Element&amp;lt;br/&amp;gt;&lt;br /&gt;
-&amp;gt; [0, 1, &#039;&#039;&#039;2&#039;&#039;&#039;, 2, 1, &#039;&#039;&#039;1&#039;&#039;&#039;, 2, 2, 2] // nach dem Entfernen des nun letzten Elements&lt;br /&gt;
&lt;br /&gt;
Nach dem Entfernen des letzten Elements verletzt das sich jetzt an Index 5 befindende Element &#039;&#039;&#039;1&#039;&#039;&#039; zusammen mit seinem Elternknoten &#039;&#039;&#039;2&#039;&#039;&#039; die Heap-Eigenschaft. Ein Anwenden von &#039;&#039;heapify&#039;&#039; würde das Array nicht ändern, da die Funktion nur Elemente nach unten schiebt. Bei Index 5 handelt es sich aber bereits um einen Blatt-Knoten. Stattdessen müssen wir das Element an Position 5 nach oben schieben. Dies geschieht mit der Funktion &#039;&#039;decrease&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
Element remove(Array H, unsigned int i)&lt;br /&gt;
  assert(isheap(H))&lt;br /&gt;
  assert(i&amp;lt;H.size)&lt;br /&gt;
  removedItem = H[i]&lt;br /&gt;
  int lastIdx = H.size-1&lt;br /&gt;
  H.swap(i,lastIdx)&lt;br /&gt;
  H.resize(lastIdx)&lt;br /&gt;
/*  Im Fall i == lastIdx wurde die Heap-Eigenschaft durch das Entfernen&lt;br /&gt;
    des Elements beibehalten, und i befindet sich nun &#039;&#039;out of bounds&#039;&#039;,&lt;br /&gt;
    weil das Array verkleinert wurde. Ein Aufruf von heapify oder&lt;br /&gt;
    decrease würde zum Absturz führen. */&lt;br /&gt;
  if ( i != lastIdx ) {&lt;br /&gt;
    if ( i == 0 || H.key(i) &amp;gt; H.key(parent(i)) ) {&lt;br /&gt;
      heapify(H, i)&lt;br /&gt;
    } else {&lt;br /&gt;
      decrease(H, i, H.key(i)) // decrease macht nichts, wenn H.key(i) == H.key(parent(i))&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  return removedItem&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Extract-Min ===&lt;br /&gt;
&lt;br /&gt;
Das Zurückgeben und Entfernen eines Elementes mittels &#039;&#039;extractMin&#039;&#039; gestaltet sich ähnlich wie &#039;&#039;remove&#039;&#039;. Das minimale Element befindet sich wegen der Heap-Bedingung an der Wurzel des Baumes und stellt damit das zu entfernende Element dar:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
Element extractMin(Array H)&lt;br /&gt;
  assert(isheap(H))&lt;br /&gt;
  assert(H.size &amp;gt; 0)&lt;br /&gt;
  return remove(H, 0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Laufzeit ist entsprechend: &amp;lt;math&amp;gt;O(\log n)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Get-Min ===&lt;br /&gt;
&lt;br /&gt;
Die &#039;&#039;getMin&#039;&#039; gibt das kleinste Element in einem Heap zurück.&lt;br /&gt;
Aus der Heap-Eigenschaft folgt direkt, dass das kleinste Element immer an der ersten Array-Position, also der Wurzel des binären Baums steht. Im Pseudo-Code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
Element getMin(Array H)&lt;br /&gt;
  assert(isheap(H))&lt;br /&gt;
  assert(H.size &amp;gt; 0)&lt;br /&gt;
  return H.key(0)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Laufzeit ist entsprechend konstant: &amp;lt;math&amp;gt;O(1)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Binomial-Heap]]&lt;br /&gt;
* [[Fibonacci-Heap]]&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
&lt;br /&gt;
* {{BibISBN|0262032937|Seite=127}}&lt;br /&gt;
* {{BibISBN|0201896850|Seite=144}}&lt;br /&gt;
&lt;br /&gt;
{{SORTIERUNG:Binarer Heap}}&lt;br /&gt;
[[Kategorie:Datenstruktur]]&lt;/div&gt;</summary>
		<author><name>141.30.244.84</name></author>
	</entry>
</feed>