A size heap i

Werbung
Heaps
• Definition 7.1: Ein Heap über einem Array A ist das Array
A zusammen mit einem Parameter heap-size[A] und drei
Funktionen
Parent, Left,Right : {1,K ,heap-size[A]} → {1,K ,length[A]}
• Die Funktionen Parent, Left, Right versehen ein Array
mit einer binären Baumstruktur.
• Nehmen dabei an, dass der Baum fast vollständig
ist, d.h. der Baum ist bis auf die letzte Ebene auf
jeder Ebene vollständig besetzt. Die letzte Ebene
ist von links nach rechts besetzt.
• Parent liefert Elternknoten, Left und Right liefern
linkes und rechtes Kind eines Knotens.
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
1
Heaps
Definition 7.2: Ein Heap heißt
1. max-Heap, wenn für alle 1 ≤ i ≤ heap − size[A]
gilt
A[Parent (i )] ≥ A[i ].
2. min-Heap, wenn für alle 1 ≤ i ≤ heap − size[A]
gilt
A[Parent(i )] ≤ A[i ].
Die Eigenschaften in 1. und 2. werden max-Heapbzw. min-Heap-Eigenschaft genannt.
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
2
Max-Heapify
Max - Heapify ( A,i )
1. l ← Left (i )
2. r ← Right (i )
3. if l ≤ heap − size[A] und A[l ] > A[i ]
4. then largest ← l
5. else largest ← i
6. if r ≤ heap − size[A] und A[r ] > A[largest ]
7. then largest ← r
8. if largest ≠ i
9. then A[i ] ↔ A[largest ]
10.
Max - Heapify ( A,largest )
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
3
Aufbau eines Heaps
Eingabe: (unstrukturiertes) Array A
Ausgabe: max-Heap über A
Build - Max - Heap( A )
1. heap − size[A] ← length[A]
2. for i ← length[A] / 2 downto 1
3.
do Max - Heapify ( A,i )
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
4
Invariante für Build-Max-Heap
Invariante: Vor Durchlauf der for-Schleife in den Zeilen 2
und 3 für Index i sind die Knoten i+1, …, n Wurzeln von
max-Heaps.
Initialisierung: Zu Beginn gilt i = n / 2. Knoten i > n / 2
sind Blätter und damit Wurzeln von max-Heaps.
• Für alle j gilt: Parent(j) = j / 2. Es gibt daher kein Index j
mit Parent(j) > n / 2 (sonst wäre Left(Parent(j)) > n)
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
5
Invariante für Build-Max-Heap
Erhaltung:
I.V.
Die Invariante gilt vor dem Durchlauf der Schleife für Index i.
I.S. (i → i-1)
• In allen Teilbäumen mit Wurzel A[j] für j > i ist die maxHeap-Eigenschaft erfüllt.
• Max-Heapify(A,i) stellt die max-Heap-Eigenschaft im
Teilbaum mit der Wurzel A[i] her und erhält max-HeapEigenschaft bei Knoten j > i.
o Knoten j befindet sich im Teilbaum mit Wurzel i.
o Teilbaum mit Wurzel j ist im Teilbaum mit Wurzel i nicht
enthalten
Terminierung: Knoten 1 ist Wurzel eines max-Heaps.
Damit ist Algorithmus korrekt.
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
6
Analyse für Build-Max-Heap (1)
1.
Ein n-elementiger Heap hat Höhe log(n ) und
 n 
besitzt höchstens  h +1  Knoten der Höhe h.
2 
2.
Es existiert eine Konstante c, so dass Max-Heapify
bei Knoten der Höhe h Laufzeit höchstens ch
besitzt.
3.
Laufzeit von Build-Max-Heap ist dann höchstens
log( n )
∑
h =0
SS 2008
log( n )
n
h


.
h
 2h +1 ch ≤ 2cn ∑
h =0 2
Datenstrukturen und Algorithmen 7. A & D -Heapsort
7
Analyse für Build-Max-Heap (2)
4. Es gilt
∞
h
= 2.
∑
h
h =0 2
5. Damit ist
log( n )
∑
h =0
log ( n )
∞
h
h
 n ch ≤ 2cn 
≤
2
cn
= 4cn .
∑
∑
h
h
 2h +1 
