Algorithmen und Datenstrukturen (für ET/IT) Wintersemester 2012/13 Dr. Tobias Lasser Computer Aided Medical Procedures Technische Universität München Organisatorisches • Probe-Klausur: Montag, 4. Februar 2013 • nicht bewertet! • 6. Februar: Vorlesung Kapitel 11 Datenkompression • 7. Februar: Vorlesung Kapitel 12 Kryptographie • 8. Februar: letzte Tutorfragestunde • 21. Februar: Klausur 2 Probeklausur • Wann? während Zentralübung am Montag, 4. Februar 2013 • Wo? Hörsaal 1200 • Wie? • 9:45 - 10:30: Bearbeitungszeit Probeklausur • 10:30 - 11:15: Besprechung der Probeklausur • Erlaubtes Material: • nur 1 DIN A4 Blatt, handbeschrieben • keine Bücher, Skripten, Ausdrucke, Smartphones, etc. • Wozu? • Simulation der tatsächlichen Prüfungssituation am 21. Februar 2013 • Vertrautmachen mit der Art von Prüfungsaufgaben 3 Übersicht Inhalte 1 Einführung 2 Mathematische Grundlagen 3 Elementare Datenstrukturen 4 Grundlagen der Korrektheit von Algorithmen 5 Grundlagen der Effizienz von Algorithmen 6 Grundlagen des Algorithmen-Entwurfs 7 Fortgeschrittene Datenstrukturen 8 Such-Algorithmen 9 Graph-Algorithmen 10 Numerische Algorithmen 4 Übersicht Inhalte Nicht Klausur-relevant: 11 Datenkompression 12 Kryptographie 5 Kapitel 1: Einführung • Was ist ein Algorithmus? • Was ist eine Datenstruktur? • Wo kommen sie vor? • Beschreibung von Algorithmen und Churchsche These • 4 Bausteine von Algorithmen 6 Kapitel 2: Mathematische Grundlagen 2.1 Mengen • Definition, Teilmengen, Kardinalität, Operationen • Potenzmenge, Kartesisches Produkt 2.2 Abbildungen • Definition und Eigenschaften, Folgen, Polynome 2.3 Zahldarstellung • Dezimal-, Binär-, Hexadezimalsystem • Primitive Datentypen, 2-Komplement Darstellung • Fixed point und Floating point Darstellung 2.4 Boolesche Logik • Logische Werte, Verknüpfungen, Wahrheitstabellen • Kombination von Verknüpfungen, Rangfolge und Rechenregeln 7 Kapitel 3: Elementare Datenstrukturen 3.1 Zeichenfolgen • ASCII Code, Unicode, Zeichen und Strings 3.2 Felder • Feld als sequentielle Liste mit Operationen • Feld als (doppelt) verkettete Liste mit Operationen 3.3 Stack • Abstrakte Datentypen, abstrakte Variable • Stack mit Operationen und Implementationen (sequentielle / verkettete Liste) 3.4 Queue • Queue mit Operationen und Implementationen (verkettete Liste, (zirkuläre) sequentielle Liste) 8 Kapitel 4: Grundlagen der Korrektheit von Algorithmen 4.1 Motivation und Spezifikation • Relative Korrektheit, Nachweis durch Verifikation, Validation 4.2 Verifikation • Vor- und Nachbedingungen, partielle und totale Korrektheit • Korrektheitsbeweis für 4 Bausteine 4.3 Beispiel: Insertion Sort • Algorithmus und Verifikation 4.4 Validation • Systematische Tests: Blackbox-, Whitebox-, Regression-, Integrations-Test • Fehlerquellen, fehlertolerantes und fehlerpräventives Programmieren 9 Kapitel 5: Grundlagen der Effizienz von Algorithmen 5.1 Motivation • Komplexität Insertion Sort, Wachstumsraten 5.2 RAM-Modell • Rechnermodell zur Laufzeitanalyse 5.3 Landau-Symbole • Landau-Symbole O und Θ, Konstanten und Rechenregeln • Kategorisierung der Effizienz von Algorithmen • Komplexität der 4 Bausteine 10 Kapitel 6: Grundlagen des Algorithmen-Entwurfs 6.1 Entwurfsprinzipien • Prinzip Verfeinerung, Prinzip Algorithmen-Muster 6.2 Divide and Conquer • Muster Divide and Conquer, MergeSort, QuickSort • Ausblick auf später: Binäre Suche, Strassen, FFT 6.3 Greedy-Algorithmen • Muster Greedy, Wechselgeld, minimaler Spannbaum • Ausblick auf später: Dijkstra, Prim (Huffman Code - nicht Klausur-relevant) 6.4 Backtracking • Muster Backtracking, Labyrinth, Traveling Salesman, Acht-Damen-Problem 6.5 Dynamisches Programmieren • Muster dynamisches Programmieren, Fibonacci-Zahlen 11 Ende Teil 1 Ende Teil 1, nun Teil 2 12 Kapitel 7: Fortgeschrittene Datenstrukturen 7.1 Graphen 7.2 Bäume 7.3 Heaps 7.4 Priority Queues 13 Kapitel 7.1: Graphen Definition: Ungerichteter Graph • Ungerichteter Graph: Definition: Ungerichteter Graph Ein ungerichteter Graph ist ein Paar G = (V , E ) mit • V endliche Menge der Knoten • E ✓ {u, v } : u, v 2 V Menge der Kanten Definition: Gerichteter Graph • Gerichteter Graph: • auf Englisch: Beispiel: Definition: Gerichteter • Knoten = vertices Graph 4 • Kanten = edges Ein gerichteter Graph ist ein Paar G = (V , E ) mit • es ist {u, v } = {v , u}, d.h. Richtung der • V endliche Menge der Knoten Kante spielt keine Rolle • E ✓ V ⇥ V Menge der Kanten 2 3 1 5 Definition: Gewichteter Graph • Gewichteter Graph: • E ✓ (u, v ) : u, v 2 V =V ⇥V Beispiel: Graph •Definition: es ist (u, vGewichteter ) 6= (v , u), d.h. Richtung der 4 spielt eine Rolle EinKante gewichteter Graph ist ein Graph G = (V , E ) mit einer w :möglich, E ! R. d.h. Kanten der 2 •Gewichtsfunktion hier sind Schleifen Form (u, u) für u 2 V Beispiel: • der Graph G kann gerichtet oder ungerichtet 1 5 3 5 14 Kapitel 7.1: Graphen • Eigenschaften von Graphen: • adjazente Knoten • gerichteter Graph: Eingangs- und Ausgangsgrad • ungerichteter Graph: Grad • Pfad zwischen Knoten • Zyklus in gerichteten und ungerichteten Graphen • (starker) Zusammenhang und (starke) Zusammenhangskomponenten • Darstellung von Graphen: • Adjazenzmatrizen, Speicherkomplexität: O(|V |2 ) • Adjazenzlisten, Speicherkomplexität: O(|V | + |E |) • Komplexitäten der Operationen • Kanten-Operationen einfach mit Adjazenzmatrix: O(1) • Knoten einfügen einfach mit Adjazenzliste: O(1) • Knoten löschen immer aufwendig: O(|V |2 ) bzw. O(|V | + |E |) 15 Kapitel 7.2: Bäume Definition Wald/Baum • Bäume und Wälder: Definition: Wald und Baum • Ein azyklischer ungerichteter Graph heißt auch Wald. • Ein zusammenhängender, azyklischer ungerichteter Graph heißt auch Baum. • falls Kante entfernt: nicht mehr zusammenhängend • falls Kante hinzugefügt: nicht mehr azyklisch • |E | = |V | − 1 • Eigenschaften: • Wurzelknoten, Vaterknoten, innere Knoten, Blätter Wurzel w Vater innerer Knoten 28 x Kind v Blätter 16 Kapitel 7.2: Bäume • Eigenschaften: • Tiefe, Ebene, Höhe w Ebene 0 Ebene 1 Höhe = 3 Ebene 2 Ebene 3 • Spezialfälle: • geordnete Bäume (→ Suchbäume) • n-äre Bäume • Binärbäume • Darstellung von Bäumen: • mit (doppelt) verketteten Listen • Binärbäume mit (doppelt) verketteten Listen (Kind links/rechts) bzw. als sequentielle Liste 17 Kapitel 7.2: Bäume • Traversierung von Binärbäumen: • Tiefensuche/DFS: Pre-order (wlr), In-order (lwr), Post-order (lrw) Implementierung z.B. mit Stack • Breitensuche/BFS Implementierung z.B. mit Queue 18 Kapitel 7.3: Heaps Definition Heap • Heap: Definition Heap Sei G = (V , E ) ein Binärbaum mit Wurzel w 2 V . Jeder Knoten v 2 V sei mit einem Wert key (v ) verknüpft, die Werte seien durch , geordnet. G heißt Heap, falls er folgende zwei Eigenschaften erfüllt: • G ist fast vollständig, d.h. alle Ebenen sind vollständig gefüllt, ausser auf der untersten Ebene, die von links her nur bis zu einem bestimmten Punkt gefüllt sein muss. • G erfüllt die Min-Heap-Eigenschaft bzw. die Max-Heap-Eigenschaft, d.h. für alle Knoten v 2 V , v 6= w gilt • Min-Heap: key (v .vater ) key (v ) • Max-Heap: key (v .vater ) key (v ) Entsprechend der Heap-Eigenschaft heißt G Min-Heap bzw. Max-Heap. 20 19 Kapitel 7.3: Heaps • Operationen: • minHeapify: O(log n) • buildMinHeap: O(n) • extractMin: O(log n) 1 11 3 5 2 9 8 3 11 5 2 9 extractMin minHeapify 2 2 3 5 11 9 8 8 minHeapify 3 5 8 9 11 minHeapify • HeapSort: • buildMinHeap und extractMin bis leer • in-place, O(n log n), besser als QuickSort im worst case 20 Kapitel 7.4: Priority Queues • Priority Queue: Definition Priority Queue Definition Priority Queue Eine Priority Queue ist ein abstrakter Datentyp. Sie beschreibt einen Queue-artigen Datentyp für eine Menge von Elementen mit zugeordnetem Schlüssel und unterstützt die Operationen • Einfügen von Elemente mit Schlüssel in die Queue, • Entfernen von Element mit minimalem Schlüssel aus der Queue, • Ansehen des Elementes mit minimalem Schlüssel in der Queue. • Operationen auf Priority1 Queue 0 2 7 als 3Heap: • extractMin und insert, beides O(log n) • decreaseKey: O(log n) 5 • entsprechend gibt es auch eine Priority Queue mit • auch implementierbar mitvon(un)sortierten Feldern Entfernen/Ansehen Elememt mit maximalem Schlüssel 11 21 Kapitel 8: Such-Algorithmen 8.1 Lineare Suche 8.2 Binäre Suche 8.3 Binäre Suchbäume 8.4 Balancierte Suchbäume 8.5 Suchen in Zeichenketten 22 Kapitel 8.1 und 8.2: Lineare und binäre Suche • Lineare Suche: durchlaufe Array bis gesuchter Schlüssel gefunden: O(n) • Binäre Suche: sortiere Array, dann Divide and Conquer: O(log n) 1 2 3 4 5 6 7 8 9 10 1 3 4 6 8 12 14 15 17 20 low 1 middle 3 4 6 8 high 12 14 low 1 3 4 6 8 15 17 middle 12 14 low high 15 20 high 17 20 23 Kapitel 8.3: Binäre Suchbäume Binärer Suchbaum • Binärer Suchbaum: Definition binärer Suchbaum Sei G = (V , E ) ein Binärbaum mit Wurzel w 2 V . Jeder Knoten v 2 V sei mit einem Wert key (v ) verknüpft, die Werte seien durch , geordnet. G heißt binärer Suchbaum, falls für alle inneren Knoten v 2 V gilt • für alle Knoten x im linken Teilbaum v .left gilt key (x) key (v ) • für alle Knoten y im rechten Teilbaum v .right gilt key (y ) key (v ) 5 32 2 1 8 3 9 24 Kapitel 8.3: Binäre Suchbäume • Operationen auf binären Suchbäumen mit Höhe h: • Suchen, Minimum, Maximum: O(h) • Einfügen, Löschen: O(h) • Effizienz direkt abhängig von Höhe • best case: O(log n) • worst case: O(n) 1 2 5 3 2 1 5 8 3 7 9 7 8 ausgeglichen entartet 9 • Ausweg: balancierte Suchbäume 25 Kapitel 8.4: Balancierte Suchbäume • Problem: binären Suchbaum balanciert zu halten ist aufwendig: O(n) • Ausweg: Abschwächung der Kriterien •Definition balanciert:AVL-Baum AVL-Bäume • Binärbaum: B-Bäume, Rot-Schwarz-Bäume • AVL-Bäume: Definition AVL-Baum Ein binärer Suchbaum G = (V , E ) mit Wurzel w 2 V heißt AVL-Baum, falls er die AVL-Bedingung erfüllt: • für jeden inneren Knoten v 2 V gilt: Höhe von linkem und rechtem Teilbaum von v unterscheidet sich maximal um 1. • benannt nachEinfügen, G.M. Adelson-Velskii Landis und • Anpassung von Löschen und mitE.M. Rotation (russische Mathematiker) Doppelrotation • AVL-Bedingung nur für Wurzel w ist nicht ausreichend • beide Teilbäume der Wurzel können entartet sein 26 Kapitel 8.5: Suchen in Zeichenketten • Problem: suche Muster (Länge m) in Text (Länge n) • Brute-Force Algorithmus: teste an jeder Textstelle O(nm) • Knuth-Morris-Pratt Algorithmus: O(n + m) Suche • Präfix-Tabelle: Zahl der vorangehenden Zeichen, die Präfix von Muster bilden Annahme: Wir scheitern beim Vergleichen des Wortes mit dem Annahme: Wir beim Vergleichen des Wortes mit dem • scheitern modifizierter Brute-Force-Algorithmus: Satz... Suche Satz... I ...an einer Stelle, wo die Präfixtabelle 0 ist: inPräfixtabelle Präfix-Tabelle: ohne zurückspringen I ...an einer Stelle,•wo0die nicht 0 ist: direkt weitersuchen I Es gab kein Präfix, also müssen wir nicht zurück (wie bei I Wir wissen von Präfix, mitten im Wort fort, Brute-Force) und können direkt weitermachen, also hier i = 4, • dem nicht 0 und in fahren Präfix-Tabelle: mitten in Muster weitersuchen hier i = 2, j = 2 und dann Test ob w [j] = s[i + j]... j = 0 und dann Test ob w [j] = s[i + j]... 0 1 2 3 4 5 6 7 8 9 a a b b a a a b b b a c a b c b a b b c ... 0 1 2 3 4 5 6 7 8 9 a a b b c c b b a c a b c b c b b c b c ... 12 12/26 27 Kapitel 9: Graph-Algorithmen 9.1 Tiefensuche 9.2 Breitensuche 9.3 Kürzeste Pfade 9.4 Minimale Spannbäume 28 F B B F Kapitel 9.1: Tiefensuche4/5 4/5 3/6 x y z 3/6 x v 1/8 F z u 1/8 B v 1/8 F 3/6 x 4/5 u 9/_ C B 4/5 F w 2/7 y u 9/_ F 3/6 y z x y z v w u v w 10/ _ z v 1/8 C 4/5 3/6 x w 2/7 B B 4/5 y • Tiefensuche / DFS: O(|V | + |E |) u x F C B 4/5 x w 2/7 3/6 y z 9/ • 2/7 9/_ 1/8 oder 2/7 Implementation rekursiv mit Stack 12 C C • Anwendungen: B F • berechnet Spannwald von Graph, markiert Rückkanten, 10/ 10/ 3/6 4/5 Cross-Kanten 3/6 Vorwärtskanten und 11 11 y z x • Test aus BZusammenhang y z B • Test auf Zyklenfreiheit • Segmentierung von binären Bildern mit Nachbarschafts-Graph 29 Kapitel 9.2: Breitensuche r s ∞ t 0 u ∞ r ∞ Q: ∞ ∞ ∞ • Breitensuche / BFS:v O(|Vw | + |Ex|) r s 1 t 0 ∞ ∞ v u 1 2 1 w r s 1 ∞ Q: ∞ 0 s y 2 s 1 r t 0 x 2 ∞ 1 v w x y v w r s t u r s 1 0 2 3 1 • Implementation mit Queue Q: x v u • Anwendungen: 2 1 2 ∞ 2 • Besuch von Knoten in Zusammenhangskomponente v w x y v • Berechnung Länge der kürzesten Pfade (d.h. Anzahl von Kanten) • Segmentierung von binären Bildern mit Nachbarschafts-Graph 0 1 w 30 w (p) = Kapitel 9.3: Kürzeste Pfade k 1 X w (vi , vi+1 ) i=1 • das Pfad Gewichtindes kürzesten PfadesGraph: zwischenPfad zwei Knoten u • Kürzester gewichtetem mit minimaler (u, v 2 V ) ist Summeund derv Gewichte l: Ablauf Dijkstra-Algorithmus 1 ( u 1 ∞ v wmin (u, v ) = ∞ 10 10 2 3 0 5 6 s 2 3 5 6 0 • Dijkstra Algoritmus: Greedy-Algorithmus, O(|E | log |V |) 7 7 5 • Voraussetzung: Kanten haben positives Gewicht 5 ∞ ∞ 2 5 32 ∞ 2 y x y aus Menge aktueller • erweitere Pfad um kürzeste Kante heraus x (s,0) min{w (p) : p Pfad von u nach v } Pfad existiert u v 1 1 sonst 10 ∞ Knoten (u, ∞) (v, ∞) (x, ∞) (y, ∞) Q: (x, 5) (u, 10) (v, ∞) (y, ∞) • entscheidendes Hilfsmittel: Priority Queue u 1 8 v u ∞ 10 5 6 s 5 x (u, 8) (v, ∞) 2 3 0 7 5 (y, 7) v 13 10 2 3 0 1 8 5 2 7 5 y x Q: (u, 8) (v, 13) 5 6 7 2 7 y 31 Kapitel 9.4: Minimale Spannbäume • Spannbaum: Teilgraph, der Baum ist und alle Knoten enthält • minimaler Spannbaum: Spannbaum mit minimalem Gewicht • Prim Algorithmus: Greedy-Algorithmus, O(|E | log |V |) • erweitere aktuelle Lösung um Kante mit minimalen Gewicht heraus aus Menge aktueller Knoten • entscheidendes Hilfsmittel: Priority Beispiel-Ablauf: PrimQueue Algorithmus 4 1 2 3 6 5 3 2 6 4 3 6 6 1 2 3 4 1 5 2 4 1 5 2 3 2 1 3 2 6 1 32 4 Kapitel 10: Numerische Algorithmen 10.1 Matrizen 10.2 Lineare Gleichungen 10.3 Least squares Probleme 10.4 Fast Fourier Transform 33 Kapitel 10.1: Matrizen Strassen-Algorithmus • Berechne: q1 = (a11 + a22 ) · (b11 + b22 ) • Matrix als Element von Vektorraum, lineare Abbildung, q2 = (a21 + a22 ) · b11 Anordnung von Zahlen q3 = a11 · (b12 b22 ) • Matrix-Operationen: q4 Addition, = a22 · (b21 Skalar-Multiplikation, b11 ) Matrix-Multiplikation q5 = (a11 + a12 ) · b22 q6 = (a21 a11 ) · (b11 + b12 ) • Matrix-Multiplikation: 3 • regulär: O(n ) q7 = (a12 a22 ) · (b21 + b22 ) • Strassen (Divide and Conquer): O(n2.807 ) • Dann ist: A·B = ✓ q1 + q4 q5 + q7 q3 + q5 q2 + q4 q1 + q3 q 2 + q 6 ◆ • Komplexität: ⇥(nlg 7 ) = ⇥(n2.807 ) 41 34 Kapitel 10.2: Lineare Gleichungen • Lineare Gleichung: aT x = b • Lineares Gleichungssystem: Ax = b • Anzahl Lösungen: keine, eine oder unendlich viele • Lösen von linearen Systemen: • mit Inverser A−1 (numerisch nicht stabil) • mit Gauss-Elimination (numerisch nicht stabil) • mit Zerlegung und Vorwärts-/Rückwärts-Substitution (stabil mit geeigneter Zerlegung) • mit iterativen Verfahren 35 Kapitel 10.2: Lineare Gleichungen • Matrix-Zerlegungen: 3 • Cholesky-Zerlegung für symm. pos. def. Matrizen ( n3 FLOPs) 3 • LUP-Zerlegung für invertierbare Matrizen ( 2n3 FLOPs) 3 • QR-Zerlegung für invertierbare Matrizen ( 2n3 FLOPs) • SVD-Zerlegung für beliebige Matrizen (2mn2 + 2n3 FLOPs) • Berechnung der LUP-Zerlegung: • rekursive Berechnung von Gauss-Eliminations-Schritten (Faktorisierung mittels Schur-Komplement) • partielles Pivoting zur Vermeiden von Division durch 0 und besserer Stabilität 36 Kapitel 10.3: Least squares Probleme • minimiere Approximationsfehler ηj = F (xj ) − yj Least-squares Lösung P für Datenpunkte (xj , yj ) und Funktion F (x) = i ci fi (x) Least-squares Lösung Sei A 2 Rm⇥n , y 2 Rm mit m Minimierungs-Problems min kAc c yk n. Eine Lösung c 2 Rn des or min kAc c y k2 heißt Least-squares Lösung. • Normalengleichung: Anwendungs-Beispiele: • Tracking von Objekten mit Kameras T T = A yetc. A AcRobotern, • Kalibrierung von Kameras, • Iterative Rekonstruktion für Tomographie • Pseudoinverse: A+ = (AT A)−1 AT 31 37 Kapitel 10.4: Fast Fourier Transform • Polynome in Koeffizientendarstellung: A(x) = n−1 X aj x j j=0 • Operationen: • Auswertung: O(n) mit Horner-Schema • Addition: O(n) • Multiplikation: O(n2 ) • Faltung zweier Vektoren entspricht Polynom-Multiplikation 38 Kapitel 10.4: Fast Fourier Transform • Polynome in Stützstellendarstellung: (x0 , y0 ), (x1 , y1 ), . . . , (xn−1 , yn−1 ) • Operationen: • Addition: O(n) • Multiplikation: O(n) • Konversion zwischen Darstellungen: • Koeffizienten → Stützstellen: Auswertung mit FFT O(n log n) • Stützstellen → Koeffizienten: Interpolation mit IFFT O(n log n) 39 Kapitel 10.4: Fast Fourier Transform • Effiziente Faltung / Polynom-Multiplikation: Koeffizientendarstellung A, B Multiplikation Zeit: Θ(n2) Koeffizientendarstellung C = AB Auswertung Zeit: Θ(n log n) Stützstellendarstellung A, B Interpolation Zeit: Θ(n log n) Multiplikation Zeit: Θ(n) Stützstellendarstellung C = AB • Diskrete Fourier Transformation: Polynom-Auswertung an n-ten komplexen Einheitswurzeln, O(n2 ) • Fast Fourier Transformation: DFT mit Divide and Conquer und Halbierungslemma, O(n log n) • Implementierung z.B. entrekursiviert mit Butterfly-Schema 40 Kapitel 11: Datenkompression Nicht Klausur-relevant! 11.1 Einführung 11.2 Grundlagen der Informationstheorie 11.3 Huffman Codes 11.4 LZ77 und LZ78 (6. Februar) 11.5 JPEG (6. Februar) 41 Kapitel 12: Kryptographie Nicht Klausur-relevant! 12.1 Einführung (7. Februar) 12.2 Symmetrische Verschlüsselung (7. Februar) 12.3 RSA (7. Februar) 42