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