Effiziente Algorithmen Vorüberlegungen und Divide-and-Conquer-Algorithmen Vorlesender: Martin Aumüller (nach Folien von Prof. Martin Dietzfelbinger) April 2012 FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 1 Organisatorisches Hörer: Informatikstudierende (Bachelor) im 4. Semester, Mathematikstudierende, andere Fächer bei Bedarf Material: Eigene Mitschrift Folienkopien, Übungsblätter auf der folgenden Webseite: http://www.tu-ilmenau.de/iti/lehre/lehre-ss-2012/ea/ Zugang über die Institutsseite. Stoff: Vorlesung + Übungsaufgaben. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 2 Organisatorisches Zur Arbeitsweise: Der Stoff ist zu kompliziert und zu umfangreich, um durch reines Zuhören verstanden zu werden. Regelmäßig Vorlesung nacharbeiten. Semesterbegleitend! Begleitend Bücher ansehen. Übungsblätter drucken, lesen, zur Übung mitbringen, vorher Lösung ausdenken, Lösungsweg aufschreiben, an Lösungen mitarbeiten, Lösungen vortragen. Regelmäßig Übungen nacharbeiten. Semesterbegleitend! Bei Verständnisproblemen frühzeitig fragen! FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 3 Organisatorisches Zeitaufwand? Leistungspunkte: 4 LP – Entspricht 120 Zeitstunden. Vorlesungszeit: 15 Wochen. 6 Stunden pro Woche Davon: 2 12 – 3 in Vorlesung/Übung Zeitaufwand: 3 – 3 12 Zeitstunden pro Woche neben Vorlesung + Übung! ergibt: 90 Stunden plus 30 Stunden Prüfungsvorbereitung! FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 4 Organisatorisches Literaturvorschläge: 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 J. Kleinberg, E. Tardos, Algorithm Design, Pearson Education, 2005 K. Mehlhorn, P. Sanders, Algorithms and Data Structures: The Basic Toolbox, Springer-Verlag, 2008 FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 5 Organisatorisches Literaturvorschläge: 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. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 6 Organisatorisches Übungen: • Dienstag (U), 15:00-16:30, HU 011 • Mittwoch (U), 11:00-12:30, HU 011 • Mittwoch (U), 13:00-14:30, HU 204 Übungen beginnen am 10.04. Prüfung: (bei Prof. Dietzfelbinger) (Bachelor Informatik) Juli–Sept. 2012, 15–20 Min. mündlich (andere) nach Vereinbarung, mündlich. Bonuspunkte: Korrektes Vorrechnen einer (markierten) Übungsaufgabe mit vorheriger schriftlicher Abgabe = ˆ Notenverbesserung um 0,3 (maximal 2 × pro Teilnehmer/in, nicht automatisch von 5,0 auf 4,0). FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 7 Organisatorisches Themen: 1. Divide-and-Conquer Multiplikation ganzer Zahlen: Algorithmus von Karatsuba Matrixmultiplikation: Algorithmus von Strassen Mergesort, exakte Analyse Rekurrenz(un)gleichungen, insbesondere: Master-Theorem Quicksort, neue Analyse Selection in Zeit O(n) – Algorithmus von BFPRT (Blum, Floyd, Pratt, Rivest, Tarjan) Schneller Selection-Algorithmus: Randomisiert Schnelle Fourier-Transformation FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 8 Organisatorisches 2. Durchsuchen und Strukturanalyse von Graphen Erinnerung: Breitensuche Erweiterte Tiefensuche (Kantenklassifikation) Kreisfreiheitstest, Finden von Kreisen Topologische Sortierung Starke Zusammenhangskomponenten Tiefensuche in ungerichteten Graphen mit Kreisfreiheitstest FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 9 Organisatorisches 3. Greedy-Strategie allgemein Teilbares Rucksackproblem Schedulingprobleme Kürzeste Wege 1: Algorithmus von Dijkstra Adressierbare Priority-Queues mittels binärer Heaps Huffman-Kodierung Set Cover FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 10 Organisatorisches 4. Minimale Spannbäume: Greedy-Strategien, Hilfsstrukturen Union-Find-Datenstruktur MST: Schnitteigenschaft MST: Algorithmus von Kruskal MST: Algorithmus von Prim Minimale Schnitte FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 11 Organisatorisches 5. Dynamische Programmierung Editierdistanz Matrix-Ketten-Multiplikation Ganzzahliges Rucksackproblem Kürzeste Wege 2: Algorithmus von Floyd-Warshall, Transitive Hülle Kürzeste Wege 3: Algorithmus von Bellman-Ford FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 12 Kapitel 1 Divide-and-Conquer Kapitel 1 Divide-and-Conquer (D-a-C) Ein Algorithmenparadigma“. ” Divide-and-Conquer – divide et impera – teile und herrsche 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 , . . . , ya ( teile“). ” Rufe A rekursiv für y1 , . . . , ya auf, mit Lösungen r1 , . . . , ra . Gewinne aus x, y1 , . . . , ya , r1 , . . . , ra eine Lösung r des Problems P für Instanz x ( kombiniere“). ” FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 14 Kapitel 1 Divide-and-Conquer Standardbeispiele aus AuD für D-a-C-Algorithmen: Mergesort Quicksort Binäre Suche (Details in der AuD-Vorlesung.) FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 15 Kapitel 1 Divide-and-Conquer Multiplikation ganzer Zahlen 1.1 Multiplikation ganzer Zahlen Zahlen in Binärdarstellung. (Methoden funktionieren im Prinzip für jede beliebige Basis.) Bekannt: Volladdierer (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 – Sommersemester 2012 16 Kapitel 1 Divide-and-Conquer Multiplikation ganzer Zahlen Bekannt: Serielle Binäraddition. Input: Binärzahlen/-strings an−1 . . . a0 und bn−1 . . . b0 c0 ← 0; (∗ Carry, Übertrag ∗) for i from 0 to n − 1 do (si , ci+1 ) ← fulladd(ai , bi , ci ); sn ← cn ; Ergebnis: sn . . . s0 . Kosten: Nicht mehr als 5n = O(n) Bitoperationen. Bekannt: Negative Zahlen, Subtraktion. Ganze Zahlen werden als Paar (Vorzeichen, Betrag) dargestellt, z. B. 10, −1001, 101010, −11110. Additionen und Subtraktionen solcher Zahlen mit der Zweierkomplementdarstellung auf die Addition zurückführbar. Kosten: nicht mehr als 6n Bitoperationen. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 17 Kapitel 1 Divide-and-Conquer Multiplikation ganzer Zahlen Multiplikation zweier natürlicher Zahlen Schulmethode“ ” 1 0 0 1 1 0 1 Überträge: Produkt: FG KTuEA, TU Ilmenau 0 1 0 0 0 · 1 1 0 0 1 1 : 1 0 0 0 1 1 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 1 10 1 0 1 1 0 0 0 1 1 1 1 0 0 1 0 0 1 0 Effiziente Algorithmen – Sommersemester 2012 18 Kapitel 1 Divide-and-Conquer Multiplikation ganzer Zahlen Allgemein: Input: Binärzahlen/-strings an−1 . . . a0 und bn−1 . . . b0 Bilde n Binärzahlen d (0) , . . . , d (n−1) : d (i) = (an−1 · bi ) . . . (a0 · bi ) 0 . . . 0 | {z } i Nullen und addiere alle diese. ≤ n − 1 Additionen von Zahlen mit nicht mehr als 2n Bits: O(n2 ) Bitoperationen. Geht es billiger? FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 19 Kapitel 1 Divide-and-Conquer Multiplikation ganzer Zahlen Multiplikation mit Divide-and-Conquer-Strategie: Eingabe: n-Bit-Binärzahlen x und y , eventuell Vorzeichen. Falls n ≤ n0 : Benutze Schulmethode. Falls n > n0 : Setze k = dn/2e. Schreibe x = xn−1 . . . xk xk−1 . . . x0 | {z } | {z } A B und y = yn−1 . . . yk yk−1 . . . y0 | {z } | {z } C D Teile“! ” Dann x = A · 2k + B und y = C · 2k + D. x · y = (A · 2k + B)(C · 2k + D) = AC · 22k + (AD + BC ) · 2k + BD. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 20 Kapitel 1 Divide-and-Conquer Multiplikation ganzer Zahlen Erste Idee: Berechne rekursiv AC , AD, BC , BD, und füge die Produkte durch einige Additionen zum Resultat x · y zusammen. Kosten für n-Bit-Zahlen (für eine Konstante c): C (n) ≤ 1 4 · C (n/2) + c · n für n = 1 für n > 1. (1) Man kann zeigen (später: Master-Theorem“): ” Die Anzahl der Bitoperationen ist wieder Θ(n2 ), nicht besser als Schulmethode. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 21 Kapitel 1 Divide-and-Conquer Multiplikation ganzer Zahlen x · y = (A · 2k + B)(C · 2k + D) = AC · 22k + (AD + BC ) · 2k + BD. Trick: E := A − B und F := C − D (sieht sinnlos aus . . . ) Bemerke: |E | und |F | haben als Betrag der Differenz von zwei nichtnegativen k-Bit-Zahlen höchstens k Bits. Nun: E · F = (A − B)(C − D) = AC + BD − (AD + BC ). Also: AD + BC = AC + BD − EF . x · y = AC · 22k + (AC + BD − EF ) · 2k + BD. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 22 Kapitel 1 Divide-and-Conquer Multiplikation ganzer Zahlen Algorithmus Ka (Algorithmus von Karatsuba) Eingabe: Zwei n-Bit-Zahlen x und y . if n ≤ n0 then return SM(x, y ) (∗ Schulmethode ∗) else k := dn/2e; zerlege x = A · 2k + B und y = C · 2k + D; E := A − B und F := C − D; (∗ auf dn/2e Bits aufgefüllt ∗) G := Ka(A, C ); (∗ Rekursion ∗) H := Ka(B, D); (∗ Rekursion ∗) I := Ka(|E |, |F |); (∗ Rekursion ∗) return G · 22k + (G + H − sign(E ) · sign(F ) · I ) · 2k + H. Dabei ist sign(a) das Vorzeichen von a. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 23 Kapitel 1 Divide-and-Conquer Multiplikation ganzer Zahlen Beispiel: Mit Dezimalzahlen, n0 = 2. (Methode funktioniert zu jeder Basis.) In der Informatik interessante Basiszahlen: 2, 8, 10, 16, 256, 216 , 232 , . . . n = 8, x = 76490358, y = 35029630. A = 7649, B = 0358, C = 3502, D = 9630. E = A − B = 7291, F = C − D = −6128. Jeweils ≤ 4 Dezimalziffern. Rekursion für A · C : a = 76, b = 49, c = 35, d = 02. e = a − b = 27, f = c − d = 33. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 24 Kapitel 1 Divide-and-Conquer Multiplikation ganzer Zahlen Weil z.B. n0 = 2 ist, wird direkt multipliziert: g = 76 · 35 = 2660, h = 98, i = 27 · 33 = 891. 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. Ergebnis: x · y = 26786798 · 108 + (26786798 + 03447540 − (−1) · 44679248) · 104 + 03447540 = 2679428939307540 Beim Kombinationsschritt gibt es nur Additionen! FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 25 Kapitel 1 Divide-and-Conquer Multiplikation ganzer Zahlen Für Input der Größe n > n0 müssen wir (rekursiv) a = 3 Teilprobleme für die Parametergröße dn/be = dn/2e, also b = 2, lösen: rekursiv AC , BD, EF berechnen und müssen einige Additionen und Subtraktionen von Zahlen mit maximal 2n Bits durchführen: Zusätzlich O(n) Bitoperationen. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 26 Kapitel 1 Divide-and-Conquer Multiplikation ganzer Zahlen Einfachst-Analyse: Es sei n0 = 1 und n sei eine Zweierpotenz: n = 2` . MKa (n) = Anzahl der Bit-Multiplikationen (∧-Operationen). TKa (n) = Anzahl der Bit-Operationen. TKa (n0 ) = 1 und TKa (n) ≤ 3TKa (n/2) + cn, wobei c konstant ist. MKa (n0 ) = 1 und MKa (n) = 3MKa (n/2). Die zweite Rekurrenz-Gleichung ist einfacher. Achtung: Bitmultiplikationen gibt es nur auf dem untersten Rekursionslevel. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 27 Kapitel 1 Divide-and-Conquer Multiplikation ganzer Zahlen MKa (n0 ) = 1 und MKa (n) = 3 · MKa (n/2). MKa (2` ) = 3 · MKa (2`−1 ) = 32 · MKa (2`−2 ) = 33 · MKa (2`−3 ) .. . = 3` · MKa (2`−` ) = 3` · MKa (n0 ) = 3` . Beachte: 3` = (2log2 3 )` = (2` log2 3 ) = (2` )log2 3 = nlog2 3 . Dabei ist log2 3 ≈ 1,58496. Deutlich kleiner als n2 ! FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 28 Kapitel 1 Divide-and-Conquer Multiplikation ganzer Zahlen TKa (n0 ) = 1 und TKa (n) ≤ 3TKa (n/2) + cn, wobei c konstant. TKa (2` ) ≤ 3 · TKa (2`−1 ) + c · 2` ≤ 3 · (3 · TKa (2`−2 ) + c · 2`−1 ) + c · 2` = 32 · TKa (2`−2 ) + c · 3 · 2`−1 + c · 2` ≤ .. . 33 · TKa (2`−3 ) + c · 32 · 2`−2 + c · 3 · 2`−1 + c · 2` ≤ ` 0 3 · TKa (2 ) + c · X 3j 2`−j 0≤j<` FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 29 Kapitel 1 Divide-and-Conquer ` TKa (2 ) ≤ ` Multiplikation ganzer Zahlen 0 3 · TKa (2 ) + c · X 3j 2`−j 0≤j≤`−1 `−j X 2 3` · 1 + c · 3 0≤j≤`−1 ! 2 ` 1 − ( 2 ` 3) 3 · 1+c · · 3 1 − 23 ! 2 1 ` 3 · 1+c · · 1 3 3 ≤ = < = Also: 3` · (1 + 2c). T (n) ≤ (1 + 2c)nlog2 3 = O(n1,585 ). FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 30 Kapitel 1 Divide-and-Conquer Multiplikation ganzer Zahlen Satz 1.1.1 Beim Karatsuba-Multiplikationsalgorithmus beträgt die Anzahl der Bitoperationen und die Rechenzeit O(nlog2 3 ) = O(n1,585 ). 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. w = 32) die eingebaute Multiplikations-Hardware benutzen, d. h. mit Basis 2w rechnen. Für Zahlen bis zu einer Länge von n0 Worten: Schulmethode. Nur für längere Zahlen Karatsuba-Rekursion benutzen. Welches n0 optimal ist, hängt von der Hardware und eventuell von Programmierdetails ab. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 31 Kapitel 1 Divide-and-Conquer Multiplikation ganzer Zahlen Praxisbeispiel: GMP (GNU Multiple Precision Arithmetic Library) Nutzt 4 verschiedene Stufen: 1 Schulmethode Grenzen stark abhängig von der genutzten Architektur! 2 Karatsuba Atom-Prozessoren (x86) 3 TOOM33 (Knuth Abschnitt 4.3.3) 4 FFT-basierter Algorithmus Wechsel der Methode, sobald Anzahl Maschinenwörtern der Eingabe unter bestimmte Grenze sinkt. FG KTuEA, TU Ilmenau 1 Karatsuba: 10 ≤ #Wörter ≤ 65 2 TOOM33: 66 ≤ #Wörter ≤ 3455 3 FFT: ≥ 3456 Wörter Effiziente Algorithmen – Sommersemester 2012 32 Kapitel 1 Divide-and-Conquer Multiplikation ganzer Zahlen Praxisbeispiel: GMP (GNU Multiple Precision Arithmetic Library) Nutzt 4 verschiedene Stufen: 1 Schulmethode Grenzen stark abhängig von der genutzten Architektur! 2 Karatsuba Core2-Prozessoren (x86 64) 3 TOOM33 (Knuth Abschnitt 4.3.3) 4 FFT-basierter Algorithmus Wechsel der Methode, sobald Anzahl Maschinenwörtern der Eingabe unter bestimmte Grenze sinkt. FG KTuEA, TU Ilmenau 1 Karatsuba: 23 ≤ #Wörter ≤ 64 2 TOOM33: 65 ≤ #Wörter ≤ 4735 3 FFT: ≥ 4736 Wörter Effiziente Algorithmen – Sommersemester 2012 32 Kapitel 1 Divide-and-Conquer Multiplikation ganzer Zahlen Beispiele: Zahlen mit 1024 Binärziffern haben gut 300 Dezimalziffern. (Will man mit so riesigen Zahlen rechnen?) Ja! – Kryptographie! Anzahl der Multiplikationen von 32-Bit-Zahlen: 0 (210 ) = 3`−5 · M 0 (25 ) = 35 = 243. MKa Ka Schulmethode: (2`−5 )2 = 1024 Multiplikationen. Zahlen mit 32768 Binärziffern haben etwa 9900 Dezimalziffern. 0 (215 ) = 315−5 · M 0 (25 ) = 310 = 59049. MKa Ka Schulmethode: (215−5 )2 = 220 Multiplikationen, mehr als 1 Million! Ersparnis: Faktor 18. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 33 Kapitel 1 Divide-and-Conquer Multiplikation ganzer Zahlen Geht es noch besser? Theoretisch ja, praktisch eigentlich kaum. Mitteilung: Schönhage-Strassen (1971): Multiplikation zweier n-Bit-Zahlen mit O(n log n log log n) Gattern. Arnold Schönhage und Volker Strassen: Schnelle Multiplikation großer Zahlen, Computing 7, 1971, Springer Verlag, S. 281–292 Fürer (2007), De et al. (2008): Multiplikation zweier n-Bit-Zahlen mit ∗ log O(n log n · 2 n ) Gattern. Martin Fürer: Faster integer multiplication, STOC 2007, S. 57–66. De/Saha/Kurur/Saptharishi: Fast integer multiplication using modular arithmetic. STOC 2008, S. 499–506. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 34 Kapitel 1 Divide-and-Conquer Multiplikation ganzer Zahlen Dabei ist log∗ n definiert als die kleinste Zahl i mit log log . . . log n ≤ 1. | {z } i−mal ∗ Also: log 2 = 1, log∗ 4 = 2, log∗ 16 = 3, log∗ 65536 = 4, log∗ (265536 ) = 5, 65536 65536 log∗ (22 ) = 6, und 22 ist schon eine sehr große Zahl. (Leider sind beide Algorithmen in der Praxis nicht so sehr hilfreich.) FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 35 Kapitel 1 Divide-and-Conquer Matrixmultiplikation 1.2 Matrixmultiplikation Es sei R irgendein Ring.1 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 X cij = aik bkj . 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. 1 Man kann addieren, subtrahieren, multiplizieren. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 36 Kapitel 1 Divide-and-Conquer Matrixmultiplikation Wir nehmen an: n = 2` , Zweierpotenz. Eingabe: n × n-Matrizen A, B. Falls n ≤ n0 : Berechne A · B mit der direkten Methode. n03 Multiplikationen. Falls n > n0 : Zerlege A, B in jeweils 4 quadratische ( n2 × n2 )-Teilmatrizen: A= C E D F , B= G K H L Dann (leicht zu sehen): A·B = FG KTuEA, TU Ilmenau CG + DK EG + FK CH + DL EH + FL Effiziente Algorithmen – Sommersemester 2012 37 Kapitel 1 Divide-and-Conquer Matrixmultiplikation Suggeriert rekursiven Ansatz, in dem 8 Multiplikationen von ( n2 × n2 )-Teilmatrizen durchgeführt werden. Einfache Analyse ergibt: n3 Multiplikationen in R, kein Gewinn. (Unten: Mit Master-Theorem: O(n3 ).) FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 38 Kapitel 1 Divide-and-Conquer Matrixmultiplikation Strassen-Trick: 7 Multiplikationen genügen. P1 P2 P3 P4 Dann: = C (H − L) = (C + D)L = (E + F )G = F (K − G ) AB = P5 = (C + F )(G + L) P6 = (D − F )(K + L) P7 = (C − E )(G + H) P5 + P4 − P2 + P6 P1 + P2 P3 + P4 P1 + P5 − P3 − P7 Von Hand nachzukontrollieren! 18 Additionen. (Alternative Methode, etwas komplizierter: 15 Additionen.) FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 39 Kapitel 1 Divide-and-Conquer Matrixmultiplikation Aufwandsanalyse (einfachst): Für n0 = 1, M(n) = Anzahl der Ringmultiplikationen. (Nur im Basisfall der Rekursion!) M(1) = 1; M(n) = 7M(n/2) für n > 1. Für n = 2` : M(2` ) = 7M(2`−1 ) = . . . = 7` M(1) = 7` . 7` = 2` log2 7 = nlog2 7 mit log2 7 ≈ 2,81. Aufwandsanalyse (etwas komplizierter): Ringadditionen. A(1) = 0; A(n) ≤ 7A(n/2) + cn2 (für eine Konstante c). Rechnung wie bei Zahlen-Multiplikation ergibt: FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 40 Kapitel 1 Divide-and-Conquer Matrixmultiplikation A(2` ) ≤ 7 · A(2`−1 ) + c · (22 )` ≤ 72 · A(2`−2 ) + c · 7 · (22 )`−1 + c · (22 )` .. . X ` 0 ≤ 7 · A(2 ) + c · (22 /7)`−j | {z } 0≤j≤`−1 =0 X ` = 7 ·c · (22 /7)`−j 0≤j≤`−1 4 1 − (4/7)` 4 1 ` = 7 ·c · · < 7 · c · · 3 = (4c/3) · 7` . 7 1 − (4/7) 7 7 ` Wieder O(nlog2 7 )! Alternative: Master-Theorem. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 41 Kapitel 1 Divide-and-Conquer Mergesort 1.3 Erinnerung: Mergesort Um n Zahlen/Objekte a1 , . . . , an zu sortieren, geht der Mergesort-Algorithmus so vor: Falls n ≤ n0 : Sortiere mit einem naiven Algorithmus (z. B. Insertion Sort). Sonst: k := bn/2c. Sortiere a1 , . . . , ak (erste Hälfte) rekursiv, Ergebnis b1 , . . . , bk ; sortiere ak+1 , . . . , an (zweite Hälfte) rekursiv, Ergebnis bk+1 , . . . , bn . Mische“ die Folgen b1 , . . . , bk und bk+1 , . . . , bn zu einer sortierten Folge ” zusammen Reißverschlussverfahren“ – Aufwand: ≤ n − 1 Vergleiche. ” FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 42 Kapitel 1 Divide-and-Conquer Mergesort Analyse über Rekurrenzungleichungen“: ” Wir zählen nur Vergleiche. C (n) = Anzahl der Vergleiche beim Sortieren von n Eingaben, schlechtester Fall. C (1) = 0, C (2) = 1, C (3) = 3. C (n) = C (bn/2c) + C (dn/2e) + n − 1. Behauptung: C (n) = ndlog ne − (2dlog ne − 1). 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 ... ... Beweis: Tafel. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 43 Kapitel 1 Divide-and-Conquer Mergesort Satz 1.3.1 Für die Vergleichsanzahl im schlechtesten Fall bei Mergesort gilt: C (n) ≤ n log n. Beweis: Tafel. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 44 Kapitel 1 Divide-and-Conquer Master-Theorem 1.4 Das Master-Theorem Wir betrachten Rekurrenzungleichungen der folgenden Form: g , falls n = 1 B(n) ≤ a · B(n/b) + f (n) , sonst. Dabei: a ≥ 1 eine ganze Zahl, b > 1 ist eine Konstante, f (n) ist eine monoton wachsende Funktion. Falls n/b keine ganze Zahl ist, sollte man sich an Stelle von B(n/b) z. B. B(dn/be) denken. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 45 Kapitel 1 Divide-and-Conquer Master-Theorem Ergibt sich bei Divide-and-Conquer-Algorithmus mit: Trivialer Basisfall (Größe 1) hat höchstens Kosten g , aus Instanz der Größe n > 1 werden ( divide“) a Teilinstanzen der Größe ” n/b (passend gerundet) gebildet, es erfolgen a rekursive Aufrufe, und die a Lösungen werden kombiniert. Kosten für das Aufspalten und das Kombinieren: f (n). O.B.d.A.: B(n) monoton wachsend. – Sonst definiere: B̂(n) = max{B(i) | 1 ≤ i ≤ n}. B̂(n) ist monoton und erfüllt die Rekurrenzungleichung. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 46 Kapitel 1 Divide-and-Conquer Master-Theorem Vereinfachende Annahmen (nicht wesentlich): n = b` . b > 1 ist ganzzahlig. Level 0: Wurzel, hat Eintrag f (n) und hat a Kinder auf Level 1. Knoten v auf Level i < ` hat Eintrag f (n/b i ) und hat a Kinder auf Level i + 1. Knoten auf Level ` sind Blätter, sie haben Eintrag g . FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 47 Kapitel 1 Divide-and-Conquer Master-Theorem f (n) f (n) a f (n/b) a · f (n/b) f (n/b) a f (n/b 2 ) f (n/b 2 ) f (n/b 2 ) f (n/b 2 ) a2 · f (n/b 2 ) ` g g g g g g g FG KTuEA, TU Ilmenau g g g g g g g g g g g g g g g g g g g Effiziente Algorithmen – Sommersemester 2012 g g g g g g a` · g 48 Kapitel 1 Divide-and-Conquer Master-Theorem Lemma 1.4.1 Wenn v ein Knoten auf Level i ist, dann gilt: B(n/b i ) ≤ Summe der Einträge im Unterbaum unter v . (Beweis durch Induktion über ` − i.) Also: B(n) ≤ Summe aller Einträge im Baum. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 49 Kapitel 1 Divide-and-Conquer Master-Theorem Auf Level i gibt es ai Knoten mit Eintrag f (n/b i ). Summation liefert: B(n) ≤ X ai · f (n/b i ) + a` · g . 0≤i<` Erster Term B1 : Beitrag zu Gesamtkosten aus dem Inneren des Baums. Zweiter Term B2 : Beitrag von den Blättern. (Algorithmisch: Die a` Basisfälle.) – Leicht: B2 (n) = a` · g = (b logb a )` · g = (b ` )logb a · g = nlogb a · g . FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 50 Kapitel 1 Divide-and-Conquer Erster Term: B1 (n) = P 0≤i<` a i Master-Theorem · f (n/b i ). 3 Fälle, je nach Verhalten des Gesamtaufwandes ai · f (n/b i ) auf Level i, für i = 0, . . . , ` − 1. Intuitiv: 1. Fall: ai · f (n/b i ) wächst mit i an. 2. Fall: ai · f (n/b i ) bleibt in etwa gleich über alle i. 3. Fall: ai · f (n/b i ) schrumpft mit i. Genaueres folgt. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 51 Kapitel 1 Divide-and-Conquer Master-Theorem 1. Fall: f (n) = O(nα ) mit b α < a. Die Beiträge aus den unteren Baumebenen (kleine Instanzen) dominieren, nicht wegen ihrer Größe, sondern wegen ihrer Anzahl. f (n) f (n/b) f (n/b 2 ) f (n/b 2 ) f (n/b 2 ) f (n/b) f (n/b 2 ) f (n/b 2 ) f (n/b) f (n/b 2 ) f (n/b 2 ) f (n/b 2 ) f (n/b 2 ) g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g g FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 52 Kapitel 1 Divide-and-Conquer Master-Theorem Wir benutzen immer die Summenformel für geometrische Reihen: (∗) X 0≤i<` FG KTuEA, TU Ilmenau `−1 q qi = , für q ≥ 0, q 6= 1. q−1 Effiziente Algorithmen – Sommersemester 2012 53 Kapitel 1 Divide-and-Conquer B1 (n) = X Master-Theorem ai · f (n/b i ) 0≤i<` =O X ai · n α bi 0≤i<` X a i = O nα · bα 0≤i<` α ` (a/b ) α =O n · (a/b α ) − 1 1 α ` =O n ·a · ` α (b ) = O(a` ). Also: B(n) ≤ B1 (n) + B2 (n) = O(a` ) = O(nlogb a ). FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 54 Kapitel 1 Divide-and-Conquer Master-Theorem 1. Fall: f (n) = O(nα ) mit b α < a. Typische Beispiele: Karatsuba-Algorithmus, Strassen-Algorithmus. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 55 Kapitel 1 Divide-and-Conquer Master-Theorem 2. Fall: f (n) = O(nlogb a ). f (n/b i ) wächst mit n/b i , i = ` − 1, . . . , 0, höchstens mit einer Rate, die durch das Schrumpfen der Größe der Baumebene ausgeglichen wird. Der Gesamtaufwand ist beschränkt durch den Aufwand für die Ebene direkt über den Blättern, multipliziert mit der Anzahl der Levels. f (n) f (n/b) f (n/b) f (n/b 2 ) g g g g FG KTuEA, TU Ilmenau g f (n/b 2 ) g g g g g g g g f (n/b 2 ) g g g g g g g g f (n/b 2 ) g g g Effiziente Algorithmen – Sommersemester 2012 g g g g g g g g 56 Kapitel 1 Divide-and-Conquer B1 (n) = X Master-Theorem ai · f (n/b i ) 0≤i<` =O X ai · 0≤i<` n logb a bi logb a n =O a · ai 0≤i<` = O ` · nlogb a . X i Also: B(n) ≤ B1 (n) + B2 (n) = O(` · nlogb a ) + O(nlogb a ) = O((log n) · nlogb a ). Typische Beispiele: Mergesort, Binäre Suche. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 57 Kapitel 1 Divide-and-Conquer Master-Theorem 3. Fall: f (n) = Ω(nα ), mit b α > a UND (Regularitätsbedingung: f wächst stets mit der entsprechenden Rate) Es gibt ein c < 1 mit: f (n) ≥ (a/c) · f (n/b). Wenn man die Größe des Inputs von n/b auf n erhöht, wachsen die Kosten im Knoten von f (n/b) auf f (n), mindestens um den Faktor a/c > a. f (n) wächst sehr rasch mit n, so dass der Beitrag der oberen Baumebenen und insbesondere der Wurzel überwiegt. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 58 Kapitel 1 Divide-and-Conquer Master-Theorem f (n) f (n/b) f (n/b 2 ) FG KTuEA, TU Ilmenau f (n/b) f (n/b 2 ) f (n/b 2 ) Effiziente Algorithmen – Sommersemester 2012 f (n/b 2 ) 59 Kapitel 1 Divide-and-Conquer Master-Theorem Aus der Regularitätsbedingung gewinnen wir: c f (n/b) ≤ · f (n) a c 2 f (n/b 2 ) ≤ · f (n) a .. . c i f (n/b i ) ≤ · f (n) , also: a FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 60 Kapitel 1 Divide-and-Conquer B1 (n) = X Master-Theorem ai · f (n/b i ) 0≤i<` ≤ X i a · c i 0≤i<` = X a · f (n) c i · f (n) 0≤i<` = f (n) · X ci 0≤i<` = O(f (n)), weil P 0≤i<` ci FG KTuEA, TU Ilmenau = 1−c ` 1−c = O(1). Effiziente Algorithmen – Sommersemester 2012 61 Kapitel 1 Divide-and-Conquer Master-Theorem Satz 1.4.2 (Das Master-Theorem) g , falls n = 1 Es gelte B(n) ≤ a · B(n/b) + f (n) , sonst, wobei b > 1 und a ganzzahlige Konstante sind. Dann gilt für n = b ` : 1 2 3 Falls f (n) = O(nα ) mit α < logb a, dann ist B(n) = O(nlogb a ). Falls f (n) = O(nlogb a ), dann ist B(n) = O(nlogb a · log n). Falls f (n) = Ω(nα ) mit α > logb a und f (n) ≥ konstant, dann ist B(n) = O(f (n)). FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 a c · f (n/b), für c < 1 62 Kapitel 1 Divide-and-Conquer Master-Theorem Erweiterungen: Dieselben Formeln gelten für: Beliebige n, nicht nur n = b ` . Verallgemeinerte Relation B(n) ≤ a · B(n0 ) + f (n), n0 ≤ dn/be + d. b > 1 nicht ganzzahlig. Analoge untere Schranken. Genaueres im Buch von Cormen, Leiserson, Rivest und Stein. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 63 Kapitel 1 Divide-and-Conquer Quicksort 1.5 Quicksort (Hoare1 ) – Neue Analyse Input: Folge/Array (a1 , . . . , an ). – Falls n = 1, Ausgabe (a1 ). Falls n = 2, sortiere mit einem Vergleich. – Sonst: Wähle Element x ∈ {a1 , . . . , an } als Pivotelement“ oder ” partitionierendes Element“. ” (Z.B.: x = a1 oder x = ai mit i zufällig.) Zerlege (a1 , . . . , an ) in eine Teilfolge b1 , . . . , bp−1 , alle ≤ x, in das Element x, und eine Teilfolge cp+1 , . . . , cn , alle ≥ x. Sortiere diese beiden Folgen rekursiv, Ergebnis (d1 , . . . , dp−1 ) und (ep+1 , . . . , en ). Ausgabe: Folge/Array (d1 , . . . , dp−1 , x, ep+1 , . . . , en ). FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 64 Kapitel 1 Divide-and-Conquer Quicksort C. A. R. Hoare (∗ 1934), brit. Informatiker, erfand Quicksort & Korrektheitskalkül. 1 I conclude that there are two ways of constructing a software design: One ” way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.“ (Dankesrede für den Turingpreis 1980) I think Quicksort is the only really interesting algorithm that I’ve ever ” developed.“ FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 65 Kapitel 1 Divide-and-Conquer Quicksort Analyse: Wir nehmen an, alle Schlüssel sind verschieden. Wir wählen immer das erste Element als Pivotelement – betrachten also deterministisches Quicksort. Weiter nehmen wir an, jede der n! Anordnungen sind gleich wahrscheinlich (Wahrscheinlichkeit 1/n!), und berechnen die erwartete Anzahl A(n) von Vergleichen. Falls n ≤ 1: kein Vergleich. Falls n = 2: 1 Vergleich. – Sonst: FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 66 Kapitel 1 Divide-and-Conquer Quicksort Es seien b1 < · · · < bn die Eingabe-Elemente in sortierter Reihenfolge. Es ist klar, dass bi und bj maximal einmal miteinander verglichen werden. (Wenn bi und bj verglichen werden, ist eines der beiden Pivotelement und wird nie mehr mit etwas anderem verglichen.) FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 67 Kapitel 1 Divide-and-Conquer Quicksort C := Gesamtanzahl der Vergleiche. (Zufallsvariable, abhängig von der zufälligen Anordnung am Anfang.) Sei C= X Xij , 1≤i<j≤n wobei Xij = FG KTuEA, TU Ilmenau 1 0 , falls bi und bj verglichen werden , sonst. Effiziente Algorithmen – Sommersemester 2012 68 Kapitel 1 Divide-and-Conquer Quicksort Daraus: E(C ) = X E(Xij ) = 1≤i<j≤n X Pr(Xij = 1). 1≤i<j≤n (Das folgt aus der Linearität des Erwartungswertes, normalerweise geschrieben als E(X + Y ) = E(X ) + E(Y ).) Was ist Pr(Xij = 1) = Pr(bi und bj werden verglichen)? Wir beobachten den Algorithmus. Klar: Im Zuge der Rekursion werden durch Aufspalten immer kleinere Teillisten gebildet. Solange kein Element von Iij = {bi , bi+1 , . . . , bj } Pivotelement wird, landen alle Elemente von Iij immer in derselben Teilliste (alle größer als Pivot oder alle kleiner als Pivot). FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 69 Kapitel 1 Divide-and-Conquer Quicksort In dem Moment, in dem zum ersten Mal ein Element von Iij partitionierendes Element wird, fällt die Entscheidung: Wenn dies bi oder bj ist, werden bi und bj verglichen. Wenn dies ein Element von {bi+1 , . . . , bj−1 } ist, nicht (jetzt nicht, aber auch nicht später, da sie in verschiedenen Teillisten landen). Weil alle Elemente in Iij die gleiche Wahrscheinlichkeit haben, zuerst als Pivotelement gewählt zu werden, gilt 2 2 Pr(bi und bj werden verglichen) = = . |Iij | j −i +1 Also: E(C ) = X 1≤i<j≤n FG KTuEA, TU Ilmenau 2 . j −i +1 Effiziente Algorithmen – Sommersemester 2012 70 Kapitel 1 Divide-and-Conquer X 1≤i<j≤n Quicksort X X 2 2 = j −i +1 j −i +1 1≤i≤n i<j≤n =2· X X 1≤i≤n 2≤k≤n−i+1 ≤2· X 1 k X 1 k 1≤i≤n 2≤k≤n = 2 · n · (Hn − 1) ≤ 2 · n · ln n = (2 ln 2) · n · log n < 1,3863n log n. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 71 Kapitel 1 Divide-and-Conquer Dabei ist Hn = 1 + 12 + · · · + (n-te harmonische Zahl). 1 n Quicksort ∈ [ln n + 12 , ln n + 1] Satz 1.5.1 Die durchschnittliche Anzahl von Vergleichen von Quicksort auf einer Eingabe aus n verschiedenen Zahlen, die zufällig angeordnet ist, ist höchstens 2 · n · (Hn − 1) < 1,3863n log n. Für die, die es genau wissen wollen: E(C ) = 2(n + 1)Hn − 4n = (2 log2 e)n log n − Θ(n). FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 72 Kapitel 1 Divide-and-Conquer Quicksort Variation: Randomisiertes Quicksort“. ” Das Pivotelement wird jeweils zufällig gewählt. In diesem Fall ist die gleiche Analyse anwendbar. Aber: Es gibt keine worst-case-Inputs mehr. Satz 1.5.2 Wenn man das Pivot-Element stets zufällig wählt, ist auf einer beliebigen, festen Eingabe aus n verschiedenen Zahlen die erwartete Anzahl von Vergleichen, die Quicksort ausführt, höchstens 2 · n · (Hn − 1) < 1,3863n log n. (Siehe hierzu: Randomisierte Algorithmen“.) ” FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 73 Kapitel 1 Divide-and-Conquer Selektionsproblem 1.6 Das Selektionsproblem Gegeben ist eine Folge (a1 , . . . , an ) von n Objekten aus einer totalen Ordnung (D, <) (in Array oder als Liste), sowie eine Zahl k, 1 ≤ k ≤ n. O.B.d.A.: Alle Einträge verschieden. 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 dn/2e. Median({2, 4, 7, 9}) = 4, Median({4, 7, 9}) = 7. Einfache Lösung: Sortiere, mit Ergebnis (b1 , . . . , bn ), nun wähle x = bk . – Kosten: n log n Vergleiche, Zeit O(n log n). FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 74 Kapitel 1 Divide-and-Conquer Selektionsproblem Zunächst: Ein randomisierter Algorithmus für das Auswahlproblem. Quickselect (Hoare) Ansatz: Wie bei Quicksort. Gegeben: Folge (a1 , . . . , an ), Zahl k, 1 ≤ k ≤ n. 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. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 75 Kapitel 1 Divide-and-Conquer Selektionsproblem Falls n ≥ 3: Wähle ein Element x aus {a1 , . . . , an } als partitionierendes Element zufällig. Zerlege (a1 , . . . , an ) mit n − 1 Vergleichen in eine Teilfolge b1 , . . . , bp−1 , alle < x, in das Element x, und eine Teilfolge cp+1 , . . . , cn , alle > x. 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 – Sommersemester 2012 76 Kapitel 1 Divide-and-Conquer Selektionsproblem Korrektheit: Klar. Zu analysieren: (Erwartete) Rechenzeit. Wir analysieren die erwartete Anzahl von Vergleichen. Vorgehen: Wie bei Quicksort. Wieder ist die erwartete Anzahl von Vergleichen entscheidend. Eingabezahlen, sortiert: b1 < · · · < bn . Ck = X Xij , 1≤i<j≤n wobei Xij = FG KTuEA, TU Ilmenau 1 0 , falls bi und bj verglichen werden , sonst. Effiziente Algorithmen – Sommersemester 2012 77 Kapitel 1 Divide-and-Conquer Selektionsproblem Was ist E(Xij ) = Pr(Xij = 1) = Pr(bi und bj werden verglichen)? 1. Fall: k ≤ i < j: Es kommt darauf an, ob bi oder bj vor allen anderen Einträgen in {bk , . . . , bj } Pivot werden. Pr(Xij = 1) = 2 j−k+1 . 2. Fall: i < k < j: Es kommt darauf an, ob bi oder bj vor allen anderen Einträgen in {bi , . . . , bj } Pivot werden. Pr(Xij = 1) = 2 j−i+1 . 3. Fall: i < j ≤ k: Es kommt darauf an, ob bi oder bj vor allen anderen Einträgen in {bi , . . . , bk } Pivot werden. Pr(Xij = 1) = FG KTuEA, TU Ilmenau 2 k−i+1 . Effiziente Algorithmen – Sommersemester 2012 78 Kapitel 1 Divide-and-Conquer Selektionsproblem Also: ! E(Ck ) = 2 · P k≤i<j≤n 1 j−k+1 P + 1≤i<k<j≤n 1 j−i+1 + P 1≤i<j≤k 1 k−i+1 . Erste und dritte Summe lassen sich leicht als n − k bzw. k − 1 abschätzen (Übung!). Zusammen: 2(n − 1). In der Übung zeigen wir: P 1≤i<k<j≤n 1 j−i+1 ≤ n. Zusammen: E(Ck ) ≤ 4n. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 79 Kapitel 1 Divide-and-Conquer Selektionsproblem Es gilt: X k≤i<j≤n 1 = j −k +1 n X j=k+1 j −k < j −k +1 n X 1 = n − k. j=k+1 Weiterhin gilt: X 1≤i<j≤k k−1 k−1 i=1 i=1 X k −i X 1 = < 1 = k − 1. k −i +1 k −i +1 Die Terme der Summe X 1≤i<k<j≤n 1 j −i +1 stellen wir in der nachfolgenden (k − 1) × (n − k)-Matrix dar (für k ≤ n/2): FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 80 Kapitel 1 Divide-and-Conquer Selektionsproblem X 1≤i<k<j≤n 1 k+1 1 k+2 ... ... 1 n−k+1 1 j −i +1 1 n−k+2 1 n−k+3 ... 1 n−1 1 n 1 k 1 k+1 1 k+2 ... ... 1 n−k+1 1 n−k+2 ... 1 n−2 1 n−1 .. . .. . .. .. .. .. .. .. .. . .. . 1 4 1 5 ... 1 k+1 1 k+2 ... ... 1 n−k+1 1 n−k+2 1 n−k+3 1 3 1 4 ... 1 k 1 k+1 1 k+2 ... ... 1 n−k+1 1 n−k+2 FG KTuEA, TU Ilmenau . . . . . Effiziente Algorithmen – Sommersemester 2012 . 81 Kapitel 1 Divide-and-Conquer Selektionsproblem Wir summieren entlang der Diagonalen. Auffällig: Die Summe der Elemente auf einer Diagonalen ist jeweils kleiner als 1. Es gibt maximal k − 2 + n − k Diagonalen, also gilt: X 1≤i<k<j≤n 1 < n − 2. j −i +1 Anmerkung: Im Falle k > n/2 gilt das hier gebrachte Argument nachwievor, die Matrix sieht schematisch aber etwas anders aus. Aus Symmetriegründen (Ck = Cn−k+1 ) kann man jedoch auch ohne Beschränkung der Allgemeinheit k ≤ n/2 annehmen. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 82 Kapitel 1 Divide-and-Conquer Selektionsproblem Satz 1.6.1 Der Algorithmus Quickselect löst das Auswahlproblem und hat eine erwartete Vergleichsanzahl von ≤ 4n und eine erwartete Laufzeit von O(n). FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 83 Kapitel 1 Divide-and-Conquer Selektionsproblem Mitteilung: (a) Eine genauere Analyse ergibt für α = k/n konstant eine erwartete Vergleichsanzahl von 2(1 + H(α) ln 2 + o(1))n < (3.3863 + o(1)) · n. Dabei ist H(α) = −α log α − (1 − α) log(1 − α) die binäre Entropie“. ” Sie liegt zwischen 0 und 1; das Maximum 1 ist bei α = 12 , was der Suche nach dem Median entspricht. (b) Die beste Schranke für die erwartete Vergleichsanzahl bei einem Algorithmus für das Auswahlproblem, nämlich 23 n + o(n), erreicht ein anderer randomisierter Algorithmus (siehe Vorlesung Randomisierte ” Algorithmen“). FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 84 Kapitel 1 Divide-and-Conquer Selektionsproblem Nun: Ziel: Ein deterministischer Algorithmus mit Aufwand O(n). (Erfinder: M. Blum, R. W. Floyd, V. R. Pratt, R. L. Rivest, R. E. Tarjan: lauter Pioniere der Algorithmik!) FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 85 Kapitel 1 Divide-and-Conquer Selektionsproblem Ansatz: Wie bei Quickselect: Finde ein partitionierendes Element x. Verschiebe, so dass alle Elemente < x links von x stehen, alle Elemente > x rechts. Bestimme, in welchem Teil das gesuchte Element vom Rang k ist. Rufe den Algorithmus rekursiv auf diesem Teil auf. Zentrales Problem Wie kann man deterministisch ein günstiges“ Element x bestimmen? ” FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 86 Kapitel 1 Divide-and-Conquer Selektionsproblem Algorithmus BFPRT(a1 , . . . , an , k) 1 Falls n ≤ n0 : Sortiere mit Mergesort, fertig. Sonst: 2 Teile (a1 , . . . , an ) in m = dn/5e Gruppen mit 4 bzw. 5 Elementen auf. 3 Bestimme in jeder Gruppe den Median (Bsp: Mergesort). ∗ ) die Liste dieser Mediane. Sei (a1∗ , . . . , am 4 ∗ ). Suche rekursiv mittels BFPRT nach dem Median x von (a1∗ , . . . , am 5 Zerlege (a1 , . . . , an ) in eine Teilfolge b1 , . . . , bp−1 , alle ≤ x, in das Element x, und eine Teilfolge cp+1 , . . . , cn , alle ≥ x. 6 Falls k = p: Rückgabe x. 7 Falls k < p: BFPRT(b1 , . . . , bp−1 , k). 8 Falls k > p: BFPRT(cp+1 , . . . , cn , k − p). In der Literatur bezeichnet man x als Median der Mediane“. Das Finden ” eines partitionierenden Elements erfolgt in den Schritten 2–4. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 87 Kapitel 1 Divide-and-Conquer Selektionsproblem Korrektheit: Klar. Laufzeit: Wir müssen zeigen, dass die Teilprobleme in den Schritten 4, 7 bzw. 8 um einen genügend großen Faktor kleiner sind als das Ausgangsproblem. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 88 Kapitel 1 Divide-and-Conquer Selektionsproblem Wieviele Elemente sind garantiert maximal so groß wie x? x Abbildung : Mediane der Gruppen blau gefärbt. Mediane (mit deren Gruppen) aufsteigend sortiert. Pfeilspitzen deuten auf das jeweils größere Element. Rot: Alle Elemente, die maximal so groß wie x sind. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 89 Kapitel 1 Divide-and-Conquer Selektionsproblem Effekt: bm/2c + 1 der Mediane sind maximal so groß wie x. Die Gruppen dieser Mediane beinhalten zusätzlich noch jeweils 2 kleinere Elemente. p ≥ 3 (bm/2c + 1) ≥ 3n/10. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 90 Kapitel 1 Divide-and-Conquer Selektionsproblem Wieviele Elemente sind mindestens so groß wie x? x Abbildung : Mediane der Gruppen blau gefärbt. Mediane (mit deren Gruppen) aufsteigend sortiert. Pfeilspitzen deuten auf das jeweils größere Element. Rot: Alle Elemente, die mindestens so groß wie x sind. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 91 Kapitel 1 Divide-and-Conquer Selektionsproblem Effekt: dm/2e der Mediane sind mindestens so groß wie x. Die Gruppen dieser Mediane beinhalten zusätzlich noch jeweils 2 größere Elemente. (Sonderfall: In 4-er Gruppen gibt es jeweils nur ein größeres Element. Davon gibt es aber nur maximal 4!) Es gilt p ≤ n − (3 · (dm/2e) − 4) ≤ 7n/10 + 4. Also betrachten wir im rekursiven Aufruf maximal 7n/10 + 4 Elemente! FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 92 Kapitel 1 Divide-and-Conquer Selektionsproblem Weitere Laufzeitbetrachtungen: Mediansuche in Schritt 3: 8 Vergleiche mit Mergesort, 6 Vergleiche möglich (siehe Übung.) Rekursive Mediansuche in Schritt 4: Rekursiver Aufruf mit Liste von m = dn/5e Elementen. Aufspalten in Schritt 5: Kosten n − 1 Vergleiche. Kosten für Schritt 3 und 5: 6dn/5e + n − 1 < FG KTuEA, TU Ilmenau 11 5 n Effiziente Algorithmen – Sommersemester 2012 +6· 4 5 −1< 11 5 n +4 93 Kapitel 1 Divide-and-Conquer Selektionsproblem Laufzeitanalyse: Die Laufzeit ist proportional zur Anzahl der durchgeführten Vergleiche. Wir definieren: C (n) := maximale Anzahl der Vergleiche bei Aufruf BFPRT(a1 , . . . , ap , k), p ≤ n, 1 ≤ k ≤ p. (Durch das p ≤ n“ wird die Funktion C (n) monoton.) ” Die Anzahl C (n) der Vergleiche im Algorithmus gehorcht der folgenden Rekurrenzungleichung C (n) ≤ n log n, für n ≤ n0 ; C (n) ≤ C (dn/5e) + C (7n/10 + 4) + 11n/5 + 4, für n > n0 . FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 94 Kapitel 1 Divide-and-Conquer Selektionsproblem Wir behaupten: C (n) ≤ cn für alle n und eine passende Konstante c. Die n ≤ n0 werden erledigt, indem man c ≥ log n0 wählt. Konkret: n0 = 500; jedes c ≥ 9 erfüllt die Behauptung in diesem Fall. Nun sei n > n0 . Wir rechnen: C (n) ≤ C (dn/5e) + C (7n/10 + 4) + 11n/5 + 4, I.V. ≤ cdn/5e + c(7n/10 + 4) + 11n/5 + 4 ≤ cn/5 + c + 7cn/10 + 4c + 11n/5 + 4 ≤ cn + (−cn/10 + 5c + 11n/5 + 4). Entscheidend: C (n) ≤ FG KTuEA, TU Ilmenau 9 10 cn + O(n). Effiziente Algorithmen – Sommersemester 2012 95 Kapitel 1 Divide-and-Conquer Selektionsproblem Wir wählen c so, dass cn/10 ≥ 5c + 11n/5 + 4 ist, was für c ≥ 25 und n ≥ n0 = 500 der Fall ist (nachrechnen!). Für ein solches c lässt sich der Induktionsschritt durchführen; damit gilt die Behauptung C (n) ≤ cn für alle n. Wir haben gezeigt: Satz 1.6.2 Der BFPRT-Algorithmus löst das Auswahlproblem und hat eine Laufzeit von O(n) im schlechtesten Fall. Bemerkung: Durch eine viel genauere Analyse kann die Konstante in der Vergleichsanzahl noch verbessert werden. Der beste bekannte deterministische Algorithmus (anderer Ansatz!) benötigt (2,95 + o(1))n Vergleiche. Es ist bekannt, dass jeder deterministische Algorithmus ≥ 2n Vergleiche benötigt. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 96 Kapitel 1 Divide-and-Conquer FFT 1.7 Die schnelle Fourier-Transformation (FFT) Polynom in Koeffizientendarstellung: 2 A(x) = a0 + a1 x + a2 x + . . . + an−1 x n−1 X = ai x i , 0≤i≤n−1 mit a0 , . . . , an−1 ∈ Zahlenbereich“ Z oder R oder C. ” Für die Durchführung benötigen wir komplexe Zahlen. Am Schluss wird eine Alternative skizziert, die man für Berechnungen über Z benutzen kann, ohne dabei zu komplexen Zahlen überzugehen. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 97 Kapitel 1 Divide-and-Conquer FFT Aufgabe: Gegeben zwei Polynome A(x) und B(x), als X X i A(x) = ai x und B(x) = bj x j , 0≤i≤n−1 0≤j≤n−1 berechne das Polynomprodukt X A(x) · B(x) = C (x) = ck x k , 0≤k≤2n−2 d. h. berechne die Koeffizienten ck = P i,j : i+j=k ai bj . Die Folge (c0 , . . . , c2n−2 ) heißt auch Konvolution (a0 , . . . , an−1 ) ◦ (b0 , . . . , bn−1 ). Naive Benutzung der Formel liefert Θ(n2 )-Algorithmus. Ziel: O(n log n). – Methode: Divide-and-Conquer. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 98 Kapitel 1 Divide-and-Conquer FFT Zentraler Trick: Benutze eine weitere Darstellung von Polynomen, die Stützstellen-Darstellung. Betrachte eine Folge (x0 , . . . , xn−1 ) ∈ Cn von verschiedenen Stützstellen. Fakt 1.7.1 ( Interpolation“ von Polynomen über Körpern) ” n gibt es genau ein Zu jedem beliebigen Wertevektor (r , . . . , r ) ∈ C 0 n−1 P Polynom A(x) = 0≤i≤n−1 ai x i , also genau einen Koeffizientenvektor (a0 , . . . , an−1 ), mit A(xk ) = rk für 0 ≤ k ≤ n − 1. Es ist also egal, ob man für die Darstellung eines Polynoms seine Koeffizienten oder einen Wertevektor benutzt. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 99 Kapitel 1 Divide-and-Conquer FFT Beweis von Fakt 1.7.1: Betrachte die Vandermonde-Matrix“ ” n−1 2 1 x0 x0 · · · x0 n−1 2 1 x1 x · · · x 1 1 V (x0 , . . . , xn−1 ) = . .. .. .. . . . . . . n−1 2 1 xn−1 xn−1 · · · xn−1 Offensichtlich ist A(x0 ) A(x1 ) .. . = V (x , . . . , x ) · 0 n−1 A(xn−1 ) FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 a0 a1 .. . . an−1 100 Kapitel 1 Divide-and-Conquer FFT Die Q Matrix V (x0 , . . . , xn−1 ) hat Determinante 0≤k<`≤n−1 (x` − xk ) 6= 0, ist also regulär. Daher hat das Gleichungssystem r0 a0 a1 r1 V (x0 , . . . , xn−1 ) · . = . .. .. rn−1 an−1 genau eine Lösung a0 a1 .. . = V (x0 , . . . , xn−1 )−1 · an−1 FG KTuEA, TU Ilmenau r0 r1 .. . . rn−1 Effiziente Algorithmen – Sommersemester 2012 101 Kapitel 1 Divide-and-Conquer FFT Aus der Darstellung der n-fachen Polynomauswertung als Matrix-Vektor-Produkt folgt auch: Bemerkung: Die Umrechnung von (a0 , . . . , an−1 ) in (r0 , . . . , rn−1 ) ist eine (bijektive) lineare Abbildung von Cn nach Cn . Um durch Interpolation die 2n − 1 Koeffizienten des Produktpolynoms C (x) zu erhalten, müssen wir mit mindestens 2n − 1 Stützstellen-Werte-Paaren arbeiten. Aus technischen Gründen verwenden wir 2n viele. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 102 Kapitel 1 Divide-and-Conquer FFT Algorithmenplan für die Polynommultiplikation: Eingabe: Zwei Polynome A(x) und B(x) als Koeffizientenvektoren (a0 , . . . , an−1 ) und (b0 , . . . , bn−1 ). x0 , x1 , . . . , x2n−1 seien verschiedene Stützstellen. (1) Polynomauswertung: Berechne A(xk ) und B(xk ), für k = 0, . . . , 2n − 1. (2) Berechne durch punktweise Multiplikation Werte des Produktpolynoms C (x): C (xk ) := A(xk ) · B(xk ), für k = 0, . . . , 2n − 1. (3) Interpolation: Berechne aus (C (x0 ), C (x1 ), . . . , C (x2n−1 )) die Koeffizienten (c0 , . . . , c2n−1 ) von C (x). FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 103 Kapitel 1 Divide-and-Conquer FFT Kosten: (a0 , . . . , an−1 , b0 , . . . , bn−1 ) (c0 , . . . , c2n−1 ) (1) Auswertung A(xk ), B(xk ), 0 ≤ k ≤ 2n − 1 (3) Interpolation (2) A(xk ) · B(xk ) C (xk ), 0 ≤ k ≤ 2n − 1 (1) ?? Naiv: Jeden Wert A(xk ) separat berechnen, z. B. mit dem Horner-Schema: A(xk ) = ((. . . (an−1 · xk + an−2 ) · xk . . .) · xk + a1 ) · xk + a0 Kosten: O(n2 ). (2) O(n). (3) ?? (Auch hier: O(n2 ) recht leicht zu erreichen.) FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 104 Kapitel 1 Divide-and-Conquer FFT Kosten: (a0 , . . . , an−1 , b0 , . . . , bn−1 ) (c0 , . . . , c2n−1 ) (1) O(n2 ) A(xk ), B(xk ), 0 ≤ k ≤ 2n − 1 (3) O(n2 ) (2) O(n) C (xk ), 0 ≤ k ≤ 2n − 1 Unser Ziel: O(n log n) für (1) und (3). Zunächst: Auswertung, für n = 2L Stützstellen. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 104 Kapitel 1 Divide-and-Conquer FFT Wollen dafür nutzen: Divide-and-Conquer! Idee: Nutze geschickt gewählte Stützstellen x0 , . . . , xn−1 . Dafür: Wähle x0 , . . . , xn/2−1 verschieden und betrachte als Stützstellen ±x0 , ±x1 , . . . , ±xn/2−1 . Bei der Auswertung von A(xi ) und A(−xi ) wird viel Arbeit doppelt verrichtet, nämlich die Auswertung bei den geraden Potenzen von x in A(x). FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 105 Kapitel 1 Divide-and-Conquer FFT Ansatz: Divide-and-Conquer. Wenn n = 1, ist das Ergebnis (r0 ) = (a0 ). Wenn n > 1, teilen wir A(x) in zwei Teilpolynome auf: A(x) = (a0 + a2 x 2 + a4 x 4 + · · · + an−2 x n−2 ) + x(a1 + a3 x 2 + a5 x 4 + · · · + an−1 x n−2 ), mit den Abkürzungen ( gerade“, “ungerade“) ” Ag (x) := a0 + a2 x + · · · + an−2 x n/2−1 und Au (x) := a1 + a3 x + · · · + an−1 x n/2−1 also A(x) = Ag (x 2 ) + xAu (x 2 ). FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 (2) 106 Kapitel 1 Divide-and-Conquer FFT A(x) = Ag (x 2 ) + xAu (x 2 ). Dann gilt für Plus-Minus“-Paare von Stützstellen: ” A(xi ) = Ag (xi2 ) + xi Au (xi2 ) A(−xi ) = Ag (xi2 ) − xi Au (xi2 ) Also: 2 Teilprobleme der Größe n/2, O(1) Aufwand zum Kombinieren. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 107 Kapitel 1 Divide-and-Conquer FFT Problem: Auf oberster Rekursionsstufe: ±x0 , . . . , ±xn/2−1 als Plus-Minus“-Paare gewählt. ” 2 Im rekursiven Aufruf: x02 , . . . , xn/2−1 müssen wieder die Eigenschaft besitzen, dass wir Plus-Minus“-Paare dort finden! ” Wie soll das gehen? FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 108 Kapitel 1 Divide-and-Conquer FFT ω sei primitive n-te Einheitswurzel, d. h. (i) ω n = 1, (ii) für 1 ≤ k ≤ n − 1 gilt P (ω k )j = 0. 0≤j≤n−1 (iii) ω k 6= 1, für 1 ≤ k ≤ n − 1. Unter einfachen weiteren Voraussetzungen sind (ii) und (iii) äquivalent: P – Wenn ω k = 1 ist, dann folgt 0≤j≤n−1 (ω k )j = n. Daher folgt (iii), wenn (ii) und n 6= 0 gelten. k – Wenn ωP 6= 1 gilt, schreiben wir: (ω k − 1)( 0≤j≤n−1 (ω k )j ) = (ω k )n − 1 = 0. Daher folgt (ii), wenn (iii) gilt und zudem die Inversen (ω k − 1)−1 existieren. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 109 Kapitel 1 Divide-and-Conquer FFT In C: Eine primitive n-te Einheitswurzel ist ω := e 2πi/n = cos(2π/n) + i sin(2π/n), wobei hier i die imaginäre Einheit ist. (Beweis dieser Eigenschaft: später.) In der komplexen Zahlenebene liegt der Punkt ω also auf dem Einheitskreis, von 1 aus um den Winkel 2π/n gegen den Uhrzeigersinn verdreht. Die Potenzen ω k , 0 ≤ k ≤ n − 1, liegen in gleichen Abständen auf dem Einheitskreis. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 110 Kapitel 1 Divide-and-Conquer FFT i 4π n ω2 2π n ω 0 −1 2π n 1 +π −i FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 111 Kapitel 1 Divide-and-Conquer FFT Für n = 2L gilt: ω 0 = 1, ω n/2 = −1. Also j ∈ {0, . . . , n/2 − 1} : ω j = −ω n/2+j . Wir finden also ±-Paare. ω 2 ist selbst eine primitive Einheitswurzel für n/2. Im Rekursionsschritt werden wir wieder ±-Paare finden. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 112 Kapitel 1 Divide-and-Conquer FFT Rekursion: 8 Stützstellen. 16 Stützstellen. i i 4π n 4π n ω2 2π n ω 0 −1 2π n 1 0 −1 1 +π 4π n +π −i FG KTuEA, TU Ilmenau −i Effiziente Algorithmen – Sommersemester 2012 113 Kapitel 1 Divide-and-Conquer FFT Als (x0 , x1 , . . . , xn−1 ) wählen wir (ω 0 , ω 1 , . . . , ω n−1 ). (Beachte: ω 0 = 1, ω 1 = ω.) P Gegeben A(x) = 0≤i≤n−1 ai x i als Koeffizientenvektor (a0 , a1 , . . . , an−1 ), wollen wir also die diskrete Fourier-Transformierte (r0 , r1 , . . . , rn−1 ) = (A(1), A(ω), A(ω 2 ), . . . , A(ω n−1 )) von (a0 , . . . , an−1 ) berechnen. Die Operation (a0 , . . . , an−1 ) 7→ (A(1), A(ω), A(ω 2 ), . . . , A(ω n−1 )) heißt die diskrete Fourier-Transformation. Es handelt sich dabei um eine lineare Bijektion von Cn nach Cn . (Es gibt auch eine Fourier-Transformation für Funktionen, die auf Integralen beruht.) FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 114 Kapitel 1 Divide-and-Conquer FFT Der Ablauf ist wie folgt: A(x) = Ag (x 2 ) + xAu (x 2 ). Wir berechnen zunächst rekursiv die n Werte (s0 , . . . , sn/2−1 ) = (Ag ((ω 2 )0 ), Ag ((ω 2 )1 ), . . . , Ag ((ω 2 )n/2−1 )) und (t0 , . . . , tn/2−1 ) = (Au ((ω 2 )0 ), Au ((ω 2 )1 ), . . . , Au ((ω 2 )n/2−1 )). FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 115 Kapitel 1 Divide-and-Conquer FFT Erinnerung: Für ±-Paare gilt: A(xi ) = Ag (xi2 ) + xi Au (xi2 ) A(−xi ) = Ag (xi2 ) − xi Au (xi2 ) Also wird (r0 , r1 , . . . , rn−1 ) wie folgt berechnet: Für j = 0, . . . , n/2 − 1: rj = A(ω j ) = Ag ((ω j )2 ) + ω j · Au ((ω j )2 ) = sj + ω j · tj . rn/2+j = A(−ω j ) = Ag ((ω 2 )j ) − ω j · Au ((ω 2 )j ) = sj − ω j · tj . FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 116 Kapitel 1 Divide-and-Conquer FFT Algorithmus FFT (Schnelle Fourier-Transformation) Eingabe: (Koeffizienten-)Vektor (a0 , . . . , an−1 ), für Zweierpotenz n; primitive n-te Einheitswurzel ω. if n = 1 then return (a0 ); (s0 , . . . , sn/2−1 ) := FFT((a0 , a2 , . . . , an−2 ), ω 2 ); (t0 , . . . , tn/2−1 ) := FFT((a1 , a3 , . . . , an−1 ), ω 2 ); for j from 0 to n/2 − 1 do rj := sj + ω j · tj ; rn/2+j := sj − ω j · tj ; return (r0 , r1 , . . . , rn−1 ). FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 117 Kapitel 1 Divide-and-Conquer FFT Korrektheit: Folgt aus den vorangegangenen Überlegungen. Laufzeit: Entscheidend ist die Anzahl C (n) der arithmetischen Operationen bei Eingaben der Länge n. Rekurrenz: C (n) ≤ 1 2 · C (n/2) + cn , falls n = 1 , sonst, für eine Konstante c. Mit dem Master-Theorem, 2. Fall, ergibt sich C (n) = O(n log n). FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 118 Kapitel 1 Divide-and-Conquer FFT Satz 1.7.2 Algorithmus FFT berechnet die diskrete Fouriertransformierte eines Koeffizientenvektors im Bezug auf die Stützstellen (1, ω, ω 2 , . . . , ω n−1 ), wobei ω eine primitive n-te Einheitswurzel ist, in Zeit O(n log n). FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 119 Kapitel 1 Divide-and-Conquer FFT Kurzer Einschub: Beweis dafür, dass ω eine n-te Einheitswurzel ist. Wissen schon, dass (i) gilt. (ii) Für jedes beliebige y gilt X j 2 4 2L−1 y = (1 + y )(1 + y )(1 + y ) · · · (1 + y ). (3) 0≤j≤n−1 (Ausmultiplizieren des Produkts ergibt n = 2L Summanden y j , bei denen jeder Exponent j ∈ {0, . . . , 2L − 1} genau einmal vorkommt, wegen der Eindeutigkeit der Binärdarstellung.) Wir betrachten (3) für y = ω k , für 1 ≤ k ≤ n − 1. Schreibe k = u · 2` , mit u ungerade und 0 ≤ ` < L. Dann ist k 2L−`−1 (ω ) =ω u(2L−1 ) = (ω n/2 )u = (−1)u = −1, L−`−1 k )2 weil u ungerade ist. Also ist der Faktor (1 + (ω P in (3) gleich 0, also ist 0≤j≤n−1 (ω k )j = 0. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 ) 120 Kapitel 1 Divide-and-Conquer FFT Aktueller Stand: (a0 , . . . , an−1 , b0 , . . . , bn−1 ) (c0 , . . . , c2n−1 ) (3) O(n2 ) (1) O(n log n) A(xk ), B(xk ), 0 ≤ k ≤ 2n − 1 (2) O(n) C (xk ), 0 ≤ k ≤ 2n − 1 Es fehlt noch: Interpolation. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 121 Kapitel 1 Divide-and-Conquer FFT Auch hier ein schöner Trick. Gegeben ist (r0 , . . . , rn−1 ), gesucht der Koeffizientenvektor (a0 , . . . , an−1 ), der M(ω) · (a0 , . . . , an−1 )T = (r0 , . . . , rn−1 )T erfüllt, für die Matrix M(ω) der diskreten Fourier-Transformation: M(ω) = ((ω i )j )0≤i,j≤n−1 1 1 1 2 1 ω ω 2 )2 1 ω2 (ω = .. .. .. . . . 1 ω n−1 (ω n−1 )2 FG KTuEA, TU Ilmenau ··· ··· ··· 1 ω n−1 (ω 2 )n−1 .. . · · · (ω n−1 )n−1 Effiziente Algorithmen – Sommersemester 2012 . 122 Kapitel 1 Divide-and-Conquer FFT Man kann die zu M(ω) inverse Matrix direkt bestimmen. Setze ω̂ := ω n−1 . Dann gilt ω · ω̂ = ω n = 1, also ist ω̂ = ω −1 . Betrachte M(ω̂) = ((ω̂ i )j )0≤i,j≤n−1 1 1 1 2 1 ω̂ ω̂ 2 (ω̂ 2 )2 = 1 ω̂ .. .. .. . . . 1 ω̂ n−1 (ω̂ n−1 )2 FG KTuEA, TU Ilmenau ··· ··· ··· 1 ω̂ n−1 (ω̂ 2 )n−1 .. . · · · (ω̂ n−1 )n−1 Effiziente Algorithmen – Sommersemester 2012 123 Kapitel 1 Divide-and-Conquer FFT Wir berechnen den Eintrag zij an Stelle (i, j) der Produktmatrix M(ω) · M(ω̂): X X i k k j zij = (ω ) · (ω̂ ) = (ω i+(n−1)j )k . 0≤k≤n−1 0≤k≤n−1 Es gibt zwei Fälle. Wenn i = j gilt, ist ω i+(n−1)j = (ω n )i = 1, und die Summe ist n. Wenn i > j gilt, ist ω i+(n−1)j = ω ` für 1 ≤ ` = i − j ≤ n − 1. Wenn i < j gilt, ist ω i+(n−1)j = ω ` für 1 ≤ ` = n − (j − i) ≤ n − 1. Wegen Bedingung (ii): X (ω ` )k = 0. zij = 0≤k≤n−1 FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 124 Kapitel 1 Divide-and-Conquer FFT Also: M(ω) · M(ω̂) = n · In , für die n × n-Einheitsmatrix In . Das heißt: M(ω)−1 = n−1 · M(ω̂). Wenn also (r0 , . . . , rn−1 ) der für die Interpolation gegebene Wertevektor ist, so erhalten wir den Koeffizientenvektor als (a0 , . . . , an−1 )T = n−1 · M(ω̂) · (r0 , . . . , rn−1 )T . FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 125 Kapitel 1 Divide-and-Conquer FFT Für die Zahl ω̂ beobachten wir: (i) ω̂ n = (ω n−1 )n = (ω n )n−1 = 1n−1 = 1, (ii) für 1 ≤ k ≤ n − 1 gilt ω̂ kP= (ω n−1 )k = ω n(k−1) ω n−k = ω n−k , mit 1 ≤ n − k ≤ n − 1, also 0≤j≤n−1 (ω̂ k )j = 0. Das heißt: Auch ω̂ ist eine primitive n-te Einheitswurzel. Multiplikation mit M(ω̂) entspricht der FFT-Operation mit ω̂ an Stelle von ω. – Wir erhalten für die Interpolation: (a0 , . . . , an−1 ) = n−1 · FFT((r0 , . . . , rn−1 ), ω̂). Zeitaufwand: O(n log n). FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 126 Kapitel 1 Divide-and-Conquer FFT Wir können nun unseren Algorithmenplan umsetzen: Algorithmus FFT-PM (Polynommultiplikation) Eingabe: (Koeffizienten-)Vektoren (a0 , . . . , an−1 ), (b0 , . . . , bn−1 ), für Zweierpotenz n. Berechne 2n-te Einheitswurzeln ω := e πi/n und ω̂ := ω 2n−1 . A (r0A , . . . , r2n−1 ) := FFT((a0 , . . . , an−1 , 0, . . . , 0), ω); B (r0B , . . . , r2n−1 ) := FFT((b0 , . . . , bn−1 , 0, . . . , 0), ω); for j from 0 to 2n − 1 do rjC := rjA · rjB ; (c0 , c1 , . . . , c2n−1 ) := 1 2n C · FFT((r0C , . . . , r2n−1 ), ω̂); return (c0 , c1 , . . . , c2n−1 ). FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 127 Kapitel 1 Divide-and-Conquer FFT Satz 1.7.3 Algorithmus FFT-PM berechnet die Koeffizienten des Produktes zweier durch Koeffizientenvektoren gegebener Polynome in Zeit O(n log n). Beweis: Siehe vorherige Überlegungen. (Rechenaufwand: O(2n log(2n)) = O(n log n).) (a0 , . . . , an−1 , b0 , . . . , bn−1 ) (c0 , . . . , c2n−1 ) (1) O(n log n) A(xk ), B(xk ), 0 ≤ k ≤ 2n − 1 FG KTuEA, TU Ilmenau (3) O(n log n) (2) O(n) C (xk ), 0 ≤ k ≤ 2n − 1 Effiziente Algorithmen – Sommersemester 2012 128 Kapitel 1 Divide-and-Conquer FFT Für Zuhause: Es folgen weitere Anmerkungen zur Geschichte und Anwendung der FFT. (Nicht prüfungsrelevant.) Zum Üben: Berechnen Sie (x + 1) · (x 2 + 1) mittels FFT! FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 129 Kapitel 1 Divide-and-Conquer FFT Der FFT-Ansatz ermöglicht es auch, die diskrete Fourier-Transformatierte eines Vektors sehr effizient parallel zu berechnen, entweder mit mehreren Prozessoren oder sogar in Hardware. Die Überlegungen hierzu führen auch zu einer sehr effizienten iterativen Formulierung des Algorithmus. In Algorithmus FFT können die beiden rekursiven Aufrufe unabhängig voneinander parallel durchgeführt werden (in Hardware: zwei Kopien der gleichen Schaltung nötig). Die Berechnung des Resultates (r0 , . . . , rn−1 ) kann sogar für alle n Werte gleichzeitig erfolgen. Eine Beispielschaltung findet man auf Seite 69 im Buch von S. Dasgupta, C. Papadimitriou, U. Vazirani, Algorithms, McGraw-Hill, 2007. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 130 Kapitel 1 Divide-and-Conquer FFT Wozu eigentlich Polynommultiplikation oder Faltung“ ” X ck = ai bj , für 0 ≤ k ≤ 2n − 1 ? i,j : i+j=k Zentrales Hilfsmittel bei der Digitalen Signalverarbeitung“. ” Offizielle Publikation: [Cooley/Tukey 1965]. Form des Algorithmus 1805 von C. F. Gauß entworfen (und zur Berechnung von Asteroidenbahnen benutzt). Erstmalig publiziert wurde eine Variante des Algorithmus von C. Runge (1903/05). (Quelle hierfür: Wikipedia – kann stimmen, muss aber nicht.) FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 131 Kapitel 1 Divide-and-Conquer FFT Wir stellen uns ein System vor, in dem regelmäßig Signale anfallen und (zu Ausgabesignalen) verarbeitet werden. Abtastzeitpunkte t0 , t1 , . . . mit festem Abstand ∆ = ti+1 − ti liefern (reelle, komplexe) Signalwerte a0 , a1 , a2 , . . .. Ein Verarbeitungsmechanismus soll diese Messwertfolge in eine Ausgabefolge c0 , c1 , c2 , . . . umsetzen, mit Ausgabezeiten t00 , t10 , t20 , . . ., ebenso mit Abstand ∆. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 132 Kapitel 1 Divide-and-Conquer FFT Die einfachsten Mechanismen sind linear . . . (wenn man zwei Signalfolgen addiert, addieren sich die Ausgabefolgen, ebenso bei Multiplikation mit konstanten Faktoren) und zeitinvariant . . . (wenn die gleiche Signalfolge um einen Zeitschritt ∆ versetzt auftritt, ergibt sich die gleiche um ∆ versetzte Ausgabefolge). FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 133 Kapitel 1 Divide-and-Conquer FFT Leicht zu sehen: Bei linearen, zeitinvarianten Signalverarbeitungs-Systemen ist durch die Ausgabefolge (b0 , b1 , b2 , . . .), die von einem Signal der Größe 1 bei t0 und sonst nur Nullsignalen ausgelöst wird, die Ausgabefolge (c0 , c1 , c2 , . . .) auf einer beliebigen Signalfolge (a0 , a1 , . . .) eindeutig bestimmt, durch: X ck = ai bj . i+j=k Das ist gerade die Folge der Koeffizienten des Produktpolynoms. D.h.: Lineare, zeitinvariante Reaktion auf Mess-Signale führt unmittelbar zum Problem Polynommultiplikation“. ” FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 134 Kapitel 1 Divide-and-Conquer FFT Multiplikation ganzer Zahlen“: ” Wir wollen zwei Zahlen x, y mit je N Bits multiplizieren, N ist extrem groß. √ Wir zerlegen die Binärdarstellung von x und y in Blöcke der Länge N. Indem wir jeweils jeden dritten Block nehmen, bilden wir aus x und y jeweils drei Zahlen, so dass x = x0 + x1 + x2 und y = y0 + y1 + y2 √ gilt und so √ dass xi · yj als Multiplikation von Zahlen mit N Ziffern im Bereich [ N] aufgefasst werden kann. Durch die großen eingestreuten Blöcke von Nullen gibt es keine Überträge. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 135 Kapitel 1 Divide-and-Conquer FFT Die Ziffern“ der Produkte xi · yj stellen sich als die Koeffizienten eines ” Produktpolynoms heraus. √ Mit der FFT könnte man diese Ziffern der Teilprodukte in O( N log N) Multiplikationen von komplexen Zahlen ermitteln. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 136 Kapitel 1 Divide-and-Conquer FFT Unter der Annahme, dass eine solche Multiplikation (durch √ geeignete Rundung auf komplexe Zahlen mit Darstellungslänge O( N)) in Zeit O(N) möglich ist, erhalten wir einen Gesamtzeitaufwand von O(N 3/2 log N), sogar besser als der Zeitbedarf des Karatsuba-Multiplizierers. Durch Einziehen von Rekursionsstufen lässt sich die Zeit weiter drücken; wenn man es konsequent durchführt, auf O(N 1+ε ) für beliebige konstante ε > 0 (Verfahren von Toom/Cook, z. B. im Buch The Art of Computer ” Programming, Vol. 2: Seminumerical Algorithms“ von D. Knuth beschrieben). Für den Multiplikationsalgorithmus von Schönhage und Strassen mit Kosten O(N log N log log N) sind neben der FFT noch weitere Ideen nötig. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 137 Kapitel 1 Divide-and-Conquer FFT Bemerkung für C-Vektorraum-Spezialisten: Die DFT ist eine Koordinatentransformation für einen Basiswechsel im C-Vektorraum Pn der Polynome vom Grad bis zu n − 1. Man betrachtet ein inneres Produkt in Pn : DX E X ai X i , bi X i = i i X ai b i . 0≤i≤n−1 Definiere fj (X ) als das (eindeutig bestimmte) Polynom, das fj (ω k ) = [j = k] erfüllt, für 0 ≤ k ≤ n − 1. Dann ist die Standardbasis“ ” 2 Bn = (1, X , X , . . . , Xn−1 ) Orthonormalbasis von Pn und die Fourierbasis“ Fn = (f0 (X ), f1 (X ), . . . , fn−1 (X )) Orthogonalbasis ” von Pn . Die Matrix M(ω) ist die Matrix für den Basiswechsel von Bn (Koeffizienten (a0 , . . . , an−1 ) nach Fn (Koeffizienten (A(ω 0 ), . . . , A(ω n−1 ))), die Matrix M(ω)−1 = n1 M(ω̂) ist für den umgekehrten Basiswechsel zuständig. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 138 Kapitel 1 Divide-and-Conquer FFT Für die Arbeit mit ganzen Zahlen ist die oben beschriebene FFT sehr unbequem, weil man mit komplexen Zahlen rechnen muss. In gewissen Situationen kann man FFT auch modulo m“ durchführen, für ” geeignete Teiler m, und ganz im diskreten Bereich bleiben. Fakt 1.7.4 Wenn w = 2 und n eine Zweierpotenz ist, dann gilt für m = 2n/2 + 1: (i) w n mod m = 1 und w n/2 mod m = −1. P (ii) Für 1 ≤ k ≤ n − 1 gilt 0≤j≤n−1 (w k )j = 0. (iii) Für 1 ≤ k ≤ n − 1 gilt w k 6= 1. (iv) Es gibt n̂, ŵ mit (n · n̂) mod m = 1 und (w · ŵ ) mod m = 1. Die Zahl w spielt also im Ring Zm die Rolle einer n-ten Einheitswurzel, sie besitzt eine Inverse ŵ , und auch n hat eine Inverse n̂. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 139 Kapitel 1 Divide-and-Conquer FFT Beispiel: w = 2, n = 32, m = 216 + 1 = 65537, ŵ = 32769, n̂ = 63489. Man kann sich überlegen, dass in dieser Situation alle Überlegungen, die wir oben für ω, ω̂, n, n−1 angestellt haben, für w , ŵ , n, n̂ ebenso funktionieren, wir also den FFT-Algorithmus auch mit Addition und Multiplikation modulo m“ benutzen können, obwohl Zm normalerweise ” kein Körper ist. Damit lassen sich die Koeffizienten von Produkten ganzzahliger Polynome mit FFT ohne Umweg über die komplexen Zahlen berechnen, und auch in der Situation der Multiplikation von ganzen Zahlen ist diese FFT-Version günstiger. Einzige Voraussetzung: m muss so groß sein, dass die Koeffizienten ck des Produktpolynoms schon durch den Wert ck mod m eindeutig bestimmt sind. FG KTuEA, TU Ilmenau Effiziente Algorithmen – Sommersemester 2012 140