Übung Algorithmen I

Ähnliche Dokumente
Übung Algorithmen I

4. Sortieren 4.1 Vorbemerkungen

INSTITUT FÜR THEORETISCHE INFORMATIK, PROF. SANDERS

Algorithmen und Datenstrukturen

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

Übung: Algorithmen und Datenstrukturen SS 2007

Abschnitt: Algorithmendesign und Laufzeitanalyse

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

Erinnerung VL vom

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

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

Informatik II, SS 2014

Algorithmen und Datenstrukturen SS09. Foliensatz 15. Michael Brinkmeier. Technische Universität Ilmenau Institut für Theoretische Informatik

Quicksort ist ein Divide-and-Conquer-Verfahren.

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

Kapitel 6 Elementare Sortieralgorithmen

Algorithmen und Datenstrukturen (Th. Ottmann und P. Widmayer) Folien: Einfache Sortierverfahren Autor: Stefan Edelkamp

JAVA - Suchen - Sortieren

Übung Datenstrukturen. Sortieren

Alle bislang betrachteten Sortieralgorithmen hatten (worst-case) Laufzeit Ω(nlog(n)).

Sortieren durch Mischen (Mergesort; John von Neumann 1945)

7. Übung zu Algorithmen I 1. Juni 2016

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

Programmieren I. Kapitel 7. Sortieren und Suchen

Abgabe: (vor der Vorlesung) Aufgabe 2.1 (P) O-Notation Beweisen Sie die folgenden Aussagen für positive Funktionen f und g:

Übung Algorithmen I

Übungsblatt 1. f(n) = f(n) = O(g(n)) g(n) = O(f(n)) Zeigen oder widerlegen Sie: 3 n = Θ(2 n ) Aufgabe 1.2 Gegeben sei die folgende Funktion:

Algorithmen und Datenstrukturen Wintersemester 2004/ November T(n) = T(n a) + T(a) + n

Übung Algorithmen und Datenstrukturen

Programmiertechnik II

Algorithmen und Datenstrukturen 1-3. Seminar -

Sortieralgorithmen. Selection Sort

2.2 Allgemeine (vergleichsbasierte) Sortierverfahren

Grundlegende Sortieralgorithmen

Algorithmen I. Prof. Jörn Müller-Quade Institut für Theoretische Informatik Web:

Denition: Rang eines Elements e einer Folge s = Position von e in sort(s) (angefangen bei 1). Frage: warum ist r nicht notwendig eindeutig?

Algorithmen und Datenstrukturen

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

Algorithmen und Datenstrukturen

Die Schnittstelle Comparable

Sortieren durch Einfügen (Insertion Sort) fügt die restlichen Elemente nach und nach in die bereits sortierte Liste der abgearbeiteten Zahlen.

Erster Sortier-Algorithmus: Bubblesort


Vorlesung Informatik 2 Algorithmen und Datenstrukturen. (25 Sortieren vorsortierter Daten)

Asymptotische Laufzeitanalyse: Beispiel

2. Felder (Arrays) 2.1 Suchen in Feldern. lineares Suchen: siehe Kapitel 1. Binäres Suchen. Vor.: Elemente (z.b. aufsteigend) sortiert

Grundlagen der Programmierung 2. Sortierverfahren

Datenstrukturen und Algorithmen

Pro Informatik 2009: Objektorientierte Programmierung Tag 17. Marco Block-Berlitz, Miao Wang Freie Universität Berlin, Institut für Informatik

Algorithmen und Datenstrukturen 1

8. Übung zu Algorithmen I 15. Juni 2016

5. Übungsblatt zu Algorithmen I im SoSe 2016

Algorithmen und Datenstrukturen

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

Interne Sortierverfahren

Datenstrukturen und Algorithmen. 7. Suchen in linearen Feldern

Lineare Kongruenzgeneratoren und Quicksort

Folge 13 - Quicksort

