Datenstrukturen und Algorithmen VO 708.031 robert.legenstein@igi.tugraz.at 1
Kapitel 2 Algorithmische robert.legenstein@igi.tugraz.at 2
2. Algorithmische 1) Iterative Algorithmen 2) Rekursive Algorithmen 3) Teile u. Herrsche (engl. Divide & Conquer) Prinzip 4) Greedy ("Gierige") Algorithmen 5) Dynamisches Programmieren Entwurf&Analyse von Alg. (5. Semester) robert.legenstein@igi.tugraz.at 3
1) Iterative Algorithmen Bisher wurden nur iterative Alg. analysiert (z.b. InsertionSort) Abfolge von Anweisungen Verschachtelung durch Schleifen Intuitives Prinzip, leicht zu formulieren, für komplexe Probleme aufwendig Jeder iterative Alg. lässt sich als rekursiver Alg. implementieren (und umgekehrt). Entrekursivierung und Rekursivierung siehe [Algorithmen und Datenstrukturen G. Pomberger und H. Dobler, Pearson Studium] robert.legenstein@igi.tugraz.at 4
Koch-Flocke (source: Wikipedia) 2) Rekursive Algorithmen Rekursion = Selbstbezüglichkeit Definition: Eine Funktion ruft sich selbst mit veränderten Parametern auf. robert.legenstein@igi.tugraz.at 5
2) Rekursive Algorithmen Definition: Eine Funktion ruft sich selbst mit veränderten Parametern auf. Jeder rekursive Alg. muss eine Abbruchbedingung implementieren. Vorteil: Viele (komplexe) Probleme können elegant mit rekursiven Alg. gelöst werden. Laufzeitanalyse einfacher. robert.legenstein@igi.tugraz.at 6
Iterative Alg. u. Rekursionen Vergleich Iterativer Alg. vs. Rekursiver Alg. Beispiel: Fakultät f ( n) n! n ( n 1) ( n 2) 2 1 f ( n) n! f (1) 1 n f ( n 1) FACTORIAL_ITERATIVE(n) 1: f 1 2: FOR i 1 TO n 3: f f*i 4: RETURN f T(n) = O(n) S(n) = O(1) FACTORIAL_RECURSIVE (n) 1: IF n=1 THEN 2: RETURN 1 3: ELSE 4: RETURN (n* FACTORIAL_RECURSIVE (n-1)) T(n) = O(n) S(n) = O(n) (entspricht Rekursionstiefe) robert.legenstein@igi.tugraz.at 7
Iterative Alg. u. Rekursionen Beispiel: Fibonacci-Zahlen FIBONACCI(n) 1: fib 1 2: fib_prev 1 3: FOR i 3 TO n 4: fib_pprev fib_prev 5: fib_prev fib 6: fib fib_prev + fib_pprev 7: RETURN fib T(n) = O(n) S(n) = O(1) f n f n 1 fn 2, n 3; f1 f2 1 1, 1, 2, 3, 5, 8, 13, 21, FIB_R(n) 1: IF n 2 THEN 2: RETURN 1 3: ELSE 4: RETURN FIB_R(n-1)+FIB_R(n-2) T(n) = Θ(c n ) (exponentiell!) S(n) = O(n) (entspricht Rekursionstiefe) Rekursive Varianten sind oft einfacher zu implementieren, besitzen aber oft den größeren Laufzeit- und Speicherbedarf! robert.legenstein@igi.tugraz.at 8
Zusammenfassung: Iterative Algorithmen vs. Rekursionen Vorteile rekursiver gegenüber iterativer Alg. Rekursive Alg. sind oft natürlicher und einfacher zu finden als iterative, insbesondere bei rekursiven Aufgabenstellungen Laufzeit und Korrektheit oft einfacher auszuwerten. (Rek. Zeitgl.) Rekursive Alg. können in der Regel mit weniger Zeilen Code impl. werden -> wartungsfreundlicher Nachteile rekursiver gegenüber iterativer Alg. geringere Effizienz und höherer Speicherbedarf (Stapel) Fausregel: verwende Rekursionen wenn die Problemformulierung rekursive Elemente enthält. Vermeide Rekursionen wenn es offensichtliche iterative Lösungen gibt. robert.legenstein@igi.tugraz.at 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 robert.legenstein@igi.tugraz.at 12
Ein Beispiel zum Teile u. Herrsche Prinzip Suchen in vorsortierten linearen Feldern: Input: Feld A[1..n] mit A[1] A[2] A[n] Output: Index t für das gesuchte Element x 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 Mitte 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. robert.legenstein@igi.tugraz.at 13
Ein Beispiel zum Teile u. Herrsche Prinzip Suchen in vorsortierten linearen Feldern: aus AuD VO der Techn. Uni. München, C. Eckert & Th. Stibor robert.legenstein@igi.tugraz.at 14
Ein Beispiel zum Teile u. Herrsche Prinzip (Binärsuche) Teile das Feld in zwei gleich große Hälften und vergleiche mit dem mittleren Element; falls ident gefunden, sonst suche entweder in der linken (kleiner) oder rechten Hälfte (größer) weiter BINSEARCH(von,bis,x) 1: IF von bis THEN 2: m [ (von+bis)/2 ] 3: IF x=a[m] THEN 4: RETURN m 5: ELSE 6: IF x<a[m] THEN 7: RETURN BINSEARCH(von,m-1,x) 8: ELSE 9: RETURN BINSEARCH(m+1,bis,x) 10: ELSE RETURN -1 robert.legenstein@igi.tugraz.at 15
4) Greedy Algorithmen ( Gierige Algorithmen) Wähle schrittweise jenen Folgezustand der kurzfristig den größten Gewinn bzw. das beste Ergebnis liefert. Schnelle Impl., Gute Laufzeit, lösen viele Probleme, aber meist nicht optimal (lokales Optimum) Voraussetzungen: Zustände lassen sich bewerten (Maß für den Gewinn) Zustände lassen sich einfach überführen (durch Aktionen) Kontinuierliche Verbesserung einfach berechenbar robert.legenstein@igi.tugraz.at 16
Ein Beispiel zu Greedy Algorithmen robert.legenstein@igi.tugraz.at 17 aus AuD VO der HS. RheinMain, Prof. Dr. Peter Barth
Ein Beispiel zu Greedy Algorithmen robert.legenstein@igi.tugraz.at 18 aus AuD VO der HS. RheinMain, Prof. Dr. Peter Barth
5) Dynamische Programmierung Richard Bellman (1940er Jahre) Wie im Teile u. Herrsche Prinzip baut die Gesamtlösung auf Teillösungen eines Problems auf. im Gegensatz zu Teile u. Herrsche Alg. müssen die Teilprobleme nicht unabhängig voneinander sein Wiederverwenden der Teilergebnisse (Memorization) Voraussetzungen (wie bei "gierigen" Alg.): Zustände lassen sich bewerten (Maß für den Gewinn) Zustände lassen sich einfach überführen Kontinuierliche Verbesserung einfach berechenbar robert.legenstein@igi.tugraz.at 19
Ein Beispiel zu Dynamischer Programmierung Längster Pfad in einem Grid (Manhattan Tourist Problem) Zahlen=# der Sehenswürdigkeiten nur Bewegungen nach Osten oder Süden sind erlaubt. Eric B. Laber Hua Zhou, North Carolina State Uni. robert.legenstein@igi.tugraz.at 20
Ein Beispiel zu Dynamischer Programmierung Wiederverwenden der Teilergebnisse (Memorization) robert.legenstein@igi.tugraz.at Eric B. Laber Hua Zhou, North Carolina State 21 Uni.
Ein Beispiel zu Dynamischer Programmierung Wiederverwenden der Teilergebnisse (Memorization) =S 0,1 + 2 =max( S 1,0 + 3, S 0,1 + 0 ) robert.legenstein@igi.tugraz.at Eric B. Laber Hua Zhou, North Carolina State 22 Uni.
Ein Beispiel zu Dynamischer Programmierung Wiederverwenden der Teilergebnisse (Memorization) robert.legenstein@igi.tugraz.at Eric B. Laber Hua Zhou, North Carolina State 23 Uni.
Ein Beispiel zu Dynamischer Programmierung Wiederverwenden der Teilergebnisse (Memorization) robert.legenstein@igi.tugraz.at Eric B. Laber Hua Zhou, North Carolina State 24 Uni.