Algorithmen I
Transcription
Algorithmen I
Algorithmen I Dennis Hofheinz und Henning Meyerhenke Übungen: Christian Staudt und Christoph Striecks Institut für theoretische Informatik Web: https://crypto.iti.kit.edu/algo-sose15 (Folien von Peter Sanders) 1 Organisatorisches Vorlesungen: Mo: 15:4517:15 Mi: 14:0014:45 Saalübung: Mi: 14:4515:30 Tutorium: wöchentlich, ab nächster Woche Einteilung mittels Webinscribe https://webinscribe.ira.uka.de/ Übungsblätter: wöchentlich Ausgabe Mittwoch nach der Vorlesung/Übung Abgabe Freitag 12:45 Uhr (9 Tage nach Ausgabe) 2 Organisatorisches Sprechstunde (DH): Donnerstag, 10.3011.30 Uhr (jederzeit bei oener Tür oder nach Vereinbarung) I Dennis Hofheinz, Raum 279 Sprechstunde (HM): ab 18. Mai: Montag, 13.0014.00 Uhr (oder nach Vereinbarung) I Henning Meyerhenke, Raum 033 3 Organisatorisches Mittsemesterklausur: zur Kontrolle Abschlussklausur: 28.09.2015, 100% der Note nächste Versuchsmöglichkeit: nach dem WS 15/16 4 Materialien I Folien, Übungsblätter I Diskussionsforum: Link siehe Homepage I Buch: K. Mehlhorn, P. Sanders Algorithms and Data Structures The Basic Toolbox vorl. Version der dt. Übersetzung online I Taschenbuch der Algorithmen Springer 2008 (Unterhaltung / Motivation) 5 Weitere Bücher I Algorithmen - Eine Einführung von Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, und Cliord Stein von Oldenbourg I Algorithmen und Datenstrukturen von Thomas Ottmann und Peter Widmayer von Spektrum Akademischer Verlag I Algorithmen kurz gefasst von Uwe Schöning von Spektrum Akad. Vlg., Hdg. 6 Algorithmus? Kann man das essen? Pseudogriechische Verballhornung eines Namens, der sich aus einer Landschaftsbezeichnung ableitet: Al-Khwarizmi war persischer/usbekischer Wissenschaftler (aus Khorasan) aber lebte in Bagdad ≈ 780..840. Machtzentrum des arabischen Kalifats auf seinem Höhepunkt. Er hat ein Rechenlehrbuch geschrieben. Algorithmus wurde zum Synonym für Rechenvorschrift. Unter einem Algorithmus versteht man eine genau denierte Handlungsvorschrift zur Lösung eines Problems oder einer bestimmten Art von Problemen in endlich vielen Schritten. 7 Algorithmik Kerngebiet der (theoretischen) Informatik mit direktem Anwendungsbezug Algorithmik effiziente Soft− u. Hardware Logik korrekte praktische theoretische Informatik 8 Datenstruktur Ein Algorithmus bearbeitet Daten. Wenn ein Teil dieser Daten eine (interessante) Struktur haben, nennen wir das Datenstruktur. Immer wiederkehrende Datenstrukturen und dazugehörige Algorithmenteile wichtige Grundwerkzeuge (Basic Toolbox) 5 17 2 3 2 3 7 11 13 5 7 11 13 19 17 19 00 9 Themenauswahl: Werkzeugkasten Immer wieder benötigte I Datenstrukturen I Algorithmen I Entwurfstechniken I Analysetechniken neue Algorithmen Leistungsgarantien, objektiver Algorithmenvergleich Jeder Informatiker braucht das Pichtvorlesung 10 Inhaltsübersicht 1. Amuse Geule 2. Einführung Appetithäppchen der Werkzeugkasten für den Werkzeugkasten 3. Folgen, Felder, Listen 4. Hashing 5. Sortieren Mütter und Väter aller Datenstrukturen Chaos als Ordnungsprinzip Ezienz durch Ordnung 6. Prioritätslisten immer die Übersicht behalten 7. Sortierte Liste die eierlegende Wollmilchsau 8. Graphrepräsentation 9. Graphtraversierung 10. Kürzeste Wege 11. Minimale Spannbäume 12. Optimierung Beziehungen im Gri haben globalen Dingen auf der Spur schnellstens zum Ziel immer gut verbunden noch mehr Entwurfsmethoden 11 Amuse Geule Beispiel: Langzahl-Multiplikation Schreibe Zahlen als Ziernfolgen a = (an−1 . . . a0 ), ai ∈ 0..B − 1. Wir zählen (c 0 , s ):= ai +bj +c Beispiel (B = 10): 9 + 9 + 1 = (1, 9) Volladditionen: (p 0 , p ):= ai ·bj (B = 10): 9 · 9 = (8, 1) Ziernmultiplikationen: Beispiel 12 Addition // carry / Überlauf c =0 : Digit for i := 0 to n − 1 do (c , si ):= ai + bi + c sn := c a b 0 c s n Satz: Addition von n-Ziern-Zahlen 0 braucht n Ziern-Additionen. 13 Beispiel // carry / Überlauf c =0 : Digit for i := 0 to n − 1 do (c , si ):= ai + bi + c sn := c 4 5 6 a 7 8 2 b 1 1 0 1 2 3 c 8 s 14 Exkurs: Pseudocode I Kein C/C++/Java I Eher Pascal Zuweisung: + Mathe Menschenlesbarkeit vor Maschinenlesbarkeit − begin/end Einrückung trägt Bedeutung := Kommentar: // Ausdrücke: volle Mathepower {i ≥ 2 : ¬∃a, b ≥ 2 : i = ab} c =0 : Digit (c , si ):= ai + bi + c Deklarationen: Tupel: Schleifen: for , while , repeat . . . until ,. . . uvam: Buch Abschnitt 2.3, hier: just in time und on demand if , Datentypen, Klassen, Speicherverwaltung 15 Exkurs vom Exkurs: Wieso nicht C++/Java-like? I Klare Unterscheidung von Programmcode I viele redundante ()[]; for ist sehr low level == ist unschön während := I C I für Zuweisung klarer ist I C Logik/Bitoperatoren sind kryptischer als ∧ etc. I Wir verwendenen C++/Java-Notation wo dies sinnvoll ist // + + −, − + = − = I Mathenotation ist oft mächtiger 16 Ziernmultiplikation Function a : Array [0..n − 1] of numberTimesDigit( Digit, b : Digit) low(ab) high(ab) 0 c result n 0 17 Beispiel numberTimesDigit(256, 4) 8 0 4 0 2 2 high(ab) 1 0 0 c 1 0 2 4 low(ab) result 18 Ziernmultiplikation Function a : Array [0..n − 1] of Digit, b : Digit) : Array [0..n] of Digit c =0 : Digit // carry / Überlauf (h0 , `):= a[0] · b // Ziffernmultiplikation result[0]:= ` for i := 1 to n − 1 do // n − 1 Iterationen (h, `):= a[i ] · b // Ziffernmultiplikation (c , result[i ]):= c + h0 + ` // Ziffernaddition h0 := h 0 result[n ]:= c + h // Ziffernaddition, kein Überlauf ?! numberTimesDigit( result return result n − 1) = n Analyse: 1 + ( Multiplikationen, (n − 1) + 1 = n Additionen 19 Schulmultiplikation // Langzahl p =0 : N for j := 0 to n − 1 do // Langzahladdition, Langzahl mal Ziffer, Schieben: p := p + a · b[j ]·B j 2n−1 n 0 b a 0 aB 2 aB aBn−1 n−1 p n 20 Schulmultiplikation Beispiel // Langzahl p =0 : N for j := 0 to n − 1 do // Langzahladdition, Langzahl mal Ziffer, Schieben: p := p + a · b[j ]·B j 32*64 1 1 9 2 2 8 a aB 2 0 4 8 b 4 6 p 21 Schulmultiplikation Analyse p =0 : N for j := 0 to n − 1 do p := p + a · b [j ] ·B j // n + j Ziffern (außer bei j = 0) // n + 1 Ziffernadditionen (optimiert) // je n Additionen/Multiplikationen // schieben (keine Ziffernarithmetik) Insgesamt: n2 Multiplikationen n2 + (n − 1)(n + 1) = 2n2 − 1 Additionen 2 2 3n − 1 ≤ 3n Ziernoperationen 22 Exkurs O-Kalkül, die Erste O(f (n)) = {g (n) : ∃c > 0 : ∃n0 ∈ N+ : ∀n ≥ n0 : g (n) ≤ c · f (n)} Idee: Konstante Faktoren (und Anfangsstück) ausblenden + Operationen zählen + Rechnungen vereinfachen + Interpretation vereinfachen ? Laufzeit welche Ops.? Werfen wir zuviel Information weg Beispiel: Schulmultiplikation braucht Zeit ? O n2 23 Ergebnisüberprüfung später an Beispielen 24 Ein rekursiver Algorithmus Function recMult(a, b) assert a und b haben n Ziern, sei k = dn/2e if n = 1 then return a · b Schreibe Schreibe return a als a1 · B k + a0 b als b1 · B k + b0 a b B 2k + (recMult(a0 , b1 )+recMult(a1 , b0 )) · B k + recMult(a0 , b0 ) recMult( 1 , 1 ) · 25 Beispiel 10 01 · 19 84 = 10 · 19 · 10000+ (10 · 84 + 1 · 19) · 100+ 1 · 84 = 1985984 26 Analyse Function recMult(a, b) assert a und b haben n Ziern, sei k = dn/2e if n = 1 then return a · b Schreibe Schreibe return a als b als a1 · B k + a0 b · Bk + b 1 0 // T (n) Ops // 1 Op // 0 Ops // 0 Ops a b B 2k + // T (n/2) + 2n Ops (recMult(a0 , b1 )+recMult(a1 , b0 ))B k + // 2T (n/2) + 2n Ops recMult(a0 , b0 ) // T (n/2) + 2n Ops recMult( 1 , 1 ) · Also T (n) ≤ 4T (n/2) + 6n Übung: Wo kann man hier ≈ 2n Ops sparen? 27 Analyse ( T (n) ≤ −→ 1 4· if T (dn/2e) + 6 · n if n = 1, n ≥ 2. (Master-Theorem, stay tuned) log2 4 T (n) ∈ Θ n ⊆O n2 Aufgabe: Zeigen Sie durch vollständige Induktion, dass T (n ) ≤ 7 n 2 − 6 n , falls n eine Zweierpotenz ist 28 Exkurs: Algorithmen-Entwurfsmuster Im Buch: siehe auch Index! Schleife: z. B. Addition Unterprogramm: z. B. Ziernmultiplikation, Addition Teile und Herrsche: (lat. divide et impera, engl. divide and conquer) Aufteilen in eins oder mehrere, kleinere Teilprobleme, oft rekursiv Es kommen noch mehr: greedy, dynamische Programmierung, Metaheuristiken, Randomisierung,. . . 29 Karatsuba-Ofman Multiplikation[1962] Beobachtung: (a1 + a0 )(b1 + b0 ) = a1 b1 + a0 b0 + a1 b0 + a0 b1 Function recMult(a, b) assert a und b haben n = 2k if n = 1 then return a · b Ziern, n ist Zweierpotenz a als a1 · B k + a0 k Schreibe b als b1 · B + b0 c11 := recMult(a1 , b1 ) c00 := recMult(a0 , b0 ) Schreibe return c11 · B 2k + (recMult((a1 + a0 ), (b1 + b0 )) − c11 − c00 )B k +c00 30 Beispiel 10 01 · 19 84 = 10 · 19 · 10000+ ((10 + 1) · (19 + 84) − 10 · 19 − 1 · 84) · 100+ 1 · 84 = 1985984 31 Analyse ( T (n) ≤ −→ 1 3· if T (dn/2e) + 10 · n if n = 1, n ≥ 2. (Master-Theorem) T (n) = Θ n log2 3 ≈Θ n1.58 32