Hörer: SS09 Effiziente Algorithmen Vorbemerkungen und 1. Kapitel Informatikstudierende (Bachelor) im 4. Semester, Mathematikstudierende, andere Fächer bei Bedarf Material: Eigene Mitschrift Folienkopien, Übungsblätter Martin Dietzfelbinger auf der folgenden Webseite: April 2009 http://www.tu-ilmenau.de/fakia/Effiziente-Algorithm.ea_ss080.0.html Zugang über die Institutsseite. Stoff: Vorlesung + Übungsaufgaben. FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 FG KTuEA, TU Ilmenau Zur Arbeitsweise: Der Stoff ist zu kompliziert und zu umfangreich, um durch reines Zuhören verstanden zu werden. • Regelmäßig Vorlesung nacharbeiten. Semesterbegleitend! Effiziente Algorithmen – SS09 – Kapitel 0+1 1 Zeitaufwand? Leistungspunkte: 4 LP – Entspricht 120 Zeitstunden. Vorlesungszeit: 15 Wochen. 6 Stunden pro Woche Davon: 2 12 – 3 in Vorlesung/Übung • Bücher konsultieren. • Übungsblätter drucken, lesen, zur Übung mitbringen, vorher Lösung ausdenken, Lösungsweg aufschreiben, an Lösungen mitarbeiten. Zeitaufwand: 3 – 3 12 Zeitstunden pro Woche neben Vorlesung + Übung. plus 30 Stunden Prüfungsvorbereitung! • Regelmäßig Übungen nacharbeiten. Semesterbegleitend! • Bei Verständnisproblemen frühzeitig fragen! FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 2 FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 3 Literatur: • T. H. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein, Introduction to Algorithms, 2nd ed., MIT Press, 2001 (auch auf deutsch bei Oldenbourg) • S. Dasgupta, C. Papadimitriou, U. Vazirani, Algorithms, McGraw-Hill, 2007 • V. Heun, Grundlegende Algorithmen, 2. Auflage, Vieweg, 2003 • K. Mehlhorn, P. Sanders, Algorithms and Data Structures: The Basic Toolbox, Springer-Verlag, 2008 • T. Ottmann, P. Widmayer, Algorithmen und Datenstrukturen, Spektrum Akademischer Verlag, 2002 • U. Schöning, Algorithmik, Spektrum Akademischer Verlag, 2001 • R. Sedgewick, Algorithms, Addison-Wesley, 2002 (auch C-, C++, Java-Versionen, auch auf deutsch bei Pearson) R. Sedgewick, Algorithms, Part 5: Graph Algorithms, Addison-Wesley, 2003 Vorlesung folgt eigenem Plan, nicht direkt einem Buch. • J. Kleinberg, E. Tardos, Algorithm Design, Pearson Education, 2005 FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 4 Übungsleiterin: Frau Lucia Draque Penso, Ph.D.(Brown U.) FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 5 Themen: 1. Divide-and-Conquer • Multiplikation ganzer Zahlen: Algorithmus von KaratsubaOfman • Dienstag (G), 11:00-12:30, HU011 • Donnerstag (G), 09:00-10:30, HU011 • Matrixmultiplikation: Algorithmus von Schönhage-Strassen • Freitag (U), 09:00-10:30, HU202 • Erinnerung: Mergesort, Quicksort • Selection in Zeit O(n) – Algorithmus von BFPRT (Blum, Floyd, Pratt, Rivest, Tarjan) Prüfung: (Bachelor Informatik) September 2009, mündlich (andere) nach Vereinbarung, mündlich. • Schneller Selection-Algorithmus: Randomisiert • Rekurrenz(un)gleichungen, insbesondere: Master-Theorem FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 6 FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 7 2. Durchsuchen und Strukturanalyse von Graphen 3. Greedy-Strategie allgemein • Erinnerung: Breitensuche, Tiefensuche • Teilbares Rucksackproblem • Erweiterte Tiefensuche mit: • Schedulingprobleme • Kreisfreiheitstest, Finden von Kreisen • Kürzeste Wege 1: Algorithmus von Dijkstra • Topologische Sortierung • Huffman-Kodierung • Starke Zusammenhangskomponenten • Tiefensuche in ungerichteten Graphen mit Kreisfreiheitstest FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 8 4. Minimale Spannbäume: Greedy-Strategie speziell, Hilfsstrukturen • Union-Find-Datenstruktur FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 9 5. Dynamische Programmierung • Editierdistanz • Matrix-Ketten-Multiplikation • MST: Der Rot-Blau-Satz • MST: Algorithmus von Kruskal • Kürzeste Wege 2: Algorithmus von Floyd-Warshall, Transitive Hülle • Priority-Queue mittels binärer Heaps • Kürzeste Wege 3: Algorithmus von Bellman-Ford • MST: Algorithmus von Prim • Optimale binäre Suchbäume FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 10 FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 11 6. Textalgorithmen 7. Flüsse in Netzwerken • Knuth-Morris-Pratt-Algorithmus • Boyer-Moore-Algorithmus • Das Problem Maximaler Fluss in Netzwerk“ ” • Algorithmus von Ford-Fulkerson • Textkompression nach Lempel-Ziv-Welch • Max-Flow-Min-Cut-Theorem • Algorithmus von Edmonds-Karp: Voll polynomiell • Maximales Matching in bipartiten Graphen FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 12 8. Suchen in impliziten Bäumen FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 13 Kapitel 1 Divide-and-Conquer • Backtracking • Branch-and-Bound Ein Algorithmenparadigma“. ” Divide-and-Conquer — divide et impera — teile und herrsche • Spielbaumsuche Schema eines D-a-C-Algorithmus A für ein Problem P: Gegeben ist Instanz/Input/Eingabe x der Größe“ |x| = n. ” Falls n = |x| ≤ n0 (Größenschranke): löse P auf x direkt“. ” Sonst: Gewinne aus x Teilinstanzen y1, . . . , yb ( teile“). ” Rufe A rekursiv für y1, . . . , yb auf, was Lösungen r1, . . . , rb liefert. Gewinne aus x, y1, . . . , yb, r1, . . . , rb eine Lösung r des Problems P für Instanz x ( kombiniere“). ” FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 14 FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 15 Standardbeispiele für D-a-C-Algorithmen: 1.1 Multiplikation • Mergesort Binärdarstellung! • Quicksort Methoden funktionieren im Prinzip für jede beliebige Basis. • Binäre Suche Addition Fortgeschrittenes Beispiel (nicht in dieser Vorlesung): an−1 . . . a0 + bn−1 . . . b0 Algorithmus Serielle Binäraddition • Schnelle Fouriertransformation Input: Binärzahlen/-strings an−1 . . . a0 und bn−1 . . . b0 Volladierer (5 Bitoperationen) liefert zu 3 Bits d, e, f die zwei Bits (s, c) = fulladd(d, e, f ) mit s = d ⊕ e ⊕ f (Summenbit) und c = (d ∧ e) ∨ (e ∧ f ) ∨ (f ∧ d) (Übertragsbit, Carry). FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 16 c0 ← 0; for i from 0 to n − 1 do (si, ci+1) ← fulladd(ai, bi, ci); sn ← c n ; Ergebnis: (sn . . . s0). FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 17 Multiplikation zweier natürlicher Zahlen Schulmethode“ ” 100110 · 110011 : 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 1 1 1 1 1 0 0 Kosten: Nicht mehr als 5n = O(n) Bitoperationen. Negative Zahlen, Subtraktion Im Folgenden: Ganze Zahlen als Paar (Vorzeichen, Absolutbetrag) dargestellt: 10, −1001, 101010, −11110 1 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 0 1 1 0 0 1 0 Additionen und Subtraktionen solcher Zahlen sind mit der Zweierkomplementdarstellung auf die Addition zurückführbar, kosten nicht mehr als 10n Bitoperationen. FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 18 FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 19 Allgemein: Multiplikation mit Divide-and-Conquer: Input: Binärzahlen/-strings an−1 . . . a0 und bn−1 . . . b0 Bilde n Zahlen d (0) (n−1) ,...,d Eingabe: n-Bit-Binärzahlen x und y, eventuell mit Vorzeichen. Falls n ≤ n0: Benutze Schulmethode. : d(i) = (an−1 · bi) . . . (a0 · bi) 0 . . . 0 Falls n > n0: Setze k = n/2. und addiere alle diese. Schreibe x = x . . . x0 n−1. . . xk x k−1 n − 1 Additionen von Zahlen mit nicht mehr als 2n Bits: und y = y n−1. . . yk y k−1 . . . y0 i Nullen A O(n2) Bitoperationen. C B D Teile“! ” Dann x = A · 2k + B und y = C · 2k + D. Geht es billiger? Also x·y = (A·2k +B)(C·2k +D) = AC·22k +(AD+BC)·2k +BD. FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 20 FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 21 x·y = (A·2k +B)(C·2k +D) = AC·22k +(AD+BC)·2k +BD. Erste Idee: Berechne rekursiv AC, AD, BC, CD, und füge die Produkte durch einige Additionen zum Resultat x · y zusammen. Trick: E := A − B und F := C − D (sieht sinnlos aus . . . ) Man kann zeigen (machen wir später): Bemerke: |E| und |F | haben als Differenz zweier nichtnegativer k-Bit-Zahlen höchstens k Bits! Die Anzahl der Bitoperationen ist wieder Θ(n2). Nun: E · F = (A − B)(C − D) = AC + BD − (AD + BC). Also: AD + BC = AC + BD − EF . FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 22 FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 23 Eingesetzt: x · y = AC · 22k + (AC + BD − EF ) · 2k + BD. Algorithmus KO (Karatsuba-Ofman) Wir müssen (rekursiv) t = 3 Teilprobleme für die Parametergröße n/a = n/2, also a = 2, lösen: Eingabe: Zwei n-Bit-Zahlen x und y. if n ≤ n0 then return SM(x, y) (∗ Schulmethode ∗) else k := n/2; zerlege x = A · 2k + B und y = C · 2k + D; E := A − B und F := C − D; (∗ auf n/2 Bits aufgefüllt ∗) G := KO(A, C); (∗ Rekursion ∗) H := KO(B, D); (∗ Rekursion ∗) I := KO(|E|, |F |); (∗ Rekursion ∗) return G · 22k + (G + H − sign(E) · sign(F ) · I) · 2k + H. AC, BD, EF berechnen und müssen einige Additionen und Subtraktionen von Zahlen mit maximal 2n Bits durchführen: O(n) Bitoperationen. Algorithmus von Karatsuba-Ofman Dabei ist sign(a) das Vorzeichen von a. FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 24 Beispiel: Mit Dezimalzahlen, n0 = 2. FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 25 g = 76 · 35 = 2660, h = 98, i = 27 · 33 = 891. Methode funktioniert zu jeder Basis! In der Informatik interessante Basiszahlen: 2, 8, 10, 16, 256, 216, 232, . . . n = 8, x = 76490358, y = 35029630. 3 Multiplikationen von 2-Bit-Zahlen. Ergebnis: G = AC = 2660·104 +(2660+98−891)·102 +98 = 26786798. Analog, rekursiv: H = BD = 03447540, I = |E| · |F | = 44679248. A = 7649, B = 0358, C = 3502, D = 9630. E = A − B = 7291, F = C − D = −6128. Ergebnis: Jeweils ≤ 4 Dezimalziffern. x · y = 26786798 · 108 + (26786798 + 03447540 − (−1) · 44679248) · 104 + 03447540 = 2679428939307540 Rekursion für a · C: a = 76, b = 49, c = 35, d = 02. e = a − b = 27, f = c − d = 33. Nur Additionen! Weil z.B. n0 = 2 ist, wird direkt multipliziert: FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 26 FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 27 MKO(n0) = 1 und MKO(n) = 3MKO(n/2). Einfachst-Analyse: Es sei n0 = 1 und n sei eine Zweiterpotenz: n = 2. MKO(n) = Anzahl der Bit-Multiplikationen (∧-Operationen). TKO(n) = Anzahl der Bit-Operationen. MKO(2) = 3 · MKO(2−1) = 32 · MKO(2−2) TKO(n0) = 1 und TKO(n) ≤ 3TKO(n/2) + cn, wobei c konstant ist. = 33 · MKO(2−3) .. MKO(n0) = 1 und MKO(n) = 3MKO(n/2). = 3 · MKO(2−) = 3 · MKO(n0) = 3. Die zweite Rekurrenz-Gleichung ist einfacher. Beachte: 3 = 2log2 3· = (2)log2 3 = nlog2 3. Dabei ist log2 3 ≈ 1,58496. Deutlich kleiner als n2 ! FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 28 TKO(n0) = 1 und TKO(n) ≤ 3TKO(n/2) + cn, wobei c konstant ist. FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 T (2) ≤ 29 3 · TKO(20) + c · 3j 2−j 0≤j≤−1 T (2 ) ≤ −1 3 · TKO(2 ≤ 3 ·1+c·2 )+c·2 0≤j≤−1 ≤ 3 · (3 · TKO(2−2) + c · 2−1) + c · 2 = 32 · TKO(2−2) + c · 3 · 2−1 + c · 2 = 3 + c · 2 = 33 · TKO(2−3) + c · 32 · 2−2 + c · 3 · 2−1 + c · 2 .. 3j 2−j ≤ 3 · TKO(20) + c · < 3 + c · j 3 2 ( 32 ) − 1 3 2−1 3 1 2 < (1 + 2c) · 3. 0≤j≤−1 Also: T (n) ≤ (1 + 2c)nlog2 3 = O(n1,585). FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 30 FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 31 In der Praxis (Implementierung in Software): Nicht n0 = 1 wählen, sondern für Zahlen einer Länge bis zur Wortgröße des Rechners (z. B. n0 = 32) die eingebaute MultiplikationsHardware benutzen. Beispiele: Zahlen mit 1024 Binärziffern haben gut 300 Dezimalziffern. (Will man mit so riesigen Zahlen rechnen?) Ja! – Kryptographie! Nur für längere Zahlen die KO-Rekursion benutzen. Welches n0 das optimale ist, hängt von der Hardware und eventuell von Programmierdetails ab. Wir betrachten nur die Anzahl der Multiplikationen von 32bit-Zahlen: MKO (210) = 3−5 · MKO (25) = 35 = 243. Bei Verwendung der Schulmethode (und der Hardware für die kurzen Zahlen) ergeben sich (2−5)2 = 1024 Multiplikationen. FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 32 Zahlen mit 32768 Binärziffern haben etwa 9900 Dezimalziffern. MKO (215) = 315−5 · MKO (25) = 310 = 59049. FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 33 Geht es noch besser? Theoretisch ja, praktisch eigentlich kaum. Mitteilung: • Schönhage-Strassen (1971): Multiplikation zweier n-BitZahlen mit O(n log n log log n) Gattern. Bei Verwendung der Schulmethode: (215−5)2 = 220 Multiplikationen, mehr als 1 Million! Arnold Schönhage und Volker Strassen: Schnelle Multiplikation großer Ersparnis: Faktor 18. Zahlen, Computing 7, 1971, Springer Verlag, S. 281–292 • Fürer (2007): Multiplikation zweier n-Bit-Zahlen mit ∗ O(n log n · 2log n) Gattern. Martin Fürer: Faster integer multiplication, STOC 2007 Proceedings, S. 57–66. Dabei ist log∗ n definiert als die kleinste Zahl mit log log. . . log n ≤ 1. i−mal FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 34 FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 35 Also: log∗ 2 = 1, log∗ 4 = 2, log∗ 16 = 3, log∗ 65536 = 4, 65536 65536 ) = 6, und 22 ist schon log∗(265536) = 5, log∗(22 eine sehr große Zahl. (Leider sind beide Algorithmen in der Praxis nicht so sehr hilfreich.) Das Master-Theorem Matrixmultiplikation Es sei R irgendein Ring. A = (aij )1≤i,j≤n, B = (bij )1≤i,j≤n seien n × n-Matrizen über R. Aufgabe: Berechne C = A · B, d.h. C = (cij )1≤i,j≤n mit cij = aik bkj . – siehe Fließtext-Dokument zum 1. Kapitel – 1≤k≤n Naive Implementierung gemäß dieser Formel kostet: n3 Ring-Multiplikationen und n2(n − 1) Ring-Additionen. Strassen (1969): Es geht mit weniger Multiplikationen! Ansatz: Divide-and-Conquer. FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 36 Wir nehmen an: n = 2, Zweierpotenz. FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 37 Suggeriert rekursiven Ansatz, in dem 8 Multiplikationen von ( n2 × n2 )-Teilmatrizen durchgeführt werden. Eingabe: n × n-Matrizen A, B. Falls n ≤ n0: Berechne A · B mit der direkten Methode. n30 Multiplikationen. Einfache Analyse ergibt: n3 Multiplikationen in R, kein Gewinn. Falls n > n0: (Master-Theorem: O(n3).) Zerlege A, B in jeweils 4 quadratische ( n2 × n2 )-Teilmatrizen: C D G H A= , B= E F K L Dann (leicht zu sehen): CG + DK CH + DL A·B = EG + F K EH + F L FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 38 FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 39 Strassen-Trick: auskommen. Man kann mit 7 Multiplikationen M (1) = 1; P1 = C(H − L) P2 = (C + D)L P3 = (E + F )G P4 = F (K − G) M (n) = 7M (n/2). P5 = (C + F )(G + L) P6 = (D − F )(K + L) P7 = (C − E)(G + H) Für n = 2: M (2) = 7M (2−1) = . . . = 7M (1) = 7. 7 = 2 log2 7 = nlog2 7 mit log2 7 ≈ 2,81. Dann: AB = Aufwandsanalyse (einfachst): Für n0 = 1, M (n) = Anzahl der Ringmultiplikationen. P1 + P2 P 5 + P4 − P 2 + P6 P3 + P4 P 1 + P5 − P3 − P7 Aufwandsanalyse (etwas komplizierter): Ringadditionen A(1) = 0; Von Hand nachzukontrollieren! A(n) ≤ 7A(n/2) + cn2 (für eine Konstante c). 18 Additionen. Rechnung wie bei Zahlen-Multiplikation ergibt: FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 40 A(2) ≤ 7 · A(2−1) + c · (22) = c·4 0≤j≤−1 = c· < c· 3 4 Falls n ≤ n0: Sortiere mit einem naiven Algorithmus (Insertion Sort). 0≤j≤−1 j 7 4 Sonst: k := n/2. Sortiere a1, . . . , ak (erste Hälfte) rekursiv, Ergebnis b1, . . . , bk ; sortiere ak+1, . . . , an (zweite Hälfte) rekursiv, Ergebnis bk+1, . . . , bn. 4 < c · 7 . 3 Mische“ die Folgen b1, . . . , bk und bk+1, . . . , bn zu einer sor” tierten Folge zusammen Wieder O(nlog2 7)! Alternative: Master-Theorem. FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 41 Um n Zahlen a1, . . . , an zu sortieren, geht man so vor: ( 7 ) − 1 4 47 4−1 7 Effiziente Algorithmen – SS09 – Kapitel 0+1 Mergesort: ≤ 72 · A(2−2) + c · 7 · (22)−1 + c · (22) .. 0 ) +c · 7j (22)−j ≤ 7 · A(2 =0 FG KTuEA, TU Ilmenau ( Reißverschlussverfahren“), Aufwand: ≤ n − 1 Vergleiche. ” 42 FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 43 Analyse über Rekurrenzungleichungen“: Wir zählen nur ” Vergleiche. Beweisansatz: Man beweist mit Induktion über = 1, 2, 3, . . ., dass folgendes gilt: C(n) = Anzahl der Vergleiche beim Sortieren von n Eingaben, schlechtester Fall. n C(n) 1 0 2 1 3 3 4 5 5 8 6 11 7 14 8 17 9 21 10 25 11 29 12 33 13 37 14 41 C(1) = 0, C(2) = 1, C(3) = 3. Für n ∈ {2−1, . . . , 2} gilt C(n) ≤ n − 2 + 1. ... ... (Dabei benutzt man, dass für n = 2 gilt: n − 2 + 1 = n( + 1) − 2+1 + 1.) Merke: C(n) ≤ C(n/2) + C(n/2) + n − 1. log n Lösung: C(n) ≤ nlog n − (2 FG KTuEA, TU Ilmenau Bei Mergesort: C(n) ≤ n log n. − 1). Effiziente Algorithmen – SS09 – Kapitel 0+1 44 FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 45 Analyse: Wir nehmen an, alle Schlüssel sind verschieden. Erinnerung: Quicksort Falls n = 1, ist nichts zu tun. Weiter nehmen wir an, jede der n! Anordnungen sind gleich wahrscheinlich, und berechnen die erwartete Anzahl A(n) von Vergleichen. Falls n = 2, sortiere mit einem Vergleich. – Sonst: Falls n ≤ 1: kein Vergleich. Falls n = 2: 1 Vergleich. – Sonst: Wähle ein Element x ∈ {a1, . . . , an} als partitionierendes Element. (Z.B.: x = a1; x = Median von {a1, an/2, an}; x = ai mit i zufällig.) Das Aufteilen in zwei Folgen kostet exakt n − 1 Vergleiche. Gegeben: Folge (a1, . . . , an). Zerlege (a1, . . . , an) in eine Teilfolge b1, . . . , bp−1, alle ≤ x, in das Element x, und eine Teilfolge cp+1, . . . , cn, alle ≥ x. 1 (A(i − 1) + A(n − i)), n ≥ 1. n 1≤i≤n Ausgabe: Die Folge (d1, . . . , dp−1, x, ep+1, . . . , en). Effiziente Algorithmen – SS09 – Kapitel 0+1 Resultierende Rekursionsgleichung: A(n) = n − 1 + Sortiere diese beiden Folgen rekursiv, Ergebnis (d1, . . . , dp−1) und (ep+1, . . . , en). FG KTuEA, TU Ilmenau Die Position p von x nimmt jeden Wert i in {1, . . . , n} mit derselben Wahrscheinlichkeit an. Hat nicht die gewohnte Form! Master-Theorem nicht anwendbar. 46 FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 47 D.h.: nA(n) = (n + 1)A(n − 1) + 2(n − 1). 1 A(n) = n − 1 + (A(i − 1) + A(n − i)), n ≥ 1. n Teilen durch n(n + 1) liefert: 1≤i≤n Die ersten Summanden durchlaufen A(0), . . . , A(n − 1), die zweiten durchlaufen A(n − 1), . . . , A(0). A(n) = n − 1 + A(n − 1) 2 2 A(n) = + − . n+1 n n + 1 n(n + 1) 2 A(i), n ≥ 1. n 0≤i<n Tricks: Multiplizieren mit n, Subtrahieren der Gleichung für n − 1 von der für n: nA(n)−(n−1)A(n−1) = n(n−1)−(n−1)(n−2)+2A(n−1), n ≥ 1. FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 48 2≤i≤n+1 2 1 −2 . i i(i + 1) O.B.d.A.: Alle Einträge verschieden. 2≤i≤n A(n) 1 = 2(Hn+1 − 1) − 2 · (1 − ). n+1 n+1 ⇒ A(n) = 2(n + 1)(Hn+1 − 2) + 2 = 2(n + 1)Hn − 4n. ⇒ Dabei ist Hn = 1 + 12 + · · · + n1 ∈ [ln n + 12 , ln n + 1] (n-te harmonische Zahl). FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 49 Gegeben ist eine Folge (a1, . . . , an) von n Objekten aus D (in Array oder als Liste), sowie eine Zahl k, 1 ≤ k ≤ n. Kann man (mit A(1) = 0) leicht durch Summieren lösen: Effiziente Algorithmen – SS09 – Kapitel 0+1 Problem: Auswahl – Selection“ ” A(n − 1) 2 2 A(n) = + − . n+1 n n + 1 n(n + 1) A(n) = n+1 FG KTuEA, TU Ilmenau Aufgabe: Finde das Element der Folge, das Rang k hat, d. h. ein Objekt x in der Liste mit |{i | ai ≤ x}| = k. Spezialfall: Der Median einer Folge mit n Einträgen ist das Element mit Rang n/2. Einfache Lösung: Sortiere, mit Ergebnis (b1, . . . , bn), nun wähle x = bk . Kosten: O(n log n) vom Sortieren. 50 FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 51 Algorithmus BFPRT(a1, . . . , an, k) Ziel: Ein Algorithmus mit Aufwand O(n). (Erfinder: M. Blum, R. W. Floyd, V. R. Pratt, R. L. Rivest, R. E. Tarjan: lauter Pioniere der Algorithmik!) Ansatz: Divide-and Conquer! Wenn n ≤ n0 (legen wir später fest): Sortiere mit Mergesort, fertig. Wenn k = 1 oder k = n: Suche Minimum oder Maximum mit n − 1 Vergleichen. Sonst: Zerlege (a1, . . . , an) beliebig in m = n/5 Gruppen G1, . . . , Gm der Größe 4 oder 5. Bestimme in jeder Gruppe Gj den Median (von 4 oder 5 Elementen) xj . (Dies lässt sich mit maximal 7 Vergleichen erreichen – Übung!) – Kosten: ≤ 7n/5 Vergleiche. Rekursiv: Bestimme mit BFPRT(x1, . . . , xm, m/2) den Median z der m Mediane {x1, . . . , xm}. FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 52 Bestimme (mit n − 1 Vergleichen) den Rang von z in der Eingabefolge (a1, . . . , an). FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 Spalten: Gruppen nach Umsortieren, Kriterium: A: 53 m j >/=/<z garantiert >= z 1. Fall: = k. Dann fertig, die Ausgabe ist z. 2. Fall: > k. Dann sind bei der Suche nach dem Element mit Rang k Elemente ≥ z irrelevant: man kann sie weglassen. Definiere A := {ai | mj ≥ z und ai ≥ mj und ai in Gruppe Gj }. z Dann sind alle Elemente von A mindestens so groß wie z. Die Elemente von A kann man bei der weiteren Suche weglassen; es gibt davon |A| ≥ 3m/2 ≥ 3n/10 viele. Rufe BFPRT(b1, . . . , bn , k) rekursiv auf den verbleibenden n ≤ 7n/10 Elementen b1, . . . , bn auf. FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 54 B: FG KTuEA, TU Ilmenau garantiert <= z Effiziente Algorithmen – SS09 – Kapitel 0+1 55 3. Fall: < k. Dann kann man bei der Suche nach dem Element mit Rang k Elemente ≤ z weglassen. Laufzeitanalyse: Die Laufzeit ist proportional zur Anzahl der durchgeführten Vergleiche. Definiere B := {ai | mj ≤ z und ai ≤ mj und ai in Gruppe Gj }. Wir definieren: Dann sind alle Elemente von B höchstens so groß wie z. C(n) := maximale Anzahl der Vergleiche bei Aufruf Algorithmus BFPRT(a1, . . . , ap, k), p ≤ n, 1 ≤ k ≤ p. Alle Elemente von B kann man bei der weiteren Suche weglassen; es gibt davon |B| ≥ 3m/2 − 4 ≥ 3n/10 − 4 viele. Rufe BFPRT(b1, . . . , bn , k − |B|) rekursiv auf den verbleibenden n ≤ 7n/10 + 4 Elementen b1, . . . , bn auf. (Durch das p ≤ n“ wird die Funktion C(n) monoton.) ” Die Anzahl C(n) der Vergleiche im Algorithmus gehorcht der folgenden Rekurrenzungleichung 4 12 (benutze 7n/5 + n − 1 < 12 5 n + 7 · 5 − 1 < 5 n + 5): Ende Algorithmus C(n) ≤ n log n, für n ≤ n0; Korrektheit: ergibt sich aus der begleitenden Überlegung. C(n) ≤ C(n/5) + C(7n/10 + 4) + 12n/5 + 5, für n > n0. FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 56 FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 57 Wir behaupten: C(n) ≤ cn für alle n und eine passende Konstante c. Wir wählen c so, dass cn/10 ≥ 5c + 12n/5 + 5 ist, was für c ≥ 25 und n ≥ n0 = 2500 der Fall ist (nachrechnen!). Die n ≤ n0 werden erledigt, indem man c ≥ log n0 wählt. Für ein solches c lässt sich der Induktionsschritt durchführen; damit gilt die Behauptung C(n) ≤ cn für alle n. Konkret: n0 = 2500; dann genügt c ≥ 13 auf jeden Fall. Nun sei n > n0. Wir rechnen: Wir haben gezeigt: Satz C(n) ≤ C(n/5) + C(7n/10 + 4) + 12n/5 + 5, Der BFPRT-Algorithmus löst das Auswahlproblem und hat eine Laufzeit von O(n) im schlechtesten Fall. I.V. ≤ cn/5 + c(7n/10 + 4) + 12n/5 + 5 ≤ cn/5 + c + 7cn/10 + 4c + 12n/5 + 5 ≤ cn + (−cn/10 + 5c + 12n/5 + 5). FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 58 FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 59 Ein randomisierter Algorithmus für das Auswahlproblem. Falls n ≥ 3: Ansatz: Wie bei Quicksort. Wähle ein Element x ∈ {a1, . . . , an} als partitionierendes Element. (Zum Beispiel: x = ai für ein zufällig gewähltes i.) Gegeben: Folge (a1, . . . , an), Zahl k, 1 ≤ k ≤ n. Zerlege (a1, . . . , an) in eine Teilfolge b1, . . . , bp−1, alle ≤ x, in das Element x, und eine Teilfolge cp+1, . . . , cn, alle ≥ x. O.B.d.A.: Die ai sind verschieden. Falls n = 1, ist nichts zu tun. Falls n = 2, sortiere mit einem Vergleich, Ergebnis (b1, b2), gib Element bk zurück. 1. Fall: k = p. Das Ergebnis ist x. 2. Fall: k < p. Finde (rekursiv) in (b1, . . . , bp−1) das Element vom Rang k. 3. Fall: k > p. Finde (rekursiv) in (cp+1, . . . , cn) das Element vom Rang k − p. FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 60 FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 61 Korrektheit: Klar. Rekurrenzungleichung: Zu analysieren: (Erwartete) Rechenzeit. A(2) = 1. Wir analysieren die erwartete Anzahl von Vergleichen. Für n ≥ 3: Wir benötigen n − 1 Vergleiche für die Partitionierung und die Vergleiche aus einem rekursiven Aufruf. Mittelung über die Möglichkeiten für i = Rang(x) = p ergibt: ⎛ ⎞ 1 A(n, k) ≤ (n−1)+ ⎝ A(n − i, k − i) + A(i − 1, k)⎠ . n A(n, k) := E(#Vergleiche bei Aufruf für ((a1, . . . , an), k)) Es ist möglich, aber etwas kompliziert, A(n, k) genau zu bestimmen. Wir beschränken uns auf: A(n) := max{A(n, k) | 1 ≤ k ≤ n}. 1≤i<k Daraus: ⎛ A(n, k) ≤ (n − 1) + FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 62 FG KTuEA, TU Ilmenau 1⎝ n k<i≤n A(n − i) + 1≤i<k Effiziente Algorithmen – SS09 – Kapitel 0+1 ⎞ A(i − 1)⎠ . k<i≤n 63 Vermutung: A(n) ≤ cn, für eine Konstante c. Dies wird durch Induktion bewiesen, die Konstante c wird gleich passend gewählt. Für n = 1 und n = 2 ist nichts zu zeigen. ⎛ ⎞ 1⎝ A(n − i) + A(i − 1)⎠ n 1≤i<k k<i≤n ⎛ ⎞ I.V. 1 ≤ n−1+ ⎝ c(n − i) + c(i − 1)⎠ n 1≤i<k k<i≤n c (k − 1)(2n − k) (n − k)(k + n − 1) = n−1+ · + n 2 2 c (k − 1)(2n − k) + (n − k)(k + n − 1) . = n−1+ · n 2 A(n, k) ≤ (n − 1) + Nun ist (Analysis!) (k − 1)(2n − k) + (n − k)(k + n − 1) < 32 n2. FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 64 Damit: A(n, k) ≤ n − 1 + 34 cn < n + 34 cn für jedes k, also A(n) < n + 34 cn. Wir wählen c = 4 und erhalten: A(n) < n + 34 · 4n = 4n = cn. Damit ist die Induktionsbehauptung gezeigt. Satz Die erwartete Vergleichsanzahl beim randomisierten SelectionAlgorithmus ist ≤ 4n; die erwartete Rechenzeit ist O(n). Mitteilung: Die beste Schranke für die erwartete Vergleichsanzahl bei einem Algorithmus für das Auswahlproblem, nämlich 3 2 n + o(n), erreicht ein anderer randomisierter Algorithmus (siehe Vorlesung Randomisierte Algorithmen“). ” FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 66 FG KTuEA, TU Ilmenau Effiziente Algorithmen – SS09 – Kapitel 0+1 65