Sortierverfahren. Sortierverfahren für eindimensionale Arrays

3. Übungsblatt zu Algorithmen I im SoSe 2017

Grundlagen: Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

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

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Kapitel 8 Fortgeschrittene Sortieralgorithmen

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

Suchen und Sortieren (Die klassischen Algorithmen)

damit hätten wir nach Ende der Schleife: "a[0 n-1] enthält nur Elemente aus a[0 n-1], aber in sortierter Reihenfolge".

Übung Algorithmen und Datenstrukturen

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

2. Effizienz von Algorithmen

Tutoraufgabe 1 (Sortieralgorithmus):

> Parallele Systeme Übung: 4. Übungsblatt Philipp Kegel Wintersemester 2012/2013. Parallele und Verteilte Systeme, Institut für Informatik

Algorithmen und Datenstrukturen (Th. Ottmann und P. Widmayer) Folien: Suchverfahren Autor: Stefan Edelkamp / Sven Schuierer

Kapitel 2: Sortier- und Selektionsverfahren Gliederung

Prof. Dr. Margarita Esponda

Divide & Conquer. Problem in Teilprobleme aufteilen Teilprobleme rekursiv lösen Lösung aus Teillösungen zusammensetzen

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Übersicht. Berechnung der Potenz für zwei ganze Zahlen Klausuraufgabe SS 2010! Berechnung der Cosinus-Funktion Klausuraufgabe WS 2010/2011!

Algorithmentheorie Randomisierung. Robert Elsässer

Suchen und Sortieren

Übung Algorithmen und Datenstrukturen

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)

7. Sortieren Lernziele. 7. Sortieren

Technische Universität München

Übung Algorithmen I

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

Informatik II Sortieralgorithmen

7. Parallele Algorithmen für FPGA-Implementierungen

Sortieralgorithmen und Binäre Suche Software Entwicklung 1

Suchen und Sortieren

Datenstrukturen und Algorithmen

Termine für Übungstests. Kap. 3 Sortieren HeapSort ff Priority Queues. Motivation. Überblick. Analyse SiftDown

2.3.1 Einleitung Einfache Sortierverfahren Höhere Sortierverfahren Komplexität von Sortierverfahren Spezielle Sortierverfahren

Übungsklausur Algorithmen I

Untere Schranke für allgemeine Sortierverfahren

lim log 2n n = > 0 Da es einen Limes gibt, gibt es auch einen Limes inferior, der gleich diesem Limes ist.

Konvexe Hülle. Abbildung: [Wikipedia]: Nicht-konvexe Menge (links), konvexe Menge (rechts) KIT Institut für Theoretische Informatik 510

Algorithmen und Datenstrukturen

Transkript:

Übung Algorithmen I 20.5.15 Christoph Striecks Christoph.Striecks@kit.edu (Mit Folien von Julian Arz, Timo Bingmann und Sebastian Schlag.)

Roadmap Organisation Mergesort, Quicksort Dual Pivot Quicksort Vorsortiertheit und adaptive Sortieren

Organisation Übungsblatt 5, Aufgabe 1c): Σ = {A, b, e, g, h, i, l, m, n, o, r, t}

Sortieren durch Mischen Idee: Teile und Herrsche Function mergesort( e 1,...,e n ) : Sequence of Element if n = 1 then return e 1 // base case else return merge( mergesort( e 1,...,e n/2 ), mergesort( e n/2 +1,...,e n )) Gegeben: zwei sortierte Folgen a und b Berechne: sortierte Folge der Elemente aus a und b 172

