1 Raumwechsel: Gr. 15 (Do 10-12, F-235) ab sofort in G Studie zum Arbeitsverhalten von Studierenden unter Leitung

Ähnliche Dokumente
Algorithmen und Datenstrukturen Kapitel 2: Korrektheit von Algorithmen und Laufzeitanalyse rekursiver Algorithmen (mittels Rekurrenzgleichungen)

Übersicht. Datenstrukturen und Algorithmen. Divide-and-Conquer. Übersicht. Vorlesung 9: Quicksort (K7)

Übung zu Algorithmen und Datenstrukturen (für ET/IT)

Algorithmen und Datenstrukturen

Kapitel 6 Elementare Sortieralgorithmen

6 Quicksort. die mittlere Laufzeit Θ(n log n) beträgt und. die in der asymptotischen Notation verborgenen Konstanten sehr klein sind.

Übersicht. Datenstrukturen und Algorithmen. Übersicht. Divide-and-Conquer. Vorlesung 9: Quicksort (K7)

Übung Algorithmen und Datenstrukturen

Abschnitt: Algorithmendesign und Laufzeitanalyse

Algorithmen und Datenstrukturen

A7.1 Untere Schranke. Algorithmen und Datenstrukturen. A7.1 Untere Schranke. Algorithmen und Datenstrukturen. A7.2 Quicksort. A7.

Aufgabe 8. 1 Arbeitsweise illustrieren. 2 Korrektheitsbeweis führen. 3 Laufzeitanalyse durchführen.

14. Sortieren II Heapsort. Heapsort. [Max-]Heap 7. Heapsort, Quicksort, Mergesort. Binärer Baum mit folgenden Eigenschaften

Algorithmen und Datenstrukturen Kapitel 7 Dynamische Mengen, das Suchproblem &

Algorithmen und Datenstrukturen

QuickSort ist ein Sortieralgorithmus, der auf der Idee des Teile & Beherrsche beruht, und das gegebene Array an Ort und Stelle (in place) sortiert

Datenstrukturen & Algorithmen

Kapitel 5: Paradigmen des Algorithmenentwurfs. Gliederung

Heapsort. Dr. Michael Brinkmeier (TU Ilmenau) Algorithmen und Datenstrukturen / 50

8. Sortieren II. 8.1 Heapsort. Heapsort. [Max-]Heap 6. Heapsort, Quicksort, Mergesort. Binärer Baum mit folgenden Eigenschaften

Heapsort, Quicksort, Mergesort. 8. Sortieren II

Übung: Algorithmen und Datenstrukturen SS 2007

Übung zu Algorithmen und Datenstrukturen (für ET/IT)

9. Rekursion. 1 falls n 1 n (n 1)!, andernfalls. Experiment: Die Türme von Hanoi. Links Mitte Rechts. Mathematische Rekursion

Übersicht. Datenstrukturen und Algorithmen. Die Teile-und-Beherrsche-Methode. Übersicht. Vorlesung 3: Rekursionsgleichungen (K4)

Algorithmen I. Tutorium 1-3. Sitzung. Dennis Felsing

Das Suchproblem. Gegeben Menge von Datensätzen. Beispiele Telefonverzeichnis, Wörterbuch, Symboltabelle

Sortieralgorithmen. Jan Pöschko. 18. Januar Problemstellung Definition Warum Sortieren?... 2

Algorithmen und Datenstrukturen Kapitel 1 Algorithmen & Algorithmenanalyse

Übung Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen Kapitel 1 Algorithmen & Algorithmenanalyse

Abschnitt 19: Sortierverfahren

Algorithmen und Datenstrukturen SoSe 2008 in Trier. Henning Fernau Universität Trier

Das Suchproblem. Gegeben Menge von Datensätzen. Beispiele Telefonverzeichnis, Wörterbuch, Symboltabelle

Das Suchproblem 4. Suchen Das Auswahlproblem Suche in Array

Datenstrukturen & Algorithmen

Informatik II, SS 2016

Das Suchproblem 4. Suchen Das Auswahlproblem Suche in Array

3.2. Divide-and-Conquer-Methoden

8. A & D - Heapsort. Werden sehen, wie wir durch geschicktes Organsieren von Daten effiziente Algorithmen entwerfen können.

Algorithmen und Datenstrukturen

Klausur Algorithmen und Datenstrukturen

3. Suchen. Das Suchproblem. Suche in Array. Lineare Suche. 1 n. i = n Gegeben Menge von Datensätzen.

Algorithmen und Datenstrukturen

