Übung Algorithmen I

Ähnliche Dokumente
Übung Algorithmen I

Übung Algorithmen I

INSTITUT FÜR THEORETISCHE INFORMATIK, PROF. SANDERS

Erinnerung VL vom

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

Übung Algorithmen I

4. Sortieren 4.1 Vorbemerkungen

Kapitel 6 Elementare Sortieralgorithmen

7. Übung zu Algorithmen I 1. Juni 2016

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

Übung Algorithmen und Datenstrukturen

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

Informatik II, SS 2014

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)

Technische Universität München


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

Kapitel 8 Fortgeschrittene Sortieralgorithmen

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

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

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

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

8. Übung zu Algorithmen I 15. Juni 2016

Algorithmen und Datenstrukturen 1

Programmiertechnik II

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

Übung: Algorithmen und Datenstrukturen SS 2007

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

Interne Sortierverfahren

Datenstrukturen und Algorithmen

Kapitel 2: Sortier- und Selektionsverfahren Gliederung

Algorithmen und Datenstrukturen

5. Übungsblatt zu Algorithmen I im SoSe 2016

Algorithmen und Datenstrukturen

7. Sortieren Lernziele. 7. Sortieren

2.2 Allgemeine (vergleichsbasierte) Sortierverfahren

JAVA - Suchen - Sortieren

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

2 Sortieren durch Vergleichen Eingabefolge a 1, a 2,..., a n 2, 1, 3 Sortieralg. Für festes n ist ein vergleichsbasierter Sortieralg. charakterisiert

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

Untere Schranke für allgemeine Sortierverfahren

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

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

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Quicksort ist ein Divide-and-Conquer-Verfahren.

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".

INSTITUT FÜR THEORETISCHE INFORMATIK, PROF. SANDERS

Algorithmen und Datenstrukturen Heapsort

Kapitel 9. Komplexität von Algorithmen und Sortieralgorithmen

Prof. Dr. Margarita Esponda

Übung Algorithmen I

Algorithmen und Datenstrukturen 1 Kapitel 5

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

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

Grundlegende Sortieralgorithmen

3.2. Korrektheit und Komplexität am Beispiel: Sortieren Sortieren ist eine wichtige Basis-Operation für komplexe Algorithmen

Tutoraufgabe 1 (Sortieralgorithmus):

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

Programmieren I. Kapitel 7. Sortieren und Suchen

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

Erster Sortier-Algorithmus: Bubblesort

Algorithmen und Datenstrukturen. Kapitel 3: Sortierverfahren. Skript zur Vorlesung. Algorithmen und Datenstrukturen

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

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

Grundlagen: Algorithmen und Datenstrukturen

Sortieren durch Einfügen. Prof. Dr. W. Kowalk Sortieren durch Einfügen 1

Algorithmen und Datenstrukturen

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

Suchen und Sortieren (Die klassischen Algorithmen)

Suchen und Sortieren Sortieren. Heaps

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

Vorlesung Programmieren

Abschnitt: Algorithmendesign und Laufzeitanalyse

Bucketsort. Korrektheit. Beispiel. Eingabe: Array A mit n Elementen im Bereich [0,1) Annahme: die Elemente sind in [0,1) gleichverteilt.

Build-Max-Heap. Build-Max-HeappAq. Satz Nach Ablauf von Build-Max-Heap ist A ein Heap. Build-Max-Heap hat Laufzeit Opnq.

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

Algorithmen und Datenstrukturen (Th. Ottmann und P. Widmayer) Folien: Spezielle Sortierverfahren Autor: Sven Schuierer

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

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

Algorithmen und Datenstrukturen

Informatik II, SS 2014

Asymptotik und Laufzeitanalyse

Sortieralgorithmen. Selection Sort

Algorithmen und Datenstrukturen

