Beruflich Dokumente
Kultur Dokumente
python Julia
def insertionSort ( A ): function insertionSort ( A :: Vector { T } ) where T
n = len ( A ) n = length ( A )
for i in range (1 , n ): for i in 1: n
s = A[i] s = A[i]
k = i k = i
while k > 0 and s < A [k - 1 ]: while k > 1 && s < A [k -1]
A [ k ] = A [k - 1 ] A [ k ] = A [k -1]
k -= 1 k -= 1
A[k] = s end
A[k] = s
A = input (). split () end
insertionSort ( A ) return A
print ( A ) end
Maximum(H) O(1)
ExtractMax(H) O(log n)
Insert(H,x) O(log n)
ChangeKey(H,x,k) O(log n)
ExtractMax(H): liefert Zeiger x auf Element in H mit x.key maximal und löscht dieses aus H.
Analog gibt es eine Datenstruktur MinHeap mit Operationen Minimum(H) (statt Maximum(H)) und
ExtractMin(H) (statt ExtractMax(H)).
1 Right(i) = 2i + 1
16
2 3
14 10
4 5 6 7
8 7 9 3
8 9 10
2 4 1
Klimm et al. Computerorientierte Mathematik
MaxHeap-Eigenschaft 14 | 6
Definition 1
16
Ein Array A der Größe n und der zugehörige Binärbaum 2 3
besitzen MaxHeap-Eigenschaft, falls 14 10
A [Parent(i)] > A [i] für 1 < i 6 n.
4 5 6 7
Max-Heapify(A, i)
1 ` = Left(i), r = Right(i)
2 if ` 6 n and A [`] > A [i] then 1
largest ` 2
3 3
3 else 4 10
largest i 4 5 6 7
Lemma
a Ist die MaxHeap-Eigenschaft für die Binärbäume unterhalb Left(i) und Right(i) erfüllt,
so ist sie nach Max-Heapify(A, i) für den gesamten Binärbaum unterhalb von i erfüllt.
b Die Laufzeit ist linear in der Höhe des Binärbaums unterhalb von i.
Klimm et al. Computerorientierte Mathematik
Beweis des Lemmas zu Max-Heapify 14 | 9
Lemma
a Ist die MaxHeap-Eigenschaft für die Binärbäume unterhalb Left(i) und Right(i) erfüllt,
so ist sie nach Max-Heapify(A, i) für den gesamten Binärbaum unterhalb von i erfüllt.
b Die Laufzeit ist linear in der Höhe des Binärbaums unterhalb von i.
Beweis:
a Induktion über Höhe von i in Baum: Ist i Blatt, so sind `, r > n.
Also ist nach Schritt 4 largest = i, und in Schritt 5 passiert nichts.
Ist i kein Blatt, so wird in den ersten vier Schritten ermittelt, welches der drei Elemente A [i],
A [`] und A [r] am größten ist.
(Es wird berücksichtigt, falls Left(i) oder Right(i) nicht existieren.)
Nach Swap von A [i] und A [largest] ist MaxHeap-Eigenschaft evtl. in largest verletzt;
wird durch rekursiven Aufruf repariert nach Induktion.
b Die Laufzeitanalyse ist klar.
Klimm et al. Computerorientierte Mathematik
(Wieder-)Herstellen der MaxHeap-Eigenschaft (Teil 2) 14 | 10
Idee
Wende Max-Heapify(A, i) wiederholt auf Knoten i an, deren Teilbäume bereits die
MaxHeap-Eigenschaft erfüllen.
Iteriere dazu beispielsweise über alle Nicht-Blätter des Binärbaumes von unten nach oben.
Beachte: Knoten i ist Blatt () i > bn/2c 1
2 4 3
Build-Max-Heap(A) 1 3
1 for i = bn/2c downto 1: 4 5 6 7
Max-Heapify(A, i) 2 16 9 10
8 9 10
14 8 7
Theorem
Nach Aufruf von Build-Max-Heap(A) besitzt A die MaxHeap-Eigenschaft.
Die Laufzeit beträgt O(n).
Klimm et al. Computerorientierte Mathematik
Build-Max-Heap: Korrektheit und Laufzeitanalyse 14 | 11
Theorem
Nach Aufruf von Build-Max-Heap(A) besitzt A die MaxHeap-Eigenschaft.
Die Laufzeit beträgt O(n).
14.3 Heap-Sort
1
Heap-Sort(A)
2 16 3
1 Build-Max-Heap(A)
14 10
2 while n > 1: 4 5 6 7
exchange A [1] with A [n] 8 7 9 3
n n-1
8 9 10
Max-Heapify(A, 1)
2 4 1
Theorem
Heap-Sort sortiert ein Array A der Länge n in Zeit ⇥(n log n) und benötigt dafür nur konstant
viel zusätzlichen Speicher (‘in-place’).
Bemerkung:
Die Laufzeit von Heap-Sort ist empirisch etwa vergleichbar mit Mergesort.
Theorem
Heap-Sort sortiert ein Array A der Länge n in Zeit ⇥(n log n) und benötigt dafür nur konstant
viel zusätzlichen Speicher (‘in-place’).
Beweis
Korrektheit:
Algorithmus berechnet in Schritt 1 Max-Heap; Wurzel ist größtes Element.
Nach Austausch A [1] $ A [n] hat der binäre Baum auf den ersten n - 1 Knoten fast
Heap-Struktur: nur die Wurzel steht eventuell falsch.
Die Korrektheit folgt damit induktiv aus der Korrektheit von Max-Heapify.
Laufzeit:
O(n) für Build-Max-Heap in Schritt 1
dann n - 1 mal Max-Heapify mit Aufwand jeweils O(log n)
Klimm et al. Computerorientierte Mathematik
Computerorientierte Mathematik I
Maximum(H) O(1)
ExtractMax(H) O(log n)
Insert(H,x) O(log n)
IncreaseKey(H,x,k) O(log n)
Bemerkung:
MaxHeaps unterstützen auch DecreaseKey(H,x,k) in Zeit O(log n).
Es gilt:
Die auf der nächsten Folie spezifizierten Operationen arbeiten korrekt mit den oben angegebenen
Laufzeiten.
Betrachte ein durch ein Array A gegebenen MaxHeap der Größe n > 1.
Maximum(A)
IncreaseKey(A,i,k)
1 return A [1]
1 if k < A [i] then
return “k too small”
ExtractMax(A)
2 A [i] k
1 exchange A [1] with A [n]
3 while i > 1 and A [Parent(i)] < A [i]:
2 n n-1
exchange A [i] with A [Parent(i)]
3 Max-Heapify(A, 1) i Parent(i)
4 return A [n + 1]
DecreaseKey(A,i,k)
Insert(A,k) 1 if k > A [i] then
1 n n+1 return “k too large”
2 A [n] -1 2 A [i] k
3 IncreaseKey(A,n,k) 3 Max-Heapify(A,i)
Klimm et al. Computerorientierte Mathematik
Fibonacci-Heaps 14 | 18
Die amortisierte Laufzeit einiger Operationen ist besser als bei Heaps.
MinHeaps Fibonacci-MinHeaps
Operation
(worst-case) (amortisiert)
Minimum(H) ⇥(1) ⇥(1)
ExtractMin(H) ⇥(log n) ⇥(log n)
Insert(H,x) ⇥(log n) ⇥(1)
DecreaseKey(H,x,k) O(log n) ⇥(1)
8
5
7
9 5
15
6 9
8
11
Prims Algorithmus
Input: zusammenhängender Graph G = (V, E, ), Gewichte c : E ! R
Output: aufspannender Baum minimalen Gewichts
1 for v 2 V :
2 set v.key1, v.pred None, v.inTree false
3 Insert(H,v)
4 choose v0 2 V arbitrary, DecreaseKey(H,v0 ,0)
5 while not isEmpty(H):
6 v ExtractMin(H), v.inTree true
7 for e 2 (v):
8 let w 2 (e) \ {v}
9 if c(e) < w.key and not w.inTree then
10 DecreaseKey(H,w,c(e)), w.pred e
Klimm et al. Computerorientierte Mathematik
Prims Algorithmus: Anzahl der Operationen und Laufzeit 14 | 22
Operation # Aufrufe
Insert(H,v) |V|
ExtractMin(H) |V|
DecreaseKey(H,v,c) 6 |E| + 1
Korollar
a Eine Implementation von Prims Algorithmus mit einem MinHeap H besitzt Laufzeit
O(|E| log |V|).
b Mit einem Fibonacci-MinHeap kann Laufzeit auf O(|E| + |V| log |V|) verbessert werden.