Merge Sort Function mergesort(a : Array of Element; lo, hi : N) if hi lo 1 then return // Basisfall mid := (lo + hi)/2 // mittleres Element mergesort(lo, mid), mergesort(mid, hi) // Sortiere Hälften T := allocate (Array of Element size hi lo) i := lo, j := mid, k := 0 // Laufindizes while i < mid j < hi if A[i] < A[j] T [k++] := A[i++] // Mische! else T [k++] := A[j++] endwhile while i < mid do T [k++] := A[i++] // Kopiere Reste while j < hi do T [k++] := A[j++] A[lo,..., hi 1] := T [0,..., (hi lo) 1] // Kopiere zurück dispose (T ) Worst case: Θ(n log n), average case Θ(n log n).

Tatsächliche Laufzeit einer Implementierung Average case: Θ(n log n) n = 100, 100 log 2 100 664 (Demo)

Quicksort erster Versuch Idee: Teile-und-Herrsche aber verglichen mit mergesort andersrum. Leiste Arbeit vor rekursivem Aufruf Function quicksort(s : Sequence of Element) : Sequence of Element if s 1 then return s pick some p s a:= e s : e < p b:= e s : e = p c:= e s : e > p return concatenation of quicksort(a), b, and quicksort(c) 182

Quicksort Analyse im schlechtesten Fall Annahme: Pivot ist immer Minimum (oder Max.) der Eingabe { Θ(1) if n = 1, T (n) = Θ(n) + T (n 1) if n 2. T (n) = Θ(n + (n 1) + + 1) = Θ ( n 2) 183

Schlechtester Fall: Beispiel 184

Quicksort Analyse im besten Fall Annahme: Pivot ist immer Median der Eingabe { O(1) if n = 1, T (n) O(n) + 2T ( n/2 ) if n 2. (Master-Theorem) T (n) = O(n log n) Problem: Median bestimmen ist nicht so einfach 185

Satz: C(n) 2n ln n 1.45n log n C(n) = = n n i=1 j=i+1 n n i+1 i=1 k=2 n n 2 k i=1 k=2 n =2n k=2 1 k 2 j i + 1 2 k =2n(H n 1) 2n(1 + ln n 1) = 2n ln n. i j =:k {}}{ j i + 1 1 2..n 2..n 2 3..n 2..n 1 3 4..n 2..n 2... n 1 n..n 2..2 n /0 /0 (harmonische Summe) 191

Einige Quicksort-Analysen Hoare (1962) Ur -Quicksort Average Case für 1 zufällig gewähltes Pivot für n = 100 erwartete Vergleiche: = 2n(H n 1) 837, 5 2n log e n 921, 0 (Demo.) Wild, Nebel (2012) Yaroslavskiy -Quicksort Average Case für 2 zufällig gewählte Pivots erwartete Vergleiche: für n = 100 = 1.9n log e n 2.46n + O(log n) 629 + O(log 100)

Vorgefertigte Sortieralgorithmen in aktuellen Programmiersprachen Hinweis: Verwenden Sie diese Sortieralgorithmen anstatt eigene zu implementieren!

C++ Zahlen: Variante von Quick-Sort #include <algorithm> int numbers[] = {42, 7, 9, 18, 1, 123}; std::vector<int> vec(numbers, numbers + 6); std::sort(vec.begin(), vec.end()) Allgemeine Elemente: Variante von Merge-Sort #include <algorithm> bool less_than(elements& a, Elements& b) { /*...*/ }... Elements* elements = createelements(n); std::sort(elements, elements + n, less_than)...oder... std::stable_sort(elements, elements + n, less_than)

Java Zahlen: Variante von Quick-Sort int[] numbers = {42, 7, 9, 18, 1, 123}; java.util.arrays.sort(numbers) Allgemeine Elemente: Variante von Merge-Sort Comparator<Elem> comparator = new Comparator<Elem> { int compare(elem a, Elem b) { /*...*/ } } Elem[] elements = { /*...*/ } java.util.arrays.sort(elements, 3, 15, comparator)

Dual Pivot Quicksort

Dual Pivot Quicksort Idee: Partitioniere Eingabe in 3 Teile durch 2 Pivot-Elemente p q Historisch: [Sedgewick 1975], [Hennequin 1991] keine Verbesserung durch Multi-Pivot-Ansatz in Theorie und Praxis Sind die nächsten 15 Minuten also reine Zeitverschwendung? Nein. 2009: [Yaroslavskiy 2009] praktisch & theoretisch besser als Implementierung der Bibliothek 2011: Dual Pivot Quicksort wird Standard in Java 7 2012: Average-case-Analyse [Wild, Nebel 2012]

Dual Pivot Quicksort 1. Wähle 2 Pivotelemente p q 2. Klassifiziere Elemente in: klein wenn < p mittel wenn p q groß wenn q < 3. Ordne alle Elemente entsprechend ihrer Klasse: < p p p q q > q 4. Sortierte die 3 Teilbereiche rekursiv

Partitionierung mit 2 Pivots Fall a[k] < p: p k l? g q Partitionierung: look @ k look @ g < p? > q? swap(k, l) < q? skip look @ g < p? skip swap(g, k, l) swap(g, k)

Partitionierung mit 2 Pivots Fall a[k] < p: p k l? g q Partitionierung: look @ k look @ g < p? > q? swap(k, l) < q? skip look @ g < p? skip swap(g, k, l) swap(g, k)

Partitionierung mit 2 Pivots Fall p a[k] q: p k l? g q Partitionierung: look @ k look @ g < p? > q? swap(k, l) < q? skip look @ g < p? skip swap(g, k, l) swap(g, k)

Partitionierung mit 2 Pivots Fall p a[k] q: p l k? g q Partitionierung: look @ k look @ g < p? > q? swap(k, l) < q? skip look @ g < p? skip swap(g, k, l) swap(g, k)

Partitionierung mit 2 Pivots p < p l k? g q Partitionierung: look @ k look @ g < p? > q? swap(k, l) < q? skip look @ g < p? skip swap(g, k, l) swap(g, k)

Partitionierung mit 2 Pivots Fall q a[k]: p < p l k? g q Partitionierung: look @ k look @ g < p? > q? swap(k, l) < q? skip look @ g < p? skip swap(g, k, l) swap(g, k)

Partitionierung mit 2 Pivots Fall q a[k]: p < p l k? g q Partitionierung: look @ k look @ g < p? > q? swap(k, l) < q? skip look @ g < p? skip swap(g, k, l) swap(g, k)

Partitionierung mit 2 Pivots Fall q a[k] a[g] > q: p < p l k? g q Partitionierung: look @ k look @ g < p? > q? swap(k, l) < q? skip look @ g < p? skip swap(g, k, l) swap(g, k)

Partitionierung mit 2 Pivots Fall q a[k] a[g] > q: p < p l k? g q Partitionierung: look @ k look @ g < p? > q? swap(k, l) < q? skip look @ g < p? skip swap(g, k, l) swap(g, k)

Partitionierung mit 2 Pivots Fall q a[k] p a[g] q: p < p l k? g q Partitionierung: look @ k look @ g < p? > q? swap(k, l) < q? skip look @ g < p? skip swap(g, k, l) swap(g, k)

Partitionierung mit 2 Pivots Fall q a[k] p a[g] q: p < p l k? g q Partitionierung: look @ k look @ g < p? > q? swap(k, l) < q? skip look @ g < p? skip swap(g, k, l) swap(g, k)

Partitionierung mit 2 Pivots p < p l p q k? g q Partitionierung: look @ k look @ g < p? > q? swap(k, l) < q? skip look @ g < p? skip swap(g, k, l) swap(g, k)

Partitionierung mit 2 Pivots Fall q a[k] a[g] < p: p < p l p q k? g q Partitionierung: look @ k look @ g < p? > q? swap(k, l) < q? skip look @ g < p? skip swap(g, k, l) swap(g, k)

Partitionierung mit 2 Pivots Fall q a[k] a[g] < p: p < p l p q k? g > q q Partitionierung: look @ k look @ g < p? > q? swap(k, l) < q? skip look @ g < p? skip swap(g, k, l) swap(g, k)

Einige Quicksort-Analysen Hoare (1962) Ur -Quicksort Average Case für 1 zufällig gewähltes Pivot für n = 100 erwartete Vergleiche: = 2n(H n 1) 837, 5 2n log e n 921, 0 Wild, Nebel (2012) Yaroslavskiy -Quicksort Average Case für 2 zufällig gewählte Pivots erwartete Vergleiche: für n = 100 = 1.9n log e n 2.46n + O(log n) 629 + O(log 100) (Demo.)

Kennzahlen der Vorsortiertheit und adaptive Sortierverfahren

Adaptives Sortieren Warm-up Sortieren Sie diese Zahlenfolgen: 1 3 2 4 6 5 7 8 8 2 7 1 5 6 3 4

Adaptives Sortieren Warm-up Sortieren Sie diese Zahlenfolgen: 1 3 2 4 6 5 7 8 Nur zwei Inversionen Einfach! 8 2 7 1 5 6 3 4 Nicht so einfach! (17 Inversionen)

Adaptives Sortieren Sortieren Worst und average case: Ω (n log n) ist untere Schranke Für zufällige Permutationen Aber: nutze bestimmte Eigenschaften der Folge aus Adaptives Sortieren: Laufzeit steigt mit Länge n und Chaos m Chaos? Unsortiertheit? Vorsortiertheit? Ist dieses Chaos messbar? Ja. Kennzahlen der Vorsortiertheit Englisch: measures of presortedness oder measures of disorder

Adaptives Sortieren Kennzahlen der Vorsortiertheit Inversionen Runs Größte Distanz zwischen Inversionen Größte Distanz zur korrekten Position Vertauschungen Verschachtelte Listen Removals SUS SMS Oszillationen Alle anderen zusammen

Adaptives Sortieren Kennzahlen der Vorsortiertheit Inversionen Runs Größte Distanz zwischen Inversionen Größte Distanz zur korrekten Position Vertauschungen Verschachtelte Listen Removals SUS SMS Oszillationen Alle anderen zusammen

Adaptives Sortieren Kennzahlen der Vorsortiertheit Inversionen Inversion: Paar (i, j) N 2 mit i < j und σ(i) > σ(j) Siehe Übung letzte Woche Best case m inv = 0, worst case m inv = n (n 1) 2 = Θ ( n 2) Average case m inv = ( ) n 2 1 2 = Θ( n 2) Adaptiv bzgl. m inv : Insertion Sort O(m inv ) Vertauschungen, O(n + m inv ) Vergleiche

Adaptives Sortieren Kennzahlen der Vorsortiertheit Inversionen Nachteil: Lokale Sortiertheit wird nicht erkannt. Beispiel: 5 6 7 8 9 0 1 2 3 4 Quadratische Anzahl von Inversionen, aber einfach zu sortieren Runs Ein Run ist eine zusammenhängende Teilfolge aufsteigend sortierter Elemente Das obige Beispiel hat 2 Runs. Best case m runs = 1, worst case m runs = n Average case?

Runs Erwartete Anzahl von Runs Für festes n sei # k die Anzahl der Permutationen mit k Runs. Beobachtung: Permutation mit k Runs hat k 1 Abstiege

Runs Erwartete Anzahl von Runs Für festes n sei # k die Anzahl der Permutationen mit k Runs. Beobachtung: Permutation mit k Runs hat k 1 Abstiege

Runs Erwartete Anzahl von Runs Für festes n sei # k die Anzahl der Permutationen mit k Runs. Beobachtung: Permutation mit k Runs hat k 1 Abstiege

Runs Erwartete Anzahl von Runs Für festes n sei # k die Anzahl der Permutationen mit k Runs. Beobachtung: Permutation mit k Runs hat k 1 Abstiege

Runs Erwartete Anzahl von Runs Für festes n sei # k die Anzahl der Permutationen mit k Runs. Beobachtung: Permutation mit k Runs hat k 1 Abstiege Rückwärts gelesen hat sie n (k 1) = n k + 1 Runs. Bijektion von Permutationen mit k Runs auf Permutationen mit n k + 1 Runs # k = # n k+1 E(R(σ)) = σ S n p(σ) R(σ) = n k=1 # k n! k

Runs Erwartete Anzahl von Runs 2 E(R(σ)) = 2 = = n k=1 n k=1 n k=1 # k n! k = n k=1 # k n! k + n k=1 # k n! k + n s. letzte Folie {}}{ # k n! k=1 (n k + 1) # k n + 1 (k + (n k + 1)) = n! n! Indexvertauschung {}}{ # n k+1 (n k + 1) n! n k=1 # k = n + 1 n! n! Daraus folgt: E(R(σ)) = n + 1 2

Runs Adaptives Sortieren 3 8 4 7 2 6 1 8

Runs Adaptives Sortieren 3 8 4 7 2 6 1 8 3 8 4 7 2 6 1 8

Runs Adaptives Sortieren 3 8 4 7 2 6 1 8 3 8 4 7 2 6 1 8 Idee: Mergesort!

Runs Adaptives Sortieren 3 8 4 7 2 6 1 8 3 8 4 7 2 6 1 8 Idee: Mergesort!

Runs Adaptives Sortieren 3 8 4 7 2 6 1 8 3 8 4 7 2 6 1 8 Idee: Mergesort! 3

Runs Adaptives Sortieren 3 8 4 7 2 6 1 8 3 8 4 7 2 6 1 8 Idee: Mergesort! 3 4

Runs Adaptives Sortieren 3 8 4 7 2 6 1 8 3 8 4 7 2 6 1 8 Idee: Mergesort! 3 4 7

Runs Adaptives Sortieren 3 8 4 7 2 6 1 8 3 8 4 7 2 6 1 8 Idee: Mergesort! 3 4 7 8

Runs Adaptives Sortieren 3 8 4 7 2 6 1 8 3 8 4 7 2 6 1 8 Idee: Mergesort! 3 4 7 8 1 2 6 8

Runs Adaptives Sortieren 3 8 4 7 2 6 1 8 3 8 4 7 2 6 1 8 Idee: Mergesort! 3 4 7 8 1 2 6 8

Runs Adaptives Sortieren 3 8 4 7 2 6 1 8 3 8 4 7 2 6 1 8 Idee: Mergesort! 3 4 7 8 1 2 6 8 1

Runs Adaptives Sortieren 3 8 4 7 2 6 1 8 3 8 4 7 2 6 1 8 Idee: Mergesort! 3 4 7 8 1 2 6 8 1 2

Runs Adaptives Sortieren 3 8 4 7 2 6 1 8 3 8 4 7 2 6 1 8 Idee: Mergesort! 3 4 7 8 1 2 6 8 1 2 3 4 5 6 7 8

Runs Adaptives Sortieren 3 8 4 7 2 6 1 8 3 8 4 7 2 6 1 8 Idee: Mergesort! 3 4 7 8 1 2 6 8 1 2 3 4 5 6 7 8 Natürlicher Mergesort Laufzeit O(n + n log m runs )

Adaptives Sortieren Kennzahlen der Vorsortiertheit Runs Nachteil: Globale Sortiertheit wird nicht erkannt Beispiel: 1 0 3 2 5 4 7 6 8 Viele Runs, aber nur zwei ineinander verschränkte aufsteigende Teilsequenzen Removals Removals: minimale Anzahl von Elementen, deren Löschen eine sortierte Folge erzeugt Das Beispiel hat eine längste aufsteigende Teilsequenz der Länge 5 m rem = 4 Best case: m rem = 0; worst case: m rem = n 1