Übung Algorithmen und Datenstrukturen Sommersemester 2015 Marc Bux, Humboldt-Universität zu Berlin Organisatorisches • Übungsgruppen, die sich über mehrere Termine erstrecken, sind nicht zulässig! • Weiterleitung der Nachrichten bei GOYA einrichten! • Fragen? 2 Agenda 1. Vollständige Induktion und Rekursive Algorithmen 2. Besprechung des ersten Übungsblatts (Fortsetzung) 3. Vorstellen des zweiten Übungsblatts 3 Vollständige Induktion • Beweismethode für den Beweis einer Aussage 𝐴(𝑛) über natürliche Zahlen, d.h. 𝑛 ∈ ℕ • Induktionsanfang (IA): Beweise, dass A(0) wahr ist • Induktionsschritt (IS): Beweise, dass wenn 𝐴(𝑘) wahr ist (IV), auch 𝐴(𝑘 + 1) (IB) wahr sein muss. Induktionsvoraussetzung (IV): Die Aussage 𝐴(𝑘) ist wahr für ein bestimmtes 𝑘 ∈ ℕ Induktionsbehauptung (IB): Die Aussage 𝐴(𝑘 + 1) ist wahr • Induktionsschluss: Gültigkeit der Aussage 𝐴(𝑛) für alle 𝑛 ∈ ℕ folgt aus IA und IS • vgl. Dominoeffekt • Wichtiges Werkzeug für Korrektheitsbeweise rekursiver Algorithmen 4 Übungsaufgabe zur Vollständigen Induktion 𝑖 2 5 Agenda 1. Vollständige Induktion und Rekursive Algorithmen 2. Besprechung des ersten Übungsblatts (Fortsetzung) 3. Vorstellen des zweiten Übungsblatts 6 Aufgabe 3-2 7 Aufgabe 4-2 8 Agenda 1. Vollständige Induktion und Rekursive Algorithmen 2. Besprechung des ersten Übungsblatts (Fortsetzung) 3. Vorstellen des zweiten Übungsblatts 9 Aufgabe 1 10 Aufgabe 2 11 Übungsaufgabe zu Aufgabe 2 12 Aufgabe 3 13 Finden des Majority-Elements • Gegeben: Array A mit n Zahlen Zugriff auf Array nur mit Hilfe der Operation EQUAL(x, y) gibt True zurück, falls A[x] = A[y], andernfalls False • Aufgabe: Prüfe, ob bel. Element x in A mehr als n/2mal vorkommt (d. h. Hx(A) > n/2) • Beispiel: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 2 3 7 2 5 2 9 3 3 2 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 2 3 7 7 2 5 2 2 3 2 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 2 3 3 2 3 2 3 3 3 2 2 2 2 5 5 3 2 2 2 4 4 3 2 2 2 2 2 2 H2(A1) = 8 kein Majority-El. H2(A2) = 9 →2 H2(A3) = 8 H3(A3) = 8 kein Majority-El. 14 Naive Lösung • Algorithmus: Majority mit Zählen • if |A| = 1 then return A[0] • else for i = 0 to ⌈n/2⌉ do c←1 for j = i + 1 to n − 1 do • if EQUAL(i, j) then c ← c + 1 if c > n/2 then return A[i] • Laufzeit Annahme: Kosten von EQUAL konstant Θ(n2) (⌈n/2⌉ + 1)-mal äußere For-Schleife Jeweils mindestens ⌊n/2⌋- und höchstens (n − 1)-mal EQUAL 15 Erinnerung: Divide & Conquer • Idee Teile Problem in Teilprobleme auf (divide) Löse diese rekursiv (conquer) Setze aus den Lösungen der Teilprobleme die Lösung für das Gesamtproblem zusammen (merge) • Darstellung als Rekursionsbaum 𝑇(𝑛) = Anzahl Operationen für Eingabe der Größe 𝑛 T(n) divide divide Kosten pro innerer Knoten: divide + merge merge T(m) T(m) … … wichtig: 𝑚 < 𝑛 T(m) merge T(2) T(2) T(2) Abbruch, wenn Eingabe klein genug … T(2) T(2) Kosten pro Blatt: conquer T(2) 16 Beispiel 2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 2 3 7 7 2 5 2 2 3 2 2 5 2 4 2 2 null 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 2 3 7 7 2 5 2 2 3 2 2 5 2 4 2 2 null 1 2 2 3 null 1 2 2 2 2 3 4 1 2 3 4 7 7 2 5 null 1 2 2 2 3 2 7 1 2 7 7 3 7 2 1 1 1 7 2 1 1 2 3 7 7 2 5 1 2 2 2 2 5 2 1 1 2 1 5 2 2 null 1 2 3 2 null 1 2 3 2 3 4 1 2 3 4 2 5 null 1 2 2 4 null 1 2 2 2 2 3 2 5 2 2 2 4 5 2 1 2 2 2 2 4 2 2 1 1 1 1 1 1 1 1 3 2 2 5 2 4 2 2 17 Aufgabe 4 18 Ausblick: Nächste Woche • • • • • Rückgabe der Abgaben zum ersten Übungsblatt Besprechung der Bewertung zum ersten Übungsblatt Besprechung der Lösungen des zweiten Übungsblatts Vorstellen der Aufgaben des dritten Übungsblatts Fragen? 19