Datenstrukturen und Algorithmen VO 708.031 24.10.2013 [email protected] 1 Kapitel 2 Algorithmische Grundprinzipien 24.10.2013 [email protected] 2 2. Algorithmische Grundprinzipien • • • • • 1) IteraEve Algorithmen 2) Rekursive Algorithmen 3) Teile u. Herrsche (engl. Divide & Conquer) Prinzip 4) "Gierige" (engl. Greedy) Algorithmen 5) Dynamische Programmierung Entwurf&Analyse von Alg. (5. Semester) • 6) ProbabilisEsche Algorithmen (Masterstudium) 24.10.2013 [email protected] 3 1) IteraEve Algorithmen • Bisher wurden nur iteraEve Alg. analysiert (InserEonSort, MergeSort u. BubbleSort) • Abfolge von Anweisungen • Verschachtelung durch Schleifen • IntuiEves Prinzip, leicht zu formulieren, für komplexe Probleme aufwendig • Jeder iteraEve Alg. lässt sich als rekursiven Alg. implemenEeren (und umgekehrt). Entrekursivierung und Rekursivierung siehe [Algorithmen und Datenstrukturen G. Pomberger und H. Dobler, Pearson Studium] 24.10.2013 [email protected] 4 2) Rekursive Algorithmen • Rekursion = Selbstbezüglichkeit (Prinzip geht über die MathemaEk und Algorithmik hinaus, Musik, Malerei, Grafik u. in der Natur, siehe [Ein endloses Geflochtenes Band, Hofstadter 2006]) • DefiniEon: Eine Funk)on ru, sich selbst mit veränderten Parametern auf. Jeder rekursive Alg. muss eine Abbruchbedingung implemenEeren. • Vorteil: Viele (komplexe) Probleme können elegant mit rekursiven Alg. gelöst werden. Laufzeitanalyse einfacher. • Nachteil: höherer Speicheraufwand da die Rücksprungadressen u. die Argumente in einem Stapel gespeichert werden müssen. 24.10.2013 [email protected] 5 IteraEve Alg. u. Rekursionen • Viele Algorithmen können sowohl itera)v als auch rekursiv implemenEert werden • Beispiel: Fakultät f (n) = n!= n ⋅ (n − 1) ⋅ (n − 2) ⋅…⋅ 2 ⋅1 T(n) = O(n) S(n) = O(1) 24.10.2013 T(n) = O(n) S(n) = O(n) (entspricht Rekursionstiefe) [email protected] 6 IteraEve Alg. u. Rekursionen • Beispiel: Fibonacci‐Zahlen f n = f n−1 + f n−2 , n ≥ 3; f1 = f 2 = 1 ⇒ 1, 1, 2, 3, 5, 8, 13, 21, … T(n) = O(n) S(n) = O(1) T(n) = Θ(cn) (exponentiell!) S(n) = O(n) (entspricht Rekursionstiefe) Rekursive Varianten sind ok einfacher zu implemenEeren, besitzen aber ok den größeren Laufzeit‐ und Speicherbedarf! 24.10.2013 [email protected] 7 Weitere Bsp. zu Rekursionen • Alg. zur Kurvengläoung (Douglas‐Peucker Alg.) • Input: Konturline als Folge von <p1, p2, ..., pn> Punkten • Output: ApproximaEon als Folge von m Punkten (mit m<=n abhängig von einem Schwellwert ε) <p1, p2, ..., pm> • Formulierung: – Verbinde Anfangs‐ und Endpunkt durch ein Geradensegment – Ermiole jenen Punkt pi mit der größten Enternung zur Geraden – Ist die Distanz kleiner als der Schwellwert, dann verwerfe alle dazwischen liegenden Punkte (die Approx. ist ausreichend) – Ansonsten: Splate das Geradensegment am Punkt pi in zwei Teilfolgen und rufe den Alg. rekursiv auf. 24.10.2013 [email protected] 8 T(n) = 2T(n/2) + O(n) = O(n log n) aus InformaEk I VO der Uni. Münsert, Xiaoyi Jiang 24.10.2013 [email protected] 9 Es gibt einen Zusatzpunkt für eine ImplemenEerung der Douglas‐Peucker Methode. Abzugeben am 31.10.2013 • Punktmenge als Datenfile u. ein Matlab‐Template sind auf der D&A Webpage • Codeausdruck (nur der Alg. kein Plot oder sonsEge FunkEon) • Grafik mit dem Polygon vor und nach der Kläoung (wählen sie einen "guten" Schwellwert) 24.10.2013 [email protected] 10 Zusammenfassung: IteraEve Algorithmen vs. Rekursionen • Vorteile rekursiver gegenüber iteraEver Alg. – Rekursive Alg. sind ok natürlicher und einfacher zu finden als iteraEve, insbesondere bei rekursiven Aufgabenstellungen – Laufzeit und Korrektheit ok einfacher auszuwerten. (Rek. Zeitgl.) – Rekursive Alg. können in der Regel mit weniger Zeilen Code impl. werden ‐> wartungsfreundlicher • Nachteile rekursiver gegenüber iteraEver Alg. – geringere Effizienz und höherer Speicherbedarf (Stapel) • Fausregel: verwende Rekursionen wenn die Problemformulierung rekursive Elemente enthält. Vermeide Rekursionen wenn es offensichtliche iteraEve Lösungen gibt. 24.10.2013 [email protected] 11 3) Das Teile u. Herrsche Prinzip Divide & Conquer • Teile: das Problem in eine Anzahl von Teilproblemen auf • Herrsche: Löse die Teilprobleme durch rekursive Aufrufe. Im Trivialfall wird das Problem direkt gelöst. • Verbinde: die Teillösungen zu einer Gesamtlösung des Ausgangsproblems. • Voraussetzungen: – Problem ist teilbar – Lösung aus Teillösungen einfacher konstruierbar • Verwendet Rekursionen 24.10.2013 [email protected] 12 Ein Beispiel zum Teile u. Herrsche Prinzip • Suchen in vorsorEerten linearen Feldern: Input: Feld A[1..n] mit A[1] ≤ A[2] ≤ … ≤ A[n] Output: Index t für das gesuchte Element x (A[1] ≤ x ≤ A[n]) Falls x ∉ A, wird als Ergebnis ‐1 ausgegeben • Formulierung: – Hat das Feld nur ein Element, so vergleiche dieses und gib das Ergebnis zurück. – Besteht die Liste aus mehr als einem Element, so teile die Liste in der Mioe und vergleiche das größte Element der ersten Liste mit dem gesuchten Element. – Wiederhole diesen Vorgang mit jener Liste in der sich das Element befinden könnte. 24.10.2013 [email protected] 13 Ein Beispiel zum Teile u. Herrsche Prinzip • Suchen in vorsorEerten linearen Feldern: aus AuD VO der Techn. Uni. München, C. Eckert & Th. SEbor 24.10.2013 [email protected] 14 Ein Beispiel zum Teile u. Herrsche Prinzip (Binärsuche) Teile das Feld in zwei gleich große Hälken und vergleiche mit dem mioleren Element; falls ident → gefunden, sonst suche entweder in der linken (kleiner) oder rechten Hälke (größer) weiter 24.10.2013 [email protected] 15 Ein Beispiel zum Teile u. Herrsche Prinzip (Binärsuche) Teile das Feld in zwei gleich große Hälken und vergleiche mit dem mioleren 1. Einführung u. Grundlagen Element; falls ident → gefunden, sonst suche entweder in der linken (kleiner) oder rechten Hälke (größer) weiter 2. Algorithmische Grundprinzipien iteraEve Version 3. SorEerverfahren Aufruf: BINSUCH_ITERATIV(1,n,x) 4. Suchen in linearen Feldern 5. Suchen in Bäumen 24.10.2013 [email protected] 16 4) "Gierige" Algorithmen (Greedy Algorithms) • Wähle schrioweise jenen Folgezustand der den größten Gewinn bzw. das beste Ergebnis liefert. • Schnelle Impl., Gute Laufzeit, lösen viele Probleme aber nicht opEmal (lokales OpEmum) • Voraussetzungen: – Zustände lassen sich bewerten (Maß für den Gewinn) – Zustände lassen sich einfach überführen (durch AkEonen, z.B. ziehen von Zahlen) – KonEnuierliche Verbesserung einfach berechenbar 24.10.2013 [email protected] 17 Ein Beispiel zu "Gierige" Algorithmen 24.10.2013 [email protected] aus AuD VO der HS. RheinMain, Prof. Dr. Peter Barth 18 Ein Beispiel zu "Gierige" Algorithmen 24.10.2013 [email protected] aus AuD VO der HS. RheinMain, Prof. Dr. Peter Barth 19 Ein Beispiel zu "Gierige" Algorithmen • Pfad mit der größten Knotensumme in einem Binärbaum • Nach der (7) wählt der Alg. die (12) • ε‐greedy algorithms: – Wähle mit einer gewissen Wahrscheinlichkeit eine zufällige AkEon – Wähle das beste Ergebniss aus vielen Durchläufen 24.10.2013 [email protected] 20 Wikipedia Eintrag zu Greedy Algorithms, Stand Okt. 2013 5) Dynamische Programmierung • Richard Bellman (Bellman EquaEon), Regelungstechnik • Wie im Teile u. Herrsche Prinzip baut die Gesamtlösung auf Teillösungen eines Problems auf. • Allerdings: Lösungen zu Teilproblemen werden nicht rekursiv berechnet sondern iteraEve berechnet • im Gegensatz zu Teile u. Herrsche Alg. müssen die Teilprobleme nicht unabhängig voneinander sein • Voraussetzungen (wie bei "gierigen" Alg.): – Zustände lassen sich bewerten (Maß für den Gewinn) – Zustände lassen sich einfach überführen – KonEnuierliche Verbesserung einfach berechenbar 24.10.2013 [email protected] 21 Ein Beispiel zu Dynamischer Programmierung • Fibonacci Zahlen: • FunkEonsaufrufe der rekursiven Impl. f(6) f(5) + f(4) (f(4) + f(3)) + (f(3) + f(2)) .... 24.10.2013 f n = f n−1 + f n−2 , n ≥ 3; f1 = f 2 = 1 ⇒ 1, 1, 2, 3, 5, 8, 13, 21, … [email protected] 22 hop://en.wikibooks.org/wiki/Algorithms/Dynamic_Programming, Stand Okt. 2013 Ein Beispiel zu Dynamischer Programmierung • Wiederverwenden der Teilergebnisse (MemorizaEon) Algorithmus fib(n, A) if n = 1 return n else‐if A[n] != ‐1 return A[n] else A[n] = fib(n ‐ 1) + fib(n ‐ 2) return A[n] 24.10.2013 T(n) = Θ(cn) (exponentiell!) Θ(n) S(n) = O(n) [email protected] 23 hop://en.wikibooks.org/wiki/Algorithms/Dynamic_Programming, Stand Okt. 2013 Ein Beispiel zu Dynamischer Programmierung • Wiederverwenden der Teilergebnisse (MemorizaEon) T(n) = Θ(cn) (exponentiell!) Θ(n) S(n) = O(n) (Rek. Aufr. und A) Top-Down Alg. mit Rekursionen Buttom-Up Alg. ohne Rekursionen -> Dynamische Programmierung Tabelle wird sukzessive mit Teilergebnissen gefüllt. 24.10.2013 wie in der IteraEven ImplemenEerung [email protected] 24 Ein Beispiel zu Dynamischer Programmierung • Längster Pfad in einem Grid (Manhaoan Tourist Problem) Zahlen=# der Sehenswürdigkeiten 24.10.2013 nur Bewegungen nach Osten oder Süden sind erlaubt. [email protected] 25 Eric B. Laber Hua Zhou, North Carolina State Uni. Ein Beispiel zu Dynamischer Programmierung • Wiederverwenden der Teilergebnisse (MemorizaEon) 24.10.2013 [email protected] 26 Eric B. Laber Hua Zhou, North Carolina State Uni. Ein Beispiel zu Dynamischer Programmierung • Wiederverwenden der Teilergebnisse (MemorizaEon) =S0,1 + 2 =max( S1,0 + 3 , S0,1 + 0 ) 24.10.2013 [email protected] 27 Eric B. Laber Hua Zhou, North Carolina State Uni. Ein Beispiel zu Dynamischer Programmierung • Wiederverwenden der Teilergebnisse (MemorizaEon) 24.10.2013 [email protected] 28 Eric B. Laber Hua Zhou, North Carolina State Uni. Ein Beispiel zu Dynamischer Programmierung • Wiederverwenden der Teilergebnisse (MemorizaEon) 24.10.2013 [email protected] 29 Eric B. Laber Hua Zhou, North Carolina State Uni. 6) ProbabilisEsche Algorithmen • Hidden‐Markov‐Models, Monte‐Carlo Alg., ProbabilisEsche Inferenz, Reinforcement Learning und Policy Search Masterstudium • Machine Learning A • Machine Learning B • TheoreEsche InformaEk • Speech CommunicaEon 2 24.10.2013 [email protected] 30 Danke für Ihre Aufmerksamkeit! Bis zum nächsten Mal. (Donnerstag, 31. Okt. 2013, 11:15, i13) 24.10.2013 [email protected] 31