Baum und Heap
Ebene Wurzel.
Ebene
Söhne von Ebene
.
Offenbar steht der kleinste Schlüssel eines Heaps in der Wurzel.
Idee für Heapsort:
Verwendet wird ein Heap als Datenstruktur, die das Entfernen des Minimums unterstützt.
Gegeben seien die Schlüssel
.
Baue einen Heap auf mit den Schlüsseln
.
do {
entferne Wurzel; // = Minimum
reorganisiere Heap;
} while (Heap ist nicht leer);
Idee für Wurzelentfernen:
Entferne ``letzten'' Knoten im Heap und schreibe seinen
Schlüssel in die Wurzel.
Vertausche so lange Knoten mit ``kleinerem'' Sohn, bis
Heapbeziehung eintritt.
Idee für Implementation:
Die Knoten werden wie folgt nummeriert:
Wurzel erhält Nr. ,
linker Sohn von Knoten erhält die Nr.
rechter Sohn von Knoten erhält die Nr.
Im Array
double[] a = new double [n];steht in a[i] der Schlüssel von Knoten
Aufwand für die Konstruktion eines Heaps
Sei die Höhe eines Heaps.
Sei
die Anzahl der Elemente,
z.B.
.
Ebene | Sickertiefe | Anzahl |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Anzahl der Schritte:
Aufwand
, denn:
Aufwand für einmaliges Minimumentfernen:
Gesamtaufwand:
für best, average und worst case.
Weitere Einsatzmöglichkeit des Heaps
Verwende eine dynamisch sich ändernde Menge von Schlüsseln mit den Operationen
![]() |
initheap | legt leeren Heap an |
![]() |
get_min | liefert das momentan Kleinste |
![]() |
del_min | entfernt das momentan Kleinste |
![]() |
insert(x) | fügt ![]() |
![]() |
heapempty | testet, ob Heap leer ist |
Idee für Einfügen: (schlecht: von oben nach unten)
besser: Füge neues Blatt mit Schlüssel an, und lasse
hochsickern.
i = neuer Index; while (a[i] < a[vater(i)]){ tausche a[i] mit a[vater(i)]; i = vater(i); }Aufwand