Heaps Algorithmen und Datenstrukturen Kapitel 4 Neue Datenstrukturen, besseres (?) Sortieren (Teil 2) Frank Heitmann [email protected]4. November 2015 Frank Heitmann [email protected]1/97 Heaps MaxHeapify und BuildMaxHeap HeapSort Heaps Ein (bin¨ arer) Heap ist eine Datenstruktur, die als ein (fast) vollst¨ andiger bin¨ arer Baum angesehen werden kann, wobei der Baum noch die spezielle Heap-Eigenschaft erf¨ ullt. Der Baum ist auf allen Ebenen vollst¨ andig gef¨ ullt außer m¨ oglicherweise auf der letzten. Der Heap wird meist durch ein Array repr¨ asentiert. l¨ ange [A] ist die Anzahl der Elemente des Feldes heap-gr¨oße [A] ist die Anzahl der Elemente im Heap (die in A gespeichert werden). Heap-Eigenschaft: Sei n ein Knoten des Baumes und p sein Vater, dann gilt Max-Heap: v (p) ≥ v (n) Min-Heap: v (p) ≤ v (n) ⇒ Gut f¨ ur Sortieren und Warteschlangen. Frank Heitmann [email protected]2/97 Heaps MaxHeapify und BuildMaxHeap HeapSort Heap - Beispiel 11 16 7 6 12 15 8 1 2 13 9 7 4 5 16 12 15 11 8 7 13 7 6 1 2 1 2 3 4 5 6 7 8 4 5 9 9 10 11 12 13 14 Frank Heitmann [email protected]3/97 Heaps MaxHeapify und BuildMaxHeap HeapSort Heaps und Arrays Hat man ein Array, so werden die Elemente von links nach rechts gelesen und der bin¨ are Baum von oben nach unten und von links nach rechts Ebene f¨ ur Ebene aufgebaut. Hat man einen Baum, so wird dieser von oben nach unten und von links nach rechts gelesen und dabei das Array von links nach rechts gef¨ ullt. Frank Heitmann [email protected]4/97
25
Embed
HeapSort Heaps Algorithmen und Datenstrukturen Heap · 2015. 11. 6. · HeapSort Heaps Ein (bin arer) Heap ist eine Datenstruktur, die als ein (fast) vollst andiger bin arer Baum
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Ein (binarer) Heap ist eine Datenstruktur, die als ein (fast)vollstandiger binarer Baum angesehen werden kann, wobei derBaum noch die spezielle Heap-Eigenschaft erfullt.
Der Baum ist auf allen Ebenen vollstandig gefullt außermoglicherweise auf der letzten.
Der Heap wird meist durch ein Array reprasentiert.
lange[A] ist die Anzahl der Elemente des Feldesheap-große[A] ist die Anzahl der Elemente im Heap (die in Agespeichert werden).
Heap-Eigenschaft: Sei n ein Knoten des Baumes und p seinVater, dann gilt
Hat man ein Array, so werden die Elemente von links nach rechtsgelesen und der binare Baum von oben nach unten und von linksnach rechts Ebene fur Ebene aufgebaut.
Hat man einen Baum, so wird dieser von oben nach unten und vonlinks nach rechts gelesen und dabei das Array von links nach rechtsgefullt.
Wie stellen wir aber gegeben ein Array (das noch kein Heap ist,sondern nur Werte enthalt) einen Heap her? (Und das schnell!)
Eine wichtige Routine ist MaxHeapify(A, i).
Diese geht davon aus, dass Left(i) und Right(i) bereits Max-Heapssind, dass jedoch A[i ] selbst die Heap-Eigenschaft verletzten kann.Die Routine lasst A[i ] ’absinken’, so dass der bei A[i ] beginnendeTeilbaum dann ein Max-Heap wird.
1 Suche im Baum von unten nach oben und von rechts nachlinks (im Array also von rechts nach links) den ersten Knoten,der als Wurzel eines Teilbaumes betrachtet, kein Heap mehrist.
2 Stelle die Heap-Eigenschaft her (mit einem Aufruf vonMaxHeapify).
3 Fahre bei 1. fort.
Algorithmus 1 BuildMaxHeap(A, i)
1: heap-große[A] = lange[A]2: for i = blange[A]/2c downto 1 do3: MaxHeapify(A, i)4: end for
BuildMaxHeap ist korrekt und die Laufzeit ist durch O(n · log n)beschrankt. Eine genauere Analyse zeigt, dass die Laufzeit sogardurch O(n) beschrankt ist. Wir konnen einen Heap also inLinearzeit herstellen.
1 Gegeben ein Array, stelle zunachst einen Heap her(BuildMaxHeap).
2 Vertausche die Wurzel (maximales Element!) mit demElement ganz rechts unten (das Element steht im Array ganzrechts! (Von den noch nicht behandelten Elementen)).
3 Verringere die Heap-Große um 1 und fuhre MaxHeapify aufdie Wurzel aus (die und nur die verletzt jetzt moglicherweisedie Heap-Eigenschaft).
1 Gegeben ein Array, stelle zunachst einen Heap her(BuildMaxHeap).
2 Vertausche die Wurzel (maximales Element!) mit demElement ganz rechts unten (das Element steht im Array ganzrechts! (Von den noch nicht behandelten Elementen)).
3 Verringere die Heap-Große um 1 und fuhre MaxHeapify aufdie Wurzel aus (die und nur die verletzt jetzt moglicherweisedie Heap-Eigenschaft).
Ein (binarer) Heap ist eine Datenstruktur, die als ein (fast)vollstandiger binarer Baum angesehen werden kann, wobei derBaum noch die spezielle Heap-Eigenschaft erfullt.
Der Baum ist auf allen Ebenen vollstandig gefullt außermoglicherweise auf der letzten.
Der Heap wird meist durch ein Array reprasentiert.
lange[A] ist die Anzahl der Elemente des Feldesheap-große[A] ist die Anzahl der Elemente im Heap (die in Agespeichert werden).
Heap-Eigenschaft: Sei n ein Knoten des Baumes und p seinVater, dann gilt
MaxHeapify zur Aufrechterhaltung der Heap-EigenschaftBuildMaxHeap zur Erstellung eines MaxHeaps (benutztMaxHeapify)HeapSort sortiert ein Array (benutzt MaxHeapify undBuildMaxHeap)
Hat man ein Array, so werden die Elemente von links nach rechtsgelesen und der binare Baum von oben nach unten und von linksnach rechts Ebene fur Ebene aufgebaut.
Hat man einen Baum, so wird dieser von oben nach unten und vonlinks nach rechts gelesen und dabei das Array von links nach rechtsgefullt.
1: l = Left(i)2: r = Right(i)3: if l ≤ heap-große[A] und A[l ] > A[i ] then4: max = l5: else6: max = i7: end if8: if r ≤ heap-große[A] und A[r ] > A[max ] then9: max = r
10: end if11: if max 6= i then12: swap(A[i ],A[max ])13: MaxHeapify(A,max)14: end if
1 Suche im Baum von unten nach oben und von rechts nachlinks (im Array also von rechts nach links) den ersten Knoten,der als Wurzel eines Teilbaumes betrachtet, kein Heap mehrist.
2 Stelle die Heap-Eigenschaft her (mit einem Aufruf vonMaxHeapify).
3 Fahre bei 1. fort.
Algorithmus 5 BuildMaxHeap(A, i)
1: heap-große[A] = lange[A]2: for i = blange[A]/2c downto 1 do3: MaxHeapify(A, i)4: end for
1 Gegeben ein Array, stelle zunachst einen Heap her(BuildMaxHeap).
2 Vertausche die Wurzel (maximales Element!) mit demElement ganz rechts unten (das Element steht im Array ganzrechts! (Von den noch nicht behandelten Elementen)).
3 Verringere die Heap-Große um 1 und fuhre MaxHeapify aufdie Wurzel aus (die und nur die verletzt jetzt moglicherweisedie Heap-Eigenschaft).
1: BuildMaxHeap(A)2: for i = lange[A] downto 2 do3: swap(A[1],A[i ])4: heap-große[A] = heap-große[A]− 15: MaxHeapify(A, 1)6: end for
Anmerkung
Ist das Array gar nicht vollstandig gefullt, sollte in der for-Schleifenicht lange[A] genutzt werden, sondern heap-große[A] (dieweiteren Platze im Array werden ja gar nicht genutzt!).
1 MaxHeapify ist korrekt und hat eine Laufzeit von Θ(log n),wobei n die Anzahl der Knoten des Baumes ist.
2 BuildMaxHeap ist korrekt und die Laufzeit ist durchO(n · log n) beschrankt. Eine genauere Analyse zeigt, dass dieLaufzeit sogar durch O(n) beschrankt ist (also in Θ(n) ist).Wir konnen einen Heap also in Linearzeit herstellen.
3 HeapSort sortiert ein Array von n Zahlen in Θ(n · log n)Schritten. HeapSort sortiert in-place.
Zur Ubung
Wir haben nur kurz die Korrektheitsbeweise erwahnt oderangedeutet. Genaueres zur Ubung oder bei Schwierigkeiten zumNachlesen im [Cormen].