Datenstrukturen und Algorithmen VO 708.031 03.11.2010 [email protected] 1 Wiederholung • Elementare Datenstrukturen: Liste, Stack, Schlange • Rekursionen: einfacher zu implementieren, aber oft erhöhter Laufzeit- und Speicherbedarf • Rekursive Zeitgleichungen: Lösen durch rekursives Einsetzen • Divide-and-Conquer: rekursives Aufteilen in Teilprobleme und Zusammenfassen der Teillösungen • Merge-Sort: Sortieralgorithmus nach Divide-and-Conquer Prinzip 03.11.2010 [email protected] 2 Wiederholung • Sortieren durch Verschmelzen (Merge-Sort): T(n) = 2T(n/2) + O(n) ⇒ T(n) = O(n*log n) 03.11.2010 [email protected] S(n)=O(n) 3 Halden (heaps) • Definition: Eine Halde (Heap) ist ein lineares Feld A[1..n], wobei gilt: A[i] ≥ max {A[2i], A[2i+1]}, für i=1,2,…,n/2 • Beispiel: • Jede absteigende Sortierung ist eine Halde, aber nicht umgekehrt • Es gibt mehrere Möglichkeiten gegebene Werte als Halde zu formulieren 03.11.2010 [email protected] 4 Halden (heaps) • Darstellung als Binärbaum: Eigenschaften: • A[1] ist das Maximum (Wurzel) • Nur letztes Niveau evtl. inkomplett • Jeder Teilbaum ist wieder eine Halde i Vater (i ) = 2 Links(i ) = 2i Höhe h = ld n Rechts(i ) = 2i + 1 03.11.2010 [email protected] 5 Aufbau einer Halde • Zentrale Prozedur ist das Verhalden eines Elementes Voraussetzung: Die Teilbäume mit Wurzel LINKS(i) und RECHTS(i) sind Halden, aber Element i verletzt möglicherweise die Haldenbedingung Laufzeit: T(n) = O(log n) 03.11.2010 [email protected] 6 Aufbau einer Halde • Algorithmus zum Aufbau einer Halde aus einem linearen Feld A[1..n]: – Blätter sind bereits Halden (A[n/2+1..n]) – Laufzeit: T(n) = n/2*O(log n) = O(n*log n) – Aber: Element der Höhe h kann in O(h) Zeit verhaldet werden ⇒ Laufzeit T(n) = O(n) 03.11.2010 [email protected] 7 Sortieren mit Halden • Idee: Verwende die Tatsache, dass Maximum immer an erster Stelle steht Nach Haldenaufbau: Vertausche A[1], A[n] Verkleinere Halde um 1 Verhalde A[1] 03.11.2010 [email protected] 8 Sortieren mit Halden • Idee: Verwende die Tatsache, dass Maximum immer an erster Stelle steht HEAPSORT(A) 1: BAUE_HALDE(A) 2: FOR i=n DOWNTO 2 3: VERTAUSCHE(A[1],A[i]) 4: N = N-1 5: VERHALDE(A,1) BAUE_HALDE N≤n aktuelle Haldengröße: VERHALDE T(n) = O(n) + (n-1) * O(log n) = O(n*log n) 03.11.2010 [email protected] 9 Heap-Sort • Vergleich: – Insertion-Sort: T(n) = O(n2), aber in-place – Merge-Sort: T(n) = O(n*log n), aber Θ(n) Zusatzspeicher – Heap-Sort: T(n) = O(n*log n), und in-place • Heap-Sort kombiniert die Vorteile der beiden anderen Algorithmen • Design-Prinzip: Verwendung einer speziellen Datenstruktur (heap) die bestimmte effiziente Operationen ermöglicht (Maximum in O(1) Zeit) 03.11.2010 [email protected] 10 Prioritäts-Warteschlangen • Definition: Eine Warteschlange ist eine Datenstruktur, die auf einer Menge A folgende Operationen erlaubt: EINFÜGEN(A,x) A=A∪{x} MAXIMUM(A) return max A ENTFERNE_MAX(A) A=A\{max A} • Anwendung: Job-Scheduling; der Job maximaler Priorität wird dynamisch bestimmt und berechnet 03.11.2010 [email protected] 11 Prioritäts-Warteschlangen • Operationen auf einer Halde A: T(n) = O(1) T(n) = O(log n) T(n) = O(log n) 03.11.2010 [email protected] 12 Prioritäts-Warteschlangen • Der Aufbau einer Halde mittels EINFÜGEN ist ineffizient: BAUE_HALDE_LANGSAM(A) 1: N=1 2: FOR i=2 TO n 3: EINFÜGEN(A,A[i]) T(n) = Θ(n*log n) T(n) = O(n) 03.11.2010 [email protected] 13 Danke für Ihre Aufmerksamkeit! Bis zum nächsten Mal. (Donnerstag, 10. Nov. 2011, 11:15, i13) 03.11.2010 [email protected] 14