Counting - Sort [ [ ] [ [ ] 1. SS 2008 Datenstrukturen und Algorithmen Sortieren in linearer Zeit

Komplexität von Algorithmen OOPM, Ralf Lämmel

UE Algorithmen und Datenstrukturen 1 UE Praktische Informatik 1. Übung 9. Sortieren

Algorithmen und Datenstrukturen

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

Algorithmen und Datenstrukturen

Datenstrukturen und Algorithmen

Algorithmen und Datenstrukturen 1-3. Seminar -

3. Übungsblatt zu Algorithmen I im SoSe 2017

Kapitel 3 Zur Korrektheit und Effizienz von Algorithmen

Sortierte Folgen 250

Algorithmen und Datenstrukturen

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

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

Algorithmen und Datenstrukturen Tutorium I

Transkript:

Übung Algorithmen I 24.5.17 Sascha Witt sascha.witt@kit.edu (Mit Folien von Lukas Barth, Julian Arz, Timo Bingmann, Sebastian Schlag und Christoph Striecks)

Organisatorisches Übungsklausur Am 21.06.2017 (anstatt Vorlesung/Übung) Nur zur persönlichen Lernkontrolle. Flieÿt nicht in die Note mit ein.

Roadmap Sortieren Kleine Wiederholung Visualisierungen Adaptives Sortieren Kennzahlen für Chaos Split Sort Reales Sortieren

Rückblick: Insertion Sort Procedure insertionsort(a : Array [1..n] of Element) for i := 2 to n do invariant a[1] a[i 1] move a[i] to the right place Beispiel:, 4, 7, 1, 1 4, 7, 1, 1 4, 7, 1, 1 1, 4, 7, 1 1, 1, 4, 7,

Rückblick: Insertion Sort Procedure insertionsort(a : Array [1..n] of Element) for i := 2 to n do invariant a[1] a[i 1] move a[i] to the right place Beispiel:, 4, 7, 1, 1 4, 7, 1, 1 4, 7, 1, 1 1, 4, 7, 1 1, 1, 4, 7, Wie in-place?

Rückblick: Insertion Sort Procedure insertionsort(a : Array [1..n] of Element) for i := 2 to n do invariant a[1] a[i 1] move a[i] to the right place Beispiel:, 4, 7, 1, 1 4, 7, 1, 1 4, 7, 1, 1 1, 4, 7, 1 1, 1, 4, 7, Wie in-place?

Sortieren durch Einfügen: Variante 1 Procedure insertionsort(a : Array [1..n] of Element) for i := 2 to n do invariant a[1] a[i 1] // move a[i] to the right place e := a[i] j := i while j > 1 and a[j 1] > e do a[j] := a[j 1] j := j 1 a[j] := e

Sentinels am Beispiel Sortieren durch Einfügen Procedure insertionsort(a : Array [1..n] of Element) for i := 2 to n do invariant a[1] a[i 1] // move a[i] to the right place e := a[i] if e < a[1] then // new minimum else for j := i downto 2 do a[j] := a[j 1] a[1] := e j := i while a[j 1] > e do a[j] := a[j 1] j := j 1 a[j] := e // use a[1] as a sentinel

Anschaulich... Sound of Sorting https://github.com/bingmann/sound-of-sorting http://panthema.net/2013/sound-of-sorting

Anschaulich... Sound of Sorting https://github.com/bingmann/sound-of-sorting http://panthema.net/2013/sound-of-sorting Volkstänze www.youtube.com/user/algorythmics/videos

Adaptives Sortieren Warm-Up Folge 1 1 3 2 4 6 5 7 8 Folge 2 8 2 7 1 5 6 3 4

Adaptives Sortieren Warm-Up Folge 1 1 3 2 4 6 5 7 8 Nur zwei Paare vertauscht Folge 2 8 2 7 1 5 6 3 4 Ziemliches Chaos

Adaptives Sortieren Warm-Up Folge 1 1 3 2 4 6 5 7 8 Nur zwei Paare vertauscht Folge 2 8 2 7 1 5 6 3 4 Ziemliches Chaos Inversion Paar (i, j) N 2 mit i < j und a[i] > a[j] (wenn aufsteigend sortiert werden soll... )

Adaptives Sortieren Warm-Up II Folge 3 6 7 8 9 0 1 2 3 4 5

Adaptives Sortieren Warm-Up II Folge 3 6 7 8 9 0 1 2 3 4 5 Wirkt irgendwie sortiert, aber viele Inversionen

Adaptives Sortieren Warm-Up II Folge 3 6 7 8 9 0 1 2 3 4 5 Wirkt irgendwie sortiert, aber viele Inversionen Run Sortierte (zusammenhängende) Teilfolge

Adaptives Sortieren Warm-Up II Folge 3 6 7 8 9 0 1 2 3 4 5 Wirkt irgendwie sortiert, aber viele Inversionen Run Sortierte (zusammenhängende) Teilfolge Folge 3 hat zwei Runs

Adaptives Sortieren Sortieren Untere Schranke Ω (n log n) Keine Annahme über Eingabedaten

Adaptives Sortieren Sortieren Untere Schranke Ω (n log n) Keine Annahme über Eingabedaten Adaptives Sortieren Eingabedaten schon Ein bisschen sortiert Laufzeit steigt mit Länge n und Chaos m Kennzahlen für Chaos? (Oder Vorsortiertheit...)

Insertion Sort Adaptiv? Procedure insertionsort(a : Array [1..n] of Element) for i := 2 to n do invariant a[1] a[i 1] // move a[i] to the right place e := a[i] j := i 1 while j > 1 and a[j] > e do a[j + 1] := a[j] j := j 1 a[j] := e

Insertion Sort Adaptiv? Procedure insertionsort(a : Array [1..n] of Element) for i := 2 to n do invariant a[1] a[i 1] // move a[i] to the right place e := a[i] j := i 1 while j > 1 and a[j] > e do a[j + 1] := a[j] j := j 1 a[j] := e (n 1) + I (a) Schleifendurchläufe

Insertion Sort Erwartete Laufzeit Wie viele Inversionen erwarten wir?

Insertion Sort Erwartete Laufzeit Wie viele Inversionen erwarten wir? Annahme: Alle Elemente verschieden und die Eingabe ist eine zufällige Permutation von n Elementen. Jede der n! Permutationen σ ist gleich wahrscheinlich. Best Case: Alles sortiert keine Inversionen Worst Case: Alles umgekehrt sortiert: ( n 2) Inversionen

Insertion Sort Average Case Wir zählen die erwartete Anzahl von Inversionen: Für eine Permutation σ S n sei { 1 falls (i, j) eine Inversion in σ, X i,j (σ) := 0 sonst.

Insertion Sort Average Case Wir zählen die erwartete Anzahl von Inversionen: Für eine Permutation σ S n sei { 1 falls (i, j) eine Inversion in σ, X i,j (σ) := 0 sonst. Also ist X (σ) := i<j X i,j (σ) die Anzahl von Inversionen und ( ) E(X (σ)) = E X i,j (σ) = E(X i,j (σ)). i<j i<j

Insertion Sort Average Case ( ) E(X (σ)) = E X i,j (σ) = i<j 1 i<j n E(X i,j (σ)).

Insertion Sort Average Case Erinnerung ( ) E(X (σ)) = E X i,j (σ) = i<j 1 i<j n Alle Permutationen gleich wahrscheinlich! E(X i,j (σ)).

Insertion Sort Average Case Erinnerung ( ) E(X (σ)) = E X i,j (σ) = i<j 1 i<j n Alle Permutationen gleich wahrscheinlich! E(X i,j (σ)). E(X i,j (σ)) = 1 2

Insertion Sort Average Case Erinnerung ( ) E(X (σ)) = E X i,j (σ) = i<j 1 i<j n Alle Permutationen gleich wahrscheinlich! E(X i,j (σ)). E(X (σ)) = 1 i<j n E(X i,j (σ)) = 1 2 ( ) n E(X i,j (σ)) = 1 n(n 1) = 1 2 2 2 2

Natural Merge Sort Idee Liste nicht bis auf ein-elementige Listen aufspalten Nutze Runs aus (6 7 8 9 0 1 2 3 4 5)

Runs Wie groÿ werden die Runs?

Runs Erwartete Anzahl von Runs Für festes n sei # k die Anzahl der Permutationen von n Elementen mit k Runs.

Runs Erwartete Anzahl von Runs Für festes n sei # k die Anzahl der Permutationen von n Elementen 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 von n Elementen 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 von n Elementen 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.

Runs Erwartete Anzahl von Runs Für festes n sei # k die Anzahl der Permutationen von n Elementen 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

Runs Erwartete Anzahl von Runs Für festes n sei # k die Anzahl der Permutationen von n Elementen 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

Runs Erwartete Anzahl von Runs E(R(σ)) = σ S n p(σ) R(σ) = n k=1 # k n! k

Runs Erwartete Anzahl von Runs 2 E(R(σ)) = 2 σ S n p(σ) R(σ) = 2 n k=1 # k n! k

Runs Erwartete Anzahl von Runs 2 E(R(σ)) = 2 n # k p(σ) R(σ) = 2 n! k σ S n k=1 n # k n = n! k + # n k+1 (n k + 1) } n! {{} k=1 k=1 Indexvertauschung

Runs Erwartete Anzahl von Runs 2 E(R(σ)) = n k=1 # k n! k + n k=1 # n k+1 (n k + 1) n!

Runs Erwartete Anzahl von Runs # k = # n k+1 n 2 E(R(σ)) = (1) = = k=1 n k=1 n k=1 # k n! k + n k=1 # k n! k + n k=1 # n k+1 (n k + 1) n! # k (n k + 1) n! # k n + 1 (k + (n k + 1)) = n! n! n k=1 (1) # k = n + 1 n! n!

Runs Erwartete Anzahl von Runs # k = # n k+1 n 2 E(R(σ)) = (1) = = k=1 n k=1 n k=1 # k n! k + n k=1 # k n! k + n k=1 # n k+1 (n k + 1) n! # k (n k + 1) n! # k n + 1 (k + (n k + 1)) = n! n! n k=1 (1) # k = n + 1 n! n! Daraus folgt: E(R(σ)) = n + 1 2

Removals Folge 4 2 3 4 0 5 6 1 7 8 9

Removals Folge 4 2 3 4 0 5 6 1 7 8 9 Einzelne Entfernungen führen zu sortierter (Teil-)Liste

Removals Folge 4 2 3 4 0 5 6 1 7 8 9 Einzelne Entfernungen führen zu sortierter (Teil-)Liste Split Sort Nutze Removals aus Asymptotisch optimal bezüglich Removals (und Inversionen!) Levcopoulos, C., & Petersson, O. (1991). Splitsortan adaptive sorting algorithm. Information Processing Letters, 39(4), 205-211.

Split Sort Procedure splitsort(a : Array [1..n] of Element) split(a, a G, a S ) if a S > 1 then splitsort(a S ) splitsort(a G ) merge(a, a G, a S )

Split Sort Procedure splitsort(a : Array [1..n] of Element) split(a, a G, a S ) if a S > 1 then splitsort(a S ) splitsort(a G ) merge(a, a G, a S ) Splitting Finde Paare, an denen Abstiege sind Verschiebe diese in a G bzw. a S

Split Sort

Split Sort

Split Sort

Split Sort

Split Sort

Split Sort

Split Sort

Adaptives Sortieren Zusammenfassung Idee: Vorsortierung ausnutzen! Maÿzahlen für Chaos / Vorsortiertheit Inversionen Insertion Sort Runs Natural Merge Sort Removals Split Sort... und viele mehr!

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

Vorgefertigte Sortieralgorithmen in aktuellen Programmiersprachen Hinweis: Verwendet diese Sortieralgorithmen anstatt eigene zu implementieren! Auÿer, wenn ihr einen Sortieralgorithmus implementieren sollt (oder wollt).

C++ Mischung aus Quick-Sort, Heapsort und Insertion Sort #include <algorithm> //... std::vector<int> vec = {42, 7, 9, 18, 1, 123}; std::sort(vec.begin(), vec.end()); std::sort(vec.begin(), vec.end(), std::greater<>()); Alternative, für (per se) ungeordnete Dinge: auto vec = getelements(); auto comp = [](auto&& lhs, auto&& rhs) {... }; std::sort(vec.begin(), vec.end(), comp); //...oder... std::stable_sort(vec.begin(), vec.end(), comp);

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);