Folienset 14: Heapsort

Werbung
Heapsort
•
Insertion Sort: Laufzeit O(n2), sortiert inplace, d.h. es werden nur eine konstante
Zahl von Elementen ausserhalb des Arrays
gespeichert
• Merge-Sort: Laufzeit O(n lg n), sortiert nicht
in-place
• Heapsort: Laufzeit O(n lg n), sortiert in-place
Heap-Datenstruktur
• Array
• kann interpretiert werden als fast
vollständiger Binärbaum
• alle Reihen des Baumes sind komplett
gefüllt, ausser der untersten
Heap Datenstruktur
Für einen Knoten i gilt:
Arten von Heaps
• max-heap: Die max-heap Eigenschaft ist, dass
für jeden Knoten gilt: A[Parent(i)] ≥ A[i]
→ der Wurzelknoten enthält das größte
Element
• min-heap: Die min-heap Eigenschaft ist, dass
für jeden Knoten gilt: A[Parent(i)] ≤ A[i]
→ der Wurzelknoten enthält das kleinste
Element
• Für den Heapsort-Algorithmus verwenden
wir max-heaps.
Max-Heapify
• Eingabe: Array A und Index i
• Annahme: Left(i) und Right(i) sind max-Heaps, A[i] ist
möglicherweise kleiner als seine Kinder → max-heap
Eigenschaft verletzt
• Max-Heapify stellt die max-heap Eigenschaft wieder her:
Max-Heapify
Effizienz von Max-Heapify
• Heap ist ein vollständiger Binärbaum
• Ein Binärbaum mit n Elementen hat die
Höhe O(lg n)
• daher gilt für Max-Heapify: T(n)=O(lg n)
Build-Max-Heap
• Die Prozedur Build-Max-Heap baut einen
max-Heap aus einem Array:
Effizienz von Build-MaxHeap
• Jeder Aufruf von Max-Heapify benötigt
O(lg n) Zeit
• Insgesamt gibt es O(n) Aufrufe von MaxHeapify
• Laufzeit von Build-Max-Heap daher O(n lg n)
Heapsort
•
•
•
Nach Build-Max-Heap befindet sich das größte Element in A[1]
•
heap-size wird um eins reduziert, somit wird das letzte (und
nun größte Element) aus dem Heap ausgeblendet
•
Max-Heapify(A,1) stellt die max-Heap Eigenschaft wieder her
wir vertauschen A[1] mit A[n]
Danach sind die Kinder von A[1] weiterhin max-Heaps. A[1]
verletzt allerdings die max-Heap Eigenschaft
Effizienz von Heapsort
• Build-Max-Heap benötigt O(n lg n) Zeit
• Max-Heapify wird n-1 mal aufgerufen und
benötigt jeweils O(lg n) Zeit
• Daher ist die Laufzeit von Heapsort
T(n)=O(n lg n)
Priority Queues
• Anwendung:Verwalten von Jobs auf einem multi-user
computer
• jeder Job hat eine Priorität, derjenige mit der höchsten
wird ausgeführt
• Insert(S,x) fügt ein Element x der Priority Queue hinzu
• Maximum(S) liefert das größte Element
• Extract-Max(S) entfernt das größte Element
• Increase-Key(S,x,k) ändert den Wert des Elements x zu
k. Dabei muss k größer sein, als der aktuelle Wert von
x
Operationen
• Maximum:
Laufzeit: O(1)
• Extract-Max:
Laufzeit: O(lg n)
Increase-Key:
Laufzeit: O(lg n)
Insert:
Laufzeit: O(lg n)
Fazit: Alle Operationen der Priority Queue
werden in O(lg n) Zeit unterstützt
Herunterladen