h =0 2
h =0 2
Satz 7.8: Die Laufzeit von Build-Max-Heap ist O(n).
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
8
Heapsort
Eingabe: Array A
Ausgabe: Zahlen in A in aufsteigender Reihenfolge sortiert.
Heapsort ( A )
1. Build - Max - Heap( A )
2. for i ← length[A] downto 2
3.
do A[1] ↔ A[i ]
4.
heap-size[A] ← heap-size[A] − 1
5.
Max - Heapify ( A,1)
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
9
Heapsort
Heapsort(A)
1. Build-Max-Heap(A)
2. for i ← length[A] downto 2 do
3.
A[1] ↔ A[i]
4.
heap-size[A] ← heap-size[A]-1
5.
Max-Heapify(A,1)
1
2
3
4
5
6
11
7
10
3
2
4
1
11
4
3
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
2
3
7
10
5
2
6
4
10
Heapsort
Heapsort(A)
1. Build-Max-Heap(A)
2. for i ← length[A] downto 2 do
3.
A[1] ↔ A[i]
4.
heap-size[A] ← heap-size[A]-1
5.
Max-Heapify(A,1)
1
2
3
4
5
6
11
7
10
3
2
4
1
11
4
3
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
2
3
7
10
5
2
6
4
11
Heapsort
Heapsort(A)
1. Build-Max-Heap(A)
2. for i ← length[A] downto 2 do
3.
A[1] ↔ A[i]
4.
heap-size[A] ← heap-size[A]-1
5.
Max-Heapify(A,1)
1
2
3
4
5
6
11
7
10
3
2
4
i
1
11
4
3
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
2
3
7
10
5
2
6
4
12
Heapsort
Heapsort(A)
1. Build-Max-Heap(A)
2. for i ← length[A] downto 2 do
3.
A[1] ↔ A[i]
4.
heap-size[A] ← heap-size[A]-1
5.
Max-Heapify(A,1)
1
2
3
4
5
6
4
7
10
3
2
11
i
1
4
4
3
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
2
3
7
10
5
2
6
11
13
Heapsort
Heapsort(A)
1. Build-Max-Heap(A)
2. for i ← length[A] downto 2 do
3.
A[1] ↔ A[i]
4.
heap-size[A] ← heap-size[A]-1
5.
Max-Heapify(A,1)
1
2
3
4
5
6
4
7
10
3
2
11
i
1
4
4
3
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
2
3
7
10
5
2
14
Heapsort
Heapsort(A)
1. Build-Max-Heap(A)
2. for i ← length[A] downto 2 do
3.
A[1] ↔ A[i]
4.
heap-size[A] ← heap-size[A]-1
5.
Max-Heapify(A,1)
1
2
3
4
5
6
10
7
4
3
2
11
i
1
10
4
3
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
2
3
7
4
5
2
15
Heapsort
Heapsort(A)
1. Build-Max-Heap(A)
2. for i ← length[A] downto 2 do
3.
A[1] ↔ A[i]
4.
heap-size[A] ← heap-size[A]-1
5.
Max-Heapify(A,1)
1
2
3
4
5
6
10
7
4
3
2
11
i
1
10
4
3
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
2
3
7
4
5
2
16
Heapsort
Heapsort(A)
1. Build-Max-Heap(A)
2. for i ← length[A] downto 2 do
3.
A[1] ↔ A[i]
4.
heap-size[A] ← heap-size[A]-1
5.
Max-Heapify(A,1)
1
2
3
4
5
6
2
7
4
3
10
11
i
1
2
4
3
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
2
3
7
4
5
10
17
Heapsort
Heapsort(A)
1. Build-Max-Heap(A)
2. for i ← length[A] downto 2 do
3.
A[1] ↔ A[i]
4.
heap-size[A] ← heap-size[A]-1
5.
Max-Heapify(A,1)
1
2
3
4
5
6
2
7
4
3
10
11
i
1
2
2
3
7
4
4
3
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
18
Heapsort
Heapsort(A)
1. Build-Max-Heap(A)
2. for i ← length[A] downto 2 do
3.
A[1] ↔ A[i]
4.
heap-size[A] ← heap-size[A]-1
5.
Max-Heapify(A,1)
1
2
3
4
5
6
7
3
4
2
10
11
i
1
7
2
3
3
4
4
2
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
19
Heapsort
Heapsort(A)
1. Build-Max-Heap(A)
2. for i ← length[A] downto 2 do
3.
A[1] ↔ A[i]
4.
heap-size[A] ← heap-size[A]-1
5.
Max-Heapify(A,1)
1
2
3
4
5
6
7
3
4
2
10
11
i
1
7
2
3
3
4
4
2
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
20
Heapsort
Heapsort(A)
1. Build-Max-Heap(A)
2. for i ← length[A] downto 2 do
3.
A[1] ↔ A[i]
4.
heap-size[A] ← heap-size[A]-1
5.
Max-Heapify(A,1)
1
2
3
4
5
6
2
3
4
7
10
11
i
1
2
2
3
3
4
4
7
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
21
Heapsort
Heapsort(A)
1. Build-Max-Heap(A)
2. for i ← length[A] downto 2 do
3.
A[1] ↔ A[i]
4.
heap-size[A] ← heap-size[A]-1
5.
Max-Heapify(A,1)
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
1
2
3
4
5
6
2
3
4
7
10
11
i
1
2
2
3
3
4
22
Heapsort
Heapsort(A)
1. Build-Max-Heap(A)
2. for i ← length[A] downto 2 do
3.
A[1] ↔ A[i]
4.
heap-size[A] ← heap-size[A]-1
5.
Max-Heapify(A,1)
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
1
2
3
4
5
6
4
3
2
7
10
11
i
1
4
2
3
3
2
23
Heapsort
Heapsort(A)
1. Build-Max-Heap(A)
2. for i ← length[A] downto 2 do
3.
A[1] ↔ A[i]
4.
heap-size[A] ← heap-size[A]-1
5.
Max-Heapify(A,1)
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
1
2
3
4
5
6
4
3
2
7
10
11
i
1
4
2
3
3
2
24
Heapsort
Heapsort(A)
1. Build-Max-Heap(A)
2. for i ← length[A] downto 2 do
3.
A[1] ↔ A[i]
4.
heap-size[A] ← heap-size[A]-1
5.
Max-Heapify(A,1)
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
1
2
3
4
5
6
2
3
4
7
10
11
i
1
2
2
3
3
4
25
Heapsort
Heapsort(A)
1. Build-Max-Heap(A)
2. for i ← length[A] downto 2 do
3.
A[1] ↔ A[i]
4.
heap-size[A] ← heap-size[A]-1
5.
Max-Heapify(A,1)
1
2
3
4
5
6
2
3
4
7
10
11
i
1
2
2
3
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
26
Heapsort
Heapsort(A)
1. Build-Max-Heap(A)
2. for i ← length[A] downto 2 do
3.
A[1] ↔ A[i]
4.
heap-size[A] ← heap-size[A]-1
5.
Max-Heapify(A,1)
1
2
3
4
5
6
3
2
4
7
10
11
i
1
3
2
2
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
27
Heapsort
Heapsort(A)
1. Build-Max-Heap(A)
2. for i ← length[A] downto 2 do
3.
A[1] ↔ A[i]
4.
heap-size[A] ← heap-size[A]-1
5.
Max-Heapify(A,1)
1
2
3
4
5
6
3
2
4
7
10
11
i
1
3
2
2
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
28
Heapsort
Heapsort(A)
1. Build-Max-Heap(A)
2. for i ← length[A] downto 2 do
3.
A[1] ↔ A[i]
4.
heap-size[A] ← heap-size[A]-1
5.
Max-Heapify(A,1)
1
2
3
4
5
6
2
3
4
7
10
11
i
1
2
2
3
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
29
Heapsort
Heapsort(A)
1. Build-Max-Heap(A)
2. for i ← length[A] downto 2 do
3.
A[1] ↔ A[i]
4.
heap-size[A] ← heap-size[A]-1
5.
Max-Heapify(A,1)
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
1
2
3
4
5
6
2
3
4
7
10
11
i
1
2
30
Heapsort
Heapsort(A)
1. Build-Max-Heap(A)
2. for i ← length[A] downto 2 do
3.
A[1] ↔ A[i]
4.
heap-size[A] ← heap-size[A]-1
5.
Max-Heapify(A,1)
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
1
2
3
4
5
6
2
3
4
7
10
11
i
1
2
31
Heapsort
Heapsort(A)
1. Build-Max-Heap(A)
2. for i ← length[A] downto 2 do
3.
A[1] ↔ A[i]
4.
heap-size[A] ← heap-size[A]-1
5.
Max-Heapify(A,1)
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
1
2
3
4
5
6
2
3
4
7
10
11
1
2
32
Heapsort
Heapsort(A)
1. Build-Max-Heap(A)
2. for i ← length[A] downto 2 do
3.
A[1] ↔ A[i]
4.
heap-size[A] ← heap-size[A]-1
5.
Max-Heapify(A,1)
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
1
2
3
4
5
6
2
3
4
7
10
11
33
Heapsort - Korrektheit
Invariante: Vor dem Schleifendurchlauf mit Index i gilt:
• Die größten n-i Elemente befinden sich in A[i+1, …,n]
• Es gilt: A[i+1] ≤ A[i+2] ≤ … ≤ A[n]
• Das Array A[1,…,i] bildet ein Heap
Initialisierung: Vor dem 1. Schleifendurchlauf gilt i=n
• A[n+1,…,n] ist leer, n-i=0
• A[1,…,n] bildet ein max-Heap (1. Build-Max-Heap(A))
I.V.: Die Invariante gilt vor dem Schleifendurchlauf mit Index i
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
34
Heapsort - Korrektheit
I.S. (i → i-1): Vor dem Schleifendurchlauf mit Index i-1 gilt:
• A[1] ↔ A[i]: das größte Element aus A[1,…,i] befindet
sich nun in A[i].
• Die max-Heap-Eigenschaft wird nur von A[2] bzw. A[3]
(z.B. A[Parent(2)] < A[2]) verletzt (wenn überhaupt).
• heap-size[A] ← i-1
•
Max-Heapify(A,1) stellt die max-Heap-Eigenschaft für die
gesamte Teilfolge A[1,…,i-1] her.
Terminierung: Die Schleifeninvariante gilt auch für i=0
• A[1,…,n] ist sortiert.
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
35
Laufzeit von Heapsort
Satz 7.9: Heapsort besitzt Laufzeit O (nlog(n )).
Beweisskizze:
1. Aufruf von Build-Max-Heap: O (n ).
2. for-Schleife in Zeilen 2-5 (n-1)-mal
(n-1)-mal durchlaufen.
3. Pro Durchlauf Laufzeit O (log(n )) (Max-Heapify).
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
36
Extract - Max
Maximum-Suche
Heap-Extract-Max(A)
1. if heap-size[A] < 1 then error „Kein Element vorhanden!“
2. max ← A[1]
3. A[1] ← A[heap-size[A]]
4. heap-size[A] ← heap-size[A]-1
5. Max-Heapify(A,1)
6. return max
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
37
Extract - Max
Heap-Extract-Max(A)
1. if heap-size[A] < 1 then error „Kein Element vorhanden!“
2. max ← A[1]
3
2
6
5
4
1
3. A[1] ← A[heap-size[A]]
12 7 10
3 2
4
4. heap-size[A] ← heap-size[A]-1
5. Max-Heapify(A,1)
1
12
6. return max
4
3
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
2
3
7
10
5
2
6
4
38
Extract - Max
Heap-Extract-Max(A)
1. if heap-size[A] < 1 then error „Kein Element vorhanden!“
2. max ← A[1]
3
2
6
5
4
1
3. A[1] ← A[heap-size[A]]
12 7 10
3 2
4
4. heap-size[A] ← heap-size[A]-1
5. Max-Heapify(A,1)
1
12
6. return max
4
3
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
2
3
7
10
5
2
6
4
39
Extract - Max
Heap-Extract-Max(A)
1. if heap-size[A] < 1 then error „Kein Element vorhanden!“
2. max ← A[1]
3
2
6
5
4
1
3. A[1] ← A[heap-size[A]]
12 7 10
3 2
4
4. heap-size[A] ← heap-size[A]-1
max =12
5. Max-Heapify(A,1)
1
12
6. return max
4
3
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
2
3
7
10
5
2
6
4
40
Extract - Max
Heap-Extract-Max(A)
1. if heap-size[A] < 1 then error „Kein Element vorhanden!“
2. max ← A[1]
3
2
6
5
4
1
3. A[1] ← A[heap-size[A]]
4
7 10
3 2
4
4. heap-size[A] ← heap-size[A]-1
max =12
5. Max-Heapify(A,1)
1
4
6. return max
4
3
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
2
3
7
10
5
2
6
4
41
Extract - Max
Heap-Extract-Max(A)
1. if heap-size[A] < 1 then error „Kein Element vorhanden!“
2. max ← A[1]
3
2
6
5
4
1
3. A[1] ← A[heap-size[A]]
4
7 10
3 2
4
4. heap-size[A] ← heap-size[A]-1
max =12
5. Max-Heapify(A,1)
1
4
6. return max
4
3
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
2
3
7
10
5
2
42
Extract - Max
Heap-Extract-Max(A)
1. if heap-size[A] < 1 then error „Kein Element vorhanden!“
2. max ← A[1]
3
2
6
5
4
1
3. A[1] ← A[heap-size[A]]
10 7 4
3 2
4
4. heap-size[A] ← heap-size[A]-1
max =12
5. Max-Heapify(A,1)
1
10
6. return max
4
3
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
2
3
7
4
5
2
43
Extract - Max
Heap-Extract-Max(A)
1. if heap-size[A] < 1 then error „Kein Element vorhanden!“
2. max ← A[1]
3
2
6
5
4
1
3. A[1] ← A[heap-size[A]]
10 7 4
3 2
4
4. heap-size[A] ← heap-size[A]-1
max =12
5. Max-Heapify(A,1)
1
10
6. return max
4
3
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
2
3
7
4
5
2
44
Extract - Max
Heap-Extract-Max(A)
1. if heap-size[A] < 1 then error „Kein Element vorhanden!“
2. max ← A[1]
3
2
6
5
4
1
3. A[1] ← A[heap-size[A]]
10 7 4
3 2
4
4. heap-size[A] ← heap-size[A]-1
max =12
5. Max-Heapify(A,1)
1
10
6. return max
Laufzeit:
4
3
O(log n)
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
2
3
7
4
5
2
45
Insert - Key
Schlüssel einfügen
Heap-Insert(A,key)
1. heap-size[A] ← heap-size[A]+1
2. i ← heap-size[A]
3. while i>1 and A[Parent(i)] < key do
4.
A[i] ← A[Parent(i)]
5.
i ← Parent(i)
6. A[i] ← key
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
46
Insert - Key
Heap-Insert(A,key)
1. heap-size[A] ← heap-size[A]+1
2. i ← heap-size[A]
3. while i>1 and A[Parent(i)] < key do
4. A[i] ← A[Parent(i)]
5. i ← Parent(i)
6. A[i] ← key
1
2
3
4
5
10
7
4
3
2
6
1
10
4
3
2
3
7
4
5
2
Heap-Insert(A,11)
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
47
Insert - Key
Heap-Insert(A,key)
1. heap-size[A] ← heap-size[A]+1
2. i ← heap-size[A]
3. while i>1 and A[Parent(i)] < key do
4. A[i] ← A[Parent(i)]
5. i ← Parent(i)
6. A[i] ← key
1
2
3
4
5
6
10
7
4
3
2
4
1
10
4
3
2
3
7
4
5
6
2
Heap-Insert(A,11)
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
48
Insert - Key
Heap-Insert(A,key)
1. heap-size[A] ← heap-size[A]+1
2. i ← heap-size[A]
3. while i>1 and A[Parent(i)] < key do
4. A[i] ← A[Parent(i)]
5. i ← Parent(i)
6. A[i] ← key
1
2
3
4
5
10
7
4
3
2
6
i
1
10
4
3
2
3
7
4
5
6
2
Heap-Insert(A,11)
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
49
Insert - Key
Heap-Insert(A,key)
1. heap-size[A] ← heap-size[A]+1
2. i ← heap-size[A]
3. while i>1 and A[Parent(i)] < key do
4. A[i] ← A[Parent(i)]
5. i ← Parent(i)
6. A[i] ← key
1
2
3
4
5
10
7
4
3
2
i
1
10
4
3
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
6
2
3
7
4
5
6
2
50
Insert - Key
Heap-Insert(A,key)
1. heap-size[A] ← heap-size[A]+1
2. i ← heap-size[A]
3. while i>1 and A[Parent(i)] < key do
4. A[i] ← A[Parent(i)]
5. i ← Parent(i)
6. A[i] ← key
1
2
3
4
5
6
10
7
4
3
2
4
i
1
10
4
3
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
2
3
7
4
5
2
6
4
51
Insert - Key
Heap-Insert(A,key)
1. heap-size[A] ← heap-size[A]+1
2. i ← heap-size[A]
3. while i>1 and A[Parent(i)] < key do
4. A[i] ← A[Parent(i)]
5. i ← Parent(i)
6. A[i] ← key
1
2
3
4
5
6
10
7
4
3
2
4
i
1
10
4
3
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
2
3
7
4
5
2
6
4
52
Insert - Key
Heap-Insert(A,key)
1. heap-size[A] ← heap-size[A]+1
2. i ← heap-size[A]
3. while i>1 and A[Parent(i)] < key do
4. A[i] ← A[Parent(i)]
5. i ← Parent(i)
6. A[i] ← key
1
2
3
4
5
6
10
7
10
3
2
4
i
1
10
4
3
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
2
3
7
10
5
2
6
4
53
Insert - Key
Heap-Insert(A,key)
1. heap-size[A] ← heap-size[A]+1
2. i ← heap-size[A]
3. while i>1 and A[Parent(i)] < key do
4. A[i] ← A[Parent(i)]
5. i ← Parent(i)
6. A[i] ← key
1
2
3
4
5
6
10
7
10
3
2
4
i
1
10
4
3
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
2
3
7
10
5
2
6
4
54
Insert - Key
Heap-Insert(A,key)
1. heap-size[A] ← heap-size[A]+1
2. i ← heap-size[A]
3. while i>1 and A[Parent(i)] < key do
4. A[i] ← A[Parent(i)]
5. i ← Parent(i)
6. A[i] ← key
1
2
3
4
5
6
11
7
10
3
2
4
i
1
11
4
3
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
2
3
7
10
5
2
6
4
55
Insert - Key
Heap-Insert(A,key)
1. heap-size[A] ← heap-size[A]+1
2. i ← heap-size[A]
3. while i>1 and A[Parent(i)] < key do
4. A[i] ← A[Parent(i)]
5. i ← Parent(i)
6. A[i] ← key
1
2
3
4
5
6
11
7
10
3
2
4
i
1
11
4
3
Laufzeit:
2
3
7
10
5
2
6
4
O(log n)
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
56
Heap-Insert - Korrektheit
Invariante: Vor dem Schleifendurchlauf mit Index i gilt:
• Die max-Heap-Eigenschaft ist erfüllt im gesamten Heap
• A[i] < key oder A[i] ist leer (i=heap-size[A])
• Alle Elemente von A sind im Heap enthalten
• A[Left(i)] = A[i] oder A[Right(i)] = A[i] oder i=heap-size[A]
Initialisierung: Vor dem 1-ten Schleifendurchlauf gilt:
i=heap-size[A], A[i] ist leer, max-Heap-Eigenschaft ist erfüllt
Erhaltung:
I.V.: Die Invariante gilt vor dem Schleifendurchlauf mit Index i
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
57
Heap-Insert - Korrektheit
I.S. (i → Parent(i)): Vor dem Schleifendurchlauf mit Index i gilt:
• Falls Parent(i) < key und i>1
• A[i] ← A[Parent(i)]
• i ← Parent(i)
• Falls Parent(i) ≥ key und i>1
• Schleife wird beendet, A[i] ← key
• i=1
• Schleife wird beendet, A[i] ← key
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
58
Heap-Insert - Korrektheit
Terminierung: Die Schleifeninvariante terminiert, wenn
Parent(i) ≥ key oder i = 1.
–
Falls i = heap-size[A], dann ist die max-HeapEigenschaft trivialerweise erfüllt.
–
Falls i < heap-size[A], dann ist Parent(i) ≥ key oder i=1.
Da die max-Heap-Eigenschaft nach dem letzten
Schleifendurchlauf erfüllt war und A[i] < key ist, bleibt
nach A[i] ← key die max-Heap-Eigenschaft erhalten
SS 2008
Datenstrukturen und Algorithmen 7. A & D -Heapsort
59
Herunterladen