4. Sortieren 4.1 Vorbemerkungen

Algorithmen und Datenstrukturen Heapsort

Heapsort / 1 A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8]

Klausur Algorithmen und Datenstrukturen

Sortieren II / HeapSort Heaps

Grundlagen: Algorithmen und Datenstrukturen

f 1 (n) = log(n) + n 2 n 5 f 2 (n) = n 3 + n 2 f 3 (n) = log(n 2 ) f 4 (n) = n n f 5 (n) = (log(n)) 2

Algorithmen und Datenstrukturen

Übungen zu Algorithmentechnik WS 09/10

JAVA - Suchen - Sortieren

8.1.3 Operation Build-Max-Heap Operation zur Konstruktion eines Heaps Eingabe: Feld A[1..n], n = länge(a) BUILD-MAX-HEAP (A)

Kap. 3: Sortieren (3)

Technische Universität München

Kapitel 10. Komplexität von Algorithmen und Sortieralgorithmen

2 Sortieren. Beispiel: Es seien n = 8 und a = i : a i : ϕ(i) : a ϕ(i) :

Kapitel 3: Sortierverfahren Gliederung

Rekursionsbäume Aufstellen eines Baumes dessen Knoten die Laufzeit auf jeder Rekursionsstufe darstellen und Aufsummieren

Heapsort. 1. Erstelle aus dem gegebenen Array einen Max-Heap (DownHeap) 2. Tausche erstes und letztes Element des Arrays

Präsenzübung Datenstrukturen und Algorithmen SS 2014

Algorithmenbegriff: Berechenbarkeit. Algorithmenanalyse. (Berechnung der Komplexität)

Mergesort. Inhaltsverzeichnis. Veranschaulichung der Funktionsweise. aus Wikipedia, der freien Enzyklopädie

Algorithmen und Datenstrukturen Kapitel 7 Dynamische Mengen, das Suchproblem &

Praktikum Algorithmische Anwendungen WS 2006/07 Sortieren in linearer Laufzeit

Algorithmen und Datenstrukturen (für ET/IT)

Datenstrukturen und Algorithmen

Algorithmen und Datenstrukturen

Suchen und Sortieren Sortieren. Mergesort

Übersicht. Einfache Verfahren MergeSort Untere Schranke QuickSort Selektieren Schnelleres Sortieren Externes Sortieren. 6 Sortieren.

Algorithms & Data Structures 2

Übung Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen 12

Datenstrukturen und Algorithmen. Christian Sohler FG Algorithmen & Komplexität

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Informatik II, SS 2018

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Kapitel 8 Fortgeschrittene Sortieralgorithmen

5. Übungsblatt zu Algorithmen I im SoSe 2016

Kap. 3: Sortieren. Überblick. Unser Sortierproblem. Motivation. Laufzeitmessung. Warum soll ich hier bleiben? Sortierverfahren sind WICHTIG!!!

Datenstrukturen und Algorithmen

Beispiellösung zu den Übungen Datenstrukturen und Algorithmen SS 2008 Blatt 5

Algorithmen und Datenstrukturen

Algorithmik Übung 3 Prof. Dr. Heiner Klocke. Sortierfolge nach Werten: Bube Dame König As nach Farben: Karo ( ) Herz ( ) Piek ( ) Kreuz ( )

Übersicht. Datenstrukturen und Algorithmen. Übersicht. Heaps. Vorlesung 8: Heapsort (K6) Joost-Pieter Katoen. 7. Mai 2015

Algorithmen und Datenstrukturen

Tutoraufgabe 1 (Sortieralgorithmus):

Datenstrukturen und Algorithmen (SS 2013)

Algo-Animation. Konstruktion der Partition: eigentliche Kunst / Arbeit bei Quicksort. Resultat: Partition A=A 1 WA 2 A 1 W A 2.

S=[n] Menge von Veranstaltungen J S kompatibel mit maximaler Größe J

Sortieren & Co. KIT Institut für Theoretische Informatik

Algorithmen und Datenstrukturen 1-3. Seminar -

Datenstrukturen und Algorithmen

1. Musterlösung. Problem 1: Average-case-Laufzeit vs. Worst-case-Laufzeit ** i=1

Tutoraufgabe 1 (Sortieren): Lösung: Datenstrukturen und Algorithmen SS14 Lösung - Übung 4

Algorithmen und Datenstrukturen

Datenstrukturen und Algorithmen. Christian Sohler FG Algorithmen & Komplexität

Transkript:

Organisatorisches Algorithmen und Datenstrukturen Kapitel 3: Divide & Conquer Frank Heitmann heitmann@informatik.uni-hamburg.de 1 Raumwechsel: Gr. 15 (Do 10-12, F-235) ab sofort in G-021. 2 Studie zum Arbeitsverhalten von Studierenden unter Leitung von Prof. Maria Knobelsdorf. 28. Oktober 2015 Frank Heitmann heitmann@informatik.uni-hamburg.de 1/57 Frank Heitmann heitmann@informatik.uni-hamburg.de 2/57 Divide & Conquer D & C - Laufzeitverbesserung Divide & Conquer ist eine Algorithmentechnik, die i.a. rekursiv arbeitet. Die Laufzeit solcher Algorithmen kann daher i.a. durch Rekurrenzgleichungen analysiert werden. Die Technik kann wie folgt beschrieben werden: Größere Probleme werden in kleinere zerlegt, die dann seperat (und i.a. rekursiv) nach der gleichen Methode (!) gelöst werden. Die Teilergebnisse werden dann passend zur Lösung des Problems zusammengesetzt. Da auf kleineren Instanzen rekursiv gearbeitet wird, nutzt man Rekurrenzgleichungen zur Analyse. (Wie dort gibt es meist einen einfachen Basisfall.) Ein naher Verwandter ist die dynamische Programmierung, die wir später noch kennenlernen werden. Wenn D & C Algorithmen möglich sind, dann ist die Problemstellung oft schon so, dass bereits der brute-force Algorithmus eine polynomielle Laufzeit hat. Durch D & C wird diese Laufzeit dann weiter reduziert. Bringt das viel? Z.B. bei einem O(n 2 ) und einem O(n log n) Algorithmus? Sei n = 1024 = 2 10 dann braucht der O(n 2 ) Algorithmus c 2 20 c 1.000.000 Schritte der O(n log n) aber nur c 2 10 10 c 10.000 Schritte Bei n = 2 20 1.000.000 wird dies noch sehr viel deutlicher. Frank Heitmann heitmann@informatik.uni-hamburg.de 3/57 Frank Heitmann heitmann@informatik.uni-hamburg.de 4/57

Ablauf Sortieren Der Plan für heute: 1 als klassisches D & C Verfahren 2 Wiederholung und Vertiefung zum Mastertheorem 3 als weiteres klassisches D & C Verfahren Definition (Das Sortierproblem) Eingabe: Eine Sequenz < a 1, a 2,..., a n > von n Zahlen. Gesucht: Eine Permutation < a 1, a 2,..., a n > der Eingabesequenz mit a 1 a 2... a n. Anmerkung Ob die Reihenfolge zweier Elemente a i, a j (i < j) mit a i = a j beibehalten werden soll oder nicht, ist nicht gesagt. Bleibt sie erhalten, d.h. ist a p = a i, a q = a j und p < q, so nennt man das Verfahren stabil. Ferner heißt ein Sortierverfahren in-place (oder in situ), wenn der zusätzlich benötigte Speicherbedarf unabhängig von der gegebenen Sequenz ist. Frank Heitmann heitmann@informatik.uni-hamburg.de 5/57 Frank Heitmann heitmann@informatik.uni-hamburg.de 6/57 Mergesort - Idee 9,1,3,7,2,2,1,6,5 Die bisherigen Verfahren (MaxSort, InsertionSort) sind in O(n 2 ). Das können wir besser... Die Idee: Teile die Eingabe in zwei Teile gleicher (ca.) Größe. Löse die zwei Teilprobleme unabhängig und rekursiv. Kombiniere die zwei Ergebnisse in eine Gesamtlösung, wobei wir nur lineare viel Zeit für die anfängliche Teilung und die abschließende Zusammenführung nutzen wollen. 9,1,3,7,2 2,1,6,5 9,1,3 7,2 2,1 6,5 9,1 3 7 2 2 1 6 5 9 1 1,9 2,7 1,2 5,6 1,3,9 1,2,3,7,9 1,2,5,6 1,1,2,2,3,5,6,7,9 Frank Heitmann heitmann@informatik.uni-hamburg.de 7/57 Frank Heitmann heitmann@informatik.uni-hamburg.de 8/57

Mergesort - Algorithmus Mergen Algorithmus 1 mergesort(a,l,r) 1: if l < r then 2: q = (l + r)/2 3: mergesort(a, l, q) 4: mergesort(a, q + 1, r) 5: merge(a, l, q, r) 6: end if Gegeben zwei sortierte Listen A und B. cur A und cur B seien Zeiger auf Elemente in A bzw. B. Am Anfang zeigen sie auf das erste Element der jeweiligen Liste. Solange beide Listen nicht leer sind: Seien a i und b j die Elemente auf die cur A und cur B zeigen. Füge das kleinere Element der Ausgabeliste hinzu. Erhöhe den Zeiger der Liste dessen Element gewählt wurde. Ist eine Liste leer, füge die andere an die Ausgabeliste an. Frank Heitmann heitmann@informatik.uni-hamburg.de 9/57 Frank Heitmann heitmann@informatik.uni-hamburg.de 10/57 - Korrektheit Analyse Es wäre nun noch 1 für Merge PseudoCode anzugeben 2 Merge als korrekt nachzuweisen (Schleifeninvariante!) 3 als korrekt nachzuweisen (Induktion?) Zur Übung Wir können für Mergesort nun die folgende Rekurrenzgleichung aufstellen: { d, falls n = 1 2T ( n 2 ) + cn, falls n 2 Diese können wir durch Abwicklung oder das Mastertheorem lösen. Frank Heitmann heitmann@informatik.uni-hamburg.de 11/57 Frank Heitmann heitmann@informatik.uni-hamburg.de 12/57

Das Mastertheorem Das Mastertheorem und Divide & Conquer Definition (Mastertheorem) Das Mastertheorem gilt für Rekurrenzen der Form: { c falls n = 1 a T ( n b ) + f (n) falls n > 1 Hierbei sind a 1, b > 1 und c Konstanten, n b wird als n b oder verstanden und T (n) über N definiert. Es gilt: n b 1 T (n) Θ(n log b (a) ), falls f (n) O(n log b (a) ɛ ) für ein ɛ > 0. 2 T (n) Θ(n log b (a) log 2 (n)), falls f (n) Θ(n log b (a) ). 3 T (n) Θ(f (n)), falls f (n) Ω(n log b (a)+ɛ ) für ein ɛ > 0 und a f ( n b ) δ f (n) für ein δ < 1 und große n. Hat man eine Gleichung { c falls n = 1 a T ( n b ) + f (n) falls n > 1 für einen Divide & Conquer Algorithmus, so gibt das a die Anzahl der Teilprobleme wieder, das n b die Größe der Teilprobleme und das f (n) den Zeitbedarf beim Teilen des Problems und/oder beim Zusammenfügen der Teillösungen. Frank Heitmann heitmann@informatik.uni-hamburg.de 13/57 Frank Heitmann heitmann@informatik.uni-hamburg.de 14/57 Mastertheorem - Mergesort (Beispiel Fall 2) Mastertheorem Fall 2 T (n) Θ(n log b (a) log 2 (n)), falls f (n) Θ(n log b (a) ) { d, falls n = 1 2T ( n 2 ) + cn, falls n 2 Wegen log b (a) = log 2 (2) = 1 und f (n) = cn ist f (n) Θ(n 1 ). Es liegt also Fall 2 vor und dies ergibt T (n) Θ(n log n). Wir betrachten nachfolgend noch weitere Beispiele für die einzelnen Fälle des Mastertheorems und ein Hilfsmittel für die Benutzung des Mastertheorems Ergebnis Mergesort sortiert eine Sequenz von n Zahlen in Θ(n log n) Zeit. Frank Heitmann heitmann@informatik.uni-hamburg.de 15/57 Frank Heitmann heitmann@informatik.uni-hamburg.de 16/57

Mastertheorem - Beispiel Fall 1 Mastertheorem - Beispiel 3 Fall 1 T (n) Θ(n log b (a) ), falls f (n) O(n log b (a) ɛ ) für ein ɛ > 0 Fall 3 T (n) Θ(f (n)), falls f (n) Ω(n log b (a)+ɛ ) für ein ɛ > 0 und a f ( n b ) δ f (n) für ein δ < 1 und große n { c 3T (n/3) + 1/n { c a T ( n b ) + f (n) Wegen log b (a) = log 3 (3) = 1 und f (n) = 1 n = n 1 ist f (n) O(n 1 ɛ ) bei Wahl von z.b. ɛ = 2 > 0. Es liegt also Fall 1 vor und dies ergibt, wie letztes Mal durch Abwickeln, T (n) Θ(n). Frank Heitmann heitmann@informatik.uni-hamburg.de 17/57 { c, falls n = 1 3T ( n 4 ) + n log n, falls n 2 Hier ist log b (a) = log 4 (3) 0, 793 und f (n) = n log n. Da f (n) Ω(n log 4 (3)+ɛ ) mit ɛ = 0, 2 gilt, kommt Fall 3 zur Anwendung, wenn die Regulartitätsbedingung (af (n/b) δf (n) für ein δ < 1 und hinreichend große n) erfüllt ist, falls also 3(n/4) log(n/4) = 3/4n log(n/4) δn log n möglich ist. Für genügend große n gilt tatsächlich 3/4n log(n/4) 3/4n log n = δf (n) mit δ = 3/4, also T (n) Θ(n log n). Frank Heitmann heitmann@informatik.uni-hamburg.de 18/57 Mastertheorem - Anmerkung Mastertheorem - Anmerkung Bemerkung Das Mastertheorem ist die dritte Methode, die wir zur Lösung von Rekurrenzgleichungen nutzen werden. Das Mastertheorem ist ein mächtiges Hilfsmittel. Es ist aber nicht immer einsetzbar: Z.B. bei 2 T (n/2) + n log n nicht. Hier ist f (n) = n log n und log b (a) = log 2 (2) = 1. Wir vergleichen also n log n mit n. Es sieht so aus, als ob der dritte Fall zutreffen könnte (f (n) Ω(n 1+ɛ )) Aber man wird kein so ein ɛ > 0 finden. f (n) ist nämlich nicht polynomiell größer als n 1. Bemerkung Der Fall von eben liegt also zwischen den Fällen 2 und 3 im Mastertheorem. Ebenso kann es Fälle geben, die mit ähnlicher Argumentation zwischen den Fällen 1 und 2 des Mastertheorems liegen. Dann kann es noch Fälle geben, die gegen die Regulartitätsbedingung von Fall 3 des Mastertheorems verstossen. Bei all diesen Fällen ist das Mastertheorem nicht anwendbar. Frank Heitmann heitmann@informatik.uni-hamburg.de 19/57 Frank Heitmann heitmann@informatik.uni-hamburg.de 20/57

Hilfsmittel Variablentransformation Bei Rekurrenzgleichungen sind oft Variablentransformationen hilfreich. Sei 2T ( n) + log n so ist das Mastertheorem zunächst nicht anwendbar. Die Substitution m = log n (2 m = n und 2 m/2 = n 1/2 = n) führt zu T (2 m ) = 2T (2 m/2 ) + m Sei nun S(m) = T (2 m ) so erhalten wir Das sieht vertraut aus... S(m) = 2S(m/2) + m Hilfsmittel Variablentransformation Bisher: 2T ( n) + log n T (2 m ) = 2T (2 m/2 ) + m (mit m = log n, 2 m = n) S(m) = 2S(m/2) + m (mit S(m) = T (2 m )) Mit S(m) = Θ(m log m) folgt nun T (2 m ) = S(m) = Θ(m log m) = Θ(log n log log n) Und wir haben eine Abschätzung für T (n). Anmerkung Wir haben hier S(m) = Θ(...) statt S(m) Θ(...) geschrieben, was nur von links nach recht gelesen wird und bei der O-Notation verbreitet ist. Frank Heitmann heitmann@informatik.uni-hamburg.de 21/57 Frank Heitmann heitmann@informatik.uni-hamburg.de 22/57 Spezialfälle Zusammenfassung Eine Verallgemeinerung der Rekurrenzgleichung von Mergesort ist { d, falls n = 1 qt ( n 2 ) + cn, falls n 2 Ist q > 2, so erhalten wir T (n) Θ(n log 2 q ). Die rekursiven Aufrufe erzeugen mehr Arbeit bei wachsendem q. Ist q = 1, so erhalten wir T (n) Θ(n). Meiste Arbeit auf oberster Ebene. Frank Heitmann heitmann@informatik.uni-hamburg.de 23/57 Die drei Schritte des Divide & Conquer (Teile-und-Beherrsche) Paradigmas 1 Teile das Problem in n Teilprobleme auf 2 Beherrsche die Teilprobleme durch rekursives Lösen (d.h. teile sie weiter; sind die Teilprobleme hinreichend klein, löse sie direkt) 3 Verbinde die Lösungen der Teilprobleme zur Lösung des übergeordneten Problems und letztendlich des ursprünglichen Problems. Die Schritte finden auf jeder Rekursionsebene statt. Anmerkungen Rekursive Verfahren können auch iterativ implementiert werden. Das ist manchmal sinnvoll, manchmal nicht. (Siehe Anmerkungen im letzten Foliensatz.) Frank Heitmann heitmann@informatik.uni-hamburg.de 24/57

- Die Idee Wähle ein Elemente x aus A aus. ist ein Divide-&-Conquer-Algorithmus, der im schlechtesten Fall in Θ(n 2 ) arbeitet, dessen erwartete Laufzeit aber in Θ(n log n) liegt (mit nur einer kleinen versteckten Konstanten!), d.h. in der Praxis ist er oft die beste Wahl für das Sortieren. Teile: Das Feld A[p..r] wird in zwei Teilfelder A[p..q 1] und A[q + 1..r] zerlegt, wobei alle Elemente im ersten Teilfeld kleiner oder gleich x = A[q] sind und alle Elemente im zweiten Teilfeld größer oder gleich A[q] sind. Der Index q (für x) wird in der Zerlegungsprozedur berechnet. Beherrsche: Sortiere die beiden Teilfelder durch rekursive Aufrufe. Verbinde: Da die Teilfelder (rekursiv) in-place sortiert werden, brauchen sie nicht weiter verbunden werden. Das Feld A[p..r] ist nun sortiert. Frank Heitmann heitmann@informatik.uni-hamburg.de 25/57 Frank Heitmann heitmann@informatik.uni-hamburg.de 26/57 - Psuedocode (1/2) - Pseudocode (2/2) Algorithmus 2 (A, p, r) 1: if p < r then 2: q = Partition(A, p, r) 3: (A, p, q 1) 4: (A, q + 1, r) Um ein Array A zu sortieren rufen wir (A, 1, länge[a]) Algorithmus 3 Partition(A, p, r) 1: x = A[r] // dies ist das Pivotelement 2: i = p 1 3: for j = p to r 1 do 4: if A[j] x then 5: i = i + 1 6: swap(a[i], A[j]) 7: end if 8: end for 9: swap(a[i + 1], A[r]) 10: return i + 1 auf. Nachfolgend ohne Zeile 1, 2 und 10! (Wegen Platzmangel...) Frank Heitmann heitmann@informatik.uni-hamburg.de 27/57 Frank Heitmann heitmann@informatik.uni-hamburg.de 28/57

- Beispiel - Beispiel Algorithmus 4 Partition(A, p, r) Algorithmus 5 Partition(A, p, r) i p j 2 8 7 1 3 5 6 4 r p i j r 2 8 7 1 3 5 6 4 Frank Heitmann heitmann@informatik.uni-hamburg.de 29/57 Frank Heitmann heitmann@informatik.uni-hamburg.de 30/57 - Beispiel - Beispiel Algorithmus 6 Partition(A, p, r) Algorithmus 7 Partition(A, p, r) p i j r 2 8 7 1 3 5 6 4 p i j r 2 8 7 1 3 5 6 4 Frank Heitmann heitmann@informatik.uni-hamburg.de 31/57 Frank Heitmann heitmann@informatik.uni-hamburg.de 32/57

- Beispiel - Beispiel Algorithmus 8 Partition(A, p, r) Algorithmus 9 Partition(A, p, r) p i j r 2 1 7 8 3 5 6 4 p i j r 2 1 3 8 7 5 6 4 Frank Heitmann heitmann@informatik.uni-hamburg.de 33/57 Frank Heitmann heitmann@informatik.uni-hamburg.de 34/57 - Beispiel - Beispiel Algorithmus 10 Partition(A, p, r) Algorithmus 11 Partition(A, p, r) p i j r 2 1 3 8 7 5 6 4 p i r 2 1 3 8 7 5 6 4 Frank Heitmann heitmann@informatik.uni-hamburg.de 35/57 Frank Heitmann heitmann@informatik.uni-hamburg.de 36/57

- Beispiel Eine Schleifeninvariante Algorithmus 12 Partition(A, p, r) Das Feld ist während der Ausführung (von Partition) in vier Teile zerlegt. Diese lassen sich in einer Schleifeninvarianten formulieren: Für jeden Feldindex k gilt (zu Beginn jeder Iteration der for-schleife): p i r 2 1 3 4 7 5 6 8 (Der vierte Teil sind die Indizes zwischen j und r 1, deren Werte noch kein definiertes Verhältnis zu x haben.) Frank Heitmann heitmann@informatik.uni-hamburg.de 37/57 Frank Heitmann heitmann@informatik.uni-hamburg.de 38/57 Zur Illustration der Schleifeninvarianten Schleifeninvariante - Initialisierung Für jeden Feldindex k gilt (zu Beginn jeder Iteration der for-schleife): p i j r 2 1 3 8 7 5 6 4 i p j 2 8 7 1 3 5 6 4 r Initialisierung. i = p 1 und j = p. 1 und 2 gelten sofort. 3 ist auch erfüllt. (Wegen Zeile 1 im Sourcecode.) Frank Heitmann heitmann@informatik.uni-hamburg.de 39/57 Frank Heitmann heitmann@informatik.uni-hamburg.de 40/57

Schleifeninvariante - Fortsetzung 1 Schleifeninvariante - Fortsetzung 1 p i j r 2 1 3 8 7 5 6 4 p i j r 2 1 3 8 7 5 6 4 Fortsetzung 1. Ist A[j] > x, so wird in der Schleife nur j inkrementiert, danach gilt Bedingung 2 für A[j 1] und alles andere bleibt wie vorher weiter erfüllt. Fortsetzung 1. Ist A[j] > x, so wird in der Schleife nur j inkrementiert, danach gilt Bedingung 2 für A[j 1] und alles andere bleibt wie vorher weiter erfüllt. Frank Heitmann heitmann@informatik.uni-hamburg.de 41/57 Frank Heitmann heitmann@informatik.uni-hamburg.de 42/57 Schleifeninvariante - Fortsetzung 2 Schleifeninvariante - Fortsetzung 2 p i j r 2 8 7 1 3 5 6 4 p i j r 2 1 7 8 3 5 6 4 Fortsetzung 2. Ist A[j] x, so wird i inkrementiert, A[i] und A[j] vertauscht und dann j inkrementiert. Wegen des Tauschens ist nun (i und j sind inkrementiert!) A[i] x (Bedingung 1 erfüllt) und A[j 1] > x wegen der Schleifeninvarianten (Bedingung 2 erfüllt). Frank Heitmann heitmann@informatik.uni-hamburg.de 43/57 Fortsetzung 2. Ist A[j] x, so wird i inkrementiert, A[i] und A[j] vertauscht und dann j inkrementiert. Wegen des Tauschens ist nun (i und j sind inkrementiert!) A[i] x (Bedingung 1 erfüllt) und A[j 1] > x wegen der Schleifeninvarianten (Bedingung 2 erfüllt). Frank Heitmann heitmann@informatik.uni-hamburg.de 44/57

Schleifeninvariante - Terminierung Korrektheit von Quicksort p i r 2 1 3 8 7 5 6 4 Als letztes wird noch das Pivotelement A[r] an seinen richtigen Platz im Array gesetzt. Partition ist damit korrekt und daraus folgt dann auch die Korrektheit von Quicksort. Die Laufzeitanalyse ist komplizierter...... und wir werden das Thema hier nur ankratzen. Terminierung. Jetzt ist j = r, also gehört jedes Element des Arrays zu einer der drei Mengen. Frank Heitmann heitmann@informatik.uni-hamburg.de 45/57 Frank Heitmann heitmann@informatik.uni-hamburg.de 46/57 Worst-Case-Laufzeit Unbalanciert Die Laufzeit von hängt stark davon ab, ob die Zerlegung balanciert (die Teilarrays haben ungefähr die gleiche Größe) oder unbalanciert (ein Teilarray sehr viel größer als das andere) ist. Balanciertheit führt zu O(n log n). Unbalanciertheit führt zu O(n 2 ). Im schlechtesten Fall erzeugt die Zerlegungsroutine ein Teilproblem mit n 1 Elementen. Dies führt zu einer Rekurrenzgleichung der Art Was zu T (n) Θ(n 2 ) führt. T (n 1) + cn Dieser Fall tritt tatsächlich auf (z.b. auch bei einem sortierten Array!), so dass im worst-case tatsächlich eine Laufzeit von Θ(n 2 ) hat. Frank Heitmann heitmann@informatik.uni-hamburg.de 47/57 Frank Heitmann heitmann@informatik.uni-hamburg.de 48/57

Balanciert Abschließende Bemerkungen Teilt Partition hingegen gleichmässig, so erhalten wir eine Rekurrenzgleichung der Art 2T (n/2) + cn Was (Mastertheorem!) zu T (n) Θ(n log n) führt. (Die worst-case-laufzeit von liegt aber dennoch in Θ(n 2 )!) Anmerkung 1 Tatsächlich tritt der Fall einer balancierten Zerlegung meist auf, was unter anderem daran liegt, dass ein bißchen balanciert zu sein genügt. Die mittlerer Laufzeit (die normalerweise auftretende Laufzeit ) von ist also viel näher an der des besten Falls als an der des schlechtesten Falls, daher ist oft die beste Wahl für das Sortieren und in der Praxis häufig anzutreffen. (Insb. wegen des nur kleinen konstanten Faktors.) Um dies näher auszuführen braucht man Hilfsmittel aus der Stochastik, daher verzichten wir hier darauf. Näheres findet man in Kapitel 7.4.2 im [Cormen]. Anmerkung 2 In der Literatur findet man viele -Varianten, die sich insb. in der Wahl des Pivotelementes unterscheiden. Frank Heitmann heitmann@informatik.uni-hamburg.de 49/57 Frank Heitmann heitmann@informatik.uni-hamburg.de 50/57 - Zusammenfassung Zusammenfassung und Wiederholung sortiert ein Array von Zahlen, indem rekursiv das Array in zwei kleinere Arrays geteilt wird, wobei in dem einen Teilarray die kleineren in dem anderen die größeren Elemente bzgl. eines gewählten Pivotelementes sind. sortiert inplace. Die worst-case-laufzeit von ist in Θ(n 2 ). Die mittlere Laufzeit von ist in Θ(n log n). Die bessere Grenze von O(n log n) tritt sehr viel häufiger auf als die schlechtere. ist daher wegen seiner kleinen versteckten Konstanten (trotz der schlechten worst-case-laufzeit) ein sehr gutes Sortierverfahren. Wir haben heute mit Divide & Conquer eine neue Algorithmentechnik (ein Muster, ein Paradigma) kennengelernt. Größere Probleme werden in kleinere zerlegt, die dann seperat (und i.a. rekursiv) nach der gleichen Methode (!) gelöst werden. Die Teilergebnisse werden dann passend zur Lösung des Problems zusammengesetzt. Frank Heitmann heitmann@informatik.uni-hamburg.de 51/57 Frank Heitmann heitmann@informatik.uni-hamburg.de 52/57

Divide & Conquer Das Mastertheorem und Divide & Conquer Die drei Schritte des Divide & Conquer (Teile-und-Beherrsche) Paradigmas 1 Teile das Problem in n Teilprobleme auf 2 Beherrsche die Teilprobleme durch rekursives Lösen (d.h. teile sie weiter; sind die Teilprobleme hinreichend klein, löse sie direkt) 3 Verbinde die Lösungen der Teilprobleme zur Lösung des übergeordneten Problems und letztendlich des ursprünglichen Problems. Die Schritte finden auf jeder Rekursionsebene statt. Anmerkungen Rekursive Verfahren können auch iterativ implementiert werden. Das ist manchmal sinnvoll, manchmal nicht. (Siehe Anmerkungen im letzten Foliensatz.) Frank Heitmann heitmann@informatik.uni-hamburg.de 53/57 Hat man eine Gleichung { c falls n = 1 a T ( n b ) + f (n) falls n > 1 für einen Divide & Conquer Algorithmus, so gibt das a die Anzahl der Teilprobleme wieder, das n b die Größe der Teilprobleme und das f (n) den Zeitbedarf beim Teilen des Problems und/oder beim Zusammenfügen der Teillösungen. Frank Heitmann heitmann@informatik.uni-hamburg.de 54/57 Sortierverfahren Zum Algorithmenentwurf Wir haben dann und kennengelernt, zwei klassische Sortierverfahren. Idee der Verfahren? Ungefährer Ablauf? Idee beim Korrektheitsbeweis? Idee bei der Laufzeitanalyse? Laufzeit? Herausforderung für Interessierte Wie kann ein inplace realisiert werden? Will man ein D & C Algorithmus entwerfen: 1 Verstehe das Problem (evtl. hilft es einen Brute-Force-Algorithmus zu entwickeln). 2 Wie kann das Problem aufgeteilt werden? 3 Wie können die Einzelteile zusammengesetzt werden? Je nach Anzahl der Aufteilung, Größe der dabei enstehenden Instanzen und benötigte Zeit für die Aufteilung und Zusammenführung entstehen andere Rekurrenzgleichungen und damit oft auch andere Laufzeiten. Führt also eine Aufteilung nicht zum Ziel, kann man versuchen eine andere zu finden, was dann oft verschiedene Algorithmen zum Kombinieren nach sich zieht. Frank Heitmann heitmann@informatik.uni-hamburg.de 55/57 Frank Heitmann heitmann@informatik.uni-hamburg.de 56/57

Ausblick (Über-)Nächstes Mal: Klassische Datenstrukturen (Queue, Stack, Baum, Heap,...) Können diese für schnelleres Sortieren benutzt werden? HeapSort Können wir schneller sortieren als bei? Frank Heitmann heitmann@informatik.uni-hamburg.de 57/57