6 Halde (Heap)

Werbung
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: FOR i = n DOWNTO 2 DO
2:
VERTAUSCHE (A[1],A[i])
3:
n = n-1
4:
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
Herunterladen