6 Halde (Heap) Die Halde ist eine lineares Feld, welches die sogenannte Haldenbedinung erfüllt: Haldenbedingung: A[i]≥ max {A[2i], A[2i + 1]}, ∀i = 1, 2, . . . n 2 . Direkt aus der Denition ergibt sich, dass A[1] das Maximum des linearen Feldes ist. Beispiel einer Halde: Die Halde lässt sich auch als voller binärer Baum darstellen. Mit den Funktionen LINKS(i) und RECHTS(i) kann auf den linken bzw. rechten Nachfolger des i-ten Elements in der Baumstruktur zugegrien werden, analog mit VATER(i) auf den Vorgänger. LINKS (i) 1: RETURN 2i RECHTS(i) 1: RETURN 2i + 1 VATER (i) 1: RETURN 2i Wichtige Beobachtungen: • Das Maximum sitzt in der Wurzel des Baums • In jedem Knoten ist die Haldenbedingung erfüllt • Die Maximale Tiefe des Baums ist blog nc • In einem Teilbaum sind alle darunter liegenden Knoten kleiner oder maxi- mal gleich groÿ. 1 6.1 Verhalden (Heapify) Verhalden ist der zentrale Prozess für alle Anwendungen der Haldenstruktur. Mit n als Gröÿe der Halde (Die Länge des linaren Feldes). VERHALDE (A,i) 1: l←LINKS(i), r←RECHTS(i) 2: index ← i 3: IF l≤n AND A[l]>A[i] THEN index←l 4: IF r≤n AND A[r]>A[index] THEN index←r 5: IF i6=index THEN 6: VERTAUSCHE (A[i], A[index]) 7: VERHALDE (A,index) : Die Rekursiongleichung dazu lautet T (n) ≤ O(1)+T ( n2 ). Die Lösung ist T (n) = O(log n). Analyse 6.2 Aufbau einer Halde Eine Halde kann aus einem beliebigen linearen Feld A aufgebaut werden: BAUE_HALDE (A) 1: FOR i←n/2 DOWNTO 1 2: VERHALDE (A,i) : Das Verhalden wird n2 -mal durchgeführt. D.h. T (n) = O(n·log n). Bei genauerer Betrachtung sieht man aber, dass eben nicht alle Elemente durch die ganze Baumhöhe durch verhaldet werden müssen. Die Schranke O(n · log n) ist nicht scharf. Pbldnc n Pbldnc Ein genauerer Ansatz ist h=0 O(h) = O(n h=0 2hh ) = O(n) . 2h P h (Die Summe kann durch eine unendliche Summe ∞ h=0 2h = 2 abgeschätzt werden.) Analyse Damit kann eine Halde in linearer Zeit aus einem linearen Feld gebaut werden. 6.3 Sortieren mit Halden (Heap Sort) Mit Hilfe des VERHALDE -Algorithmus kann man auch einen Sortieralgoritmus konstruieren. HEAP_SORT(A) 1: BAUE_HALDE(A) 2: FOR i ← n DOWNTO 2 DO 3: VERTAUSCHE (A[1],A[i]) 4: n ← n-1 5: VERHALDE (A,1) Die Laufzeit beträgt T (n) = O(n · log n). Der Algorithmus arbeitet in-place. 2 6.4 Wartschlange (Priority Queue) Eine weitere Anwendung dieser Datenstruktur ist die Warteschlange mit Prioritäten: Eine Warteschlange liegt vor, wenn folgende drei Operationen durchgeführt werden können: • EINFÜGEN (A,x) • MAX (A) • ENTFERNE_MAX (A) Die Funktionen mit Hilfe einer Halde umgesetzt in Pseudocode: MAXIMUM (A) 1: RETURN A[1] ENTFERNE_MAX (A) 1: A[1] ← A[n] 2: n ← n-1 3: VERHALDE (A,1) EINFÜGEN (A,x) 1: n←n+1 , A[n]←x , i←n 2: WHILE i>1 AND A[i]>A[VATER(i)] DO 3: VERTAUSCHE (A[i],A[VATER(i)]) 4: i←Vater(i) Die Laufzeiten betragen für MAXMIMUM, ENTFERNE_MAX und EINFÜGEN respektiv O(1), O(log n) und O(log n). 3