algorithmen und datenstrukturen kapitel 2: 0.2cm ... · wiederholung korrektheit von algorithmen...
Embed Size (px)
TRANSCRIPT

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
Algorithmen und DatenstrukturenKapitel 2:
Korrektheit von Algorithmen undLaufzeitanalyse rekursiver Algorithmen
(mittels Rekurrenzgleichungen)
Frank [email protected]
21. Oktober 2015
Frank Heitmann [email protected] 1/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
O-NotationSuchenSortieren
Algorithmenanalyse
Um Algorithmen zu bewerten beschaftigen wir uns insb. mitdem Zeit- und Platzbedarf eines Algorithmus.
Wir behandeln nachfolgend Zeit- und Platzkomplexitat. Eine(elementare) Anweisung zahlt dabei als eine Zeiteinheit. Einebenutzte (elemantare) Variable als eine Platzeinheit.
Zeit- und Platzbedarf wird abhangig von der Lange/der Kenngroßen der Eingabe gezahlt. Wir arbeiten hierfur mit Funktionenf : N→ N bzw. f : N→ R.
Frank Heitmann [email protected] 2/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
O-NotationSuchenSortieren
O-Notation - Definition
Definition (O-Notation (und Verwandte) - Die wichtigen)
O(g(n)) = f | ∃c ∈ R+∃n0 ∈ N ∀n ≥ n0 : |f (n)| ≤ c · |g(n)|Ω(g(n)) = f | ∃c ∈ R+∃n0 ∈ N ∀n ≥ n0 : |f (n)| ≥ c · |g(n)|Θ(g(n)) = f | ∃c1, c2 ∈ R+∃n0 ∈ N ∀n ≥ n0 :
c1 · |g(n)| ≤ |f (n)| ≤ c2 · |g(n)|
Definition (O-Notation (und Verwandte) - Die nicht ganz sowichtigen)
o(g(n)) = f | ∀c ∈ R+∃n0 ∈ N ∀n ≥ n0 : |f (n)| ≤ c · |g(n)|ω(g(n)) = f | ∀c ∈ R+∃n0 ∈ N ∀n ≥ n0 : |f (n)| ≥ c · |g(n)|
Bemerkung
f ist dabei stets eine Funktion von N nach R, also f : N→ R.
Frank Heitmann [email protected] 3/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
O-NotationSuchenSortieren
O-Notation - Variante
Satz
1 f (n) ∈ O(g(n))⇔ limn→∞f (n)g(n) <∞
2 f (n) ∈ Ω(g(n))⇔ limn→∞f (n)g(n) > 0
3 f (n) ∈ Θ(g(n))⇔ limn→∞f (n)g(n) = c ∈ R+
4 f (n) ∈ o(g(n))⇔ limn→∞f (n)g(n) = 0
5 f (n) ∈ ω(g(n))⇔ limn→∞f (n)g(n) =∞
Frank Heitmann [email protected] 4/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
O-NotationSuchenSortieren
Erganzung: Der Satz von L’Hospital
Satz von L’Hospital
Seien f , g differenzierbar und sei g ′(n) 6= 0 fur alle n. Gehen f (n) undg(n) beide gegen 0 oder beide gegen Unendlich, wenn n gegen Unendlichgeht, so gilt:
1 Wenn limn→∞
(f ′(n)g ′(n)
)existiert, dann existiert auch lim
n→∞
(f (n)g(n)
)und
2 limn→∞
(f (n)g(n)
)= lim
n→∞
(f ′(n)g ′(n)
)Hinweis
Fur unsere Funktion ist der Satz praktisch immer anwendbar. Siehe auchden kleinen Text auf der Webseite.
Literaturhinweis
Genauere Formulierung nachzulesen in Konigsberger, Konrad: Analysis 1.Springer, 6. Auflage, 2004.
Frank Heitmann [email protected] 5/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
O-NotationSuchenSortieren
Erganzung: Der Satz von L’Hospital
Beispiel
Als Beispiel wollen wirln(n) ∈ O( 3
√n)
unter Nutzung des Satzes von l’Hospital beweisen. Es folgt:
limn→∞
(ln(n)
3√
n
)
= limn→∞
(3n
23
n
)= lim
n→∞
(3
n13
)= lim
n→∞
(33√
n
)= 0.
(Mit 3√
n = n13 und den Ableitungen ln′(n) = 1
n und (n13 )′ = 1
3n−23 = 1
3n23
.)
Damit ist die Großenabschatzung (und sogar ln n ∈ o( 3√
n)) bewiesen.
Frank Heitmann [email protected] 6/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
O-NotationSuchenSortieren
Merkhilfe
Bemerkung
Eine kleine Merkhilfe (nicht mehr!)
f ∈ O(g) ≈ f ≤ g
f ∈ Ω(g) ≈ f ≥ g
f ∈ Θ(g) ≈ f = g
f ∈ o(g) ≈ f < g
f ∈ ω(g) ≈ f > g
Wir sagen, dass f asymptotisch kleiner gleich, großer gleich, gleich,kleiner bzw. großer ist als g, wenn f ∈ O(g), f ∈ Ω(g), f ∈Θ(g), f ∈ o(g) bzw. f ∈ ω(g) gilt.
Frank Heitmann [email protected] 7/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
O-NotationSuchenSortieren
Vorgehen
Vorgehen, wenn wir Laufzeit/Platzbedarf eines Algorithmusanalysieren:
1 Uberlegen bzgl. welcher Kenngroße der Eingabe wir messenwollen. Diese kann sich von der Große der Eingabeunterscheiden! (Beispiel: Anzahl Knoten eines Graphen).
2 Laufzeit/Speicherbedarf bzgl. dieser Kenngroße ausdrucken.
3 Nochmal uberlegen, ob dies die Aussage des Ergebnissesverfalscht (so wie bei der Fakultatsberechnung oben).
⇒ I.A. sollte sich die eigentliche Eingabegroße leicht durch dieKenngroße ausdrucken lassen und der Unterschied sollte nichtzu groß sein.
+ Beim Graphen mit n Knoten ist die Adjazenmatrix in O(n2).− Ist eine Zahl n die Eingabe, so ist die Eingabegroße in O(log n).
Eine Laufzeit von O(n) ware also exponentiell in der Eingabe!
Frank Heitmann [email protected] 8/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
O-NotationSuchenSortieren
Suchen
Definition (Das Suchproblem)
Eingabe: Eine Menge a1, a2, . . . , an von n Objekten und einObjekt p alle vom gleichen Typ.Gesucht: Gibt es ein ai mit ai = p?
Anmerkung
Es ist hier nicht genau spezifiziert, wie die Menge von Objektengegeben ist, d.h. in welcher Datenstruktur sie abgelegt sind. Ebensoist nicht angegeben, ob eine Ordnung auf den Objekten existiert.
Ein Suchalgorithmus kann dies (beides) ggf. ausnutzen!
Frank Heitmann [email protected] 9/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
O-NotationSuchenSortieren
Lineare Suche
Algorithmus 1 Lineare Suche
1: for i = 0 to n do2: if a[i ] == max mustermann then3: return true4: end if5: end for6: return false
Frank Heitmann [email protected] 10/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
O-NotationSuchenSortieren
Binare Suche
Algorithmus 2 Binare Suche
1: while first ≤ last ∧ idx < 0 do2: m = first + ((last − first)/2)3: if a[m] < p then4: first = m + 15: else if a[m] > p then6: last = m − 17: else8: idx = m9: end if
10: end while11: return idx
Frank Heitmann [email protected] 11/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
O-NotationSuchenSortieren
Zur Binaren Suche
Anmerkung
Die lineare Suche stellt sehr wenige/keine Anforderungen.Bei der binaren Suche:
mussen die Elemente bereits sortiert vorliegen,
es muss eine Ordnung (<, > etc.) existieren und
ein direkter Zugriff auf einzelne Elemente ist notig (d.h. dasElement a[m] muss direkt zugreifbar sein).
Frank Heitmann [email protected] 12/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
O-NotationSuchenSortieren
Sortieren
Definition (Das Sortierproblem)
Eingabe: Eine Sequenz < a1, a2, . . . , an > von n Zahlen.Gesucht: Eine Permutation < a′1, a
′2, . . . , a
′n > der Eingabesequenz
mit a′1 ≤ a′2 ≤ . . . ≤ a′n.
Anmerkung
Ob die Reihenfolge zweier Elemente ai , aj (i < j) mit ai = ajbeibehalten werden soll oder nicht, ist nicht gesagt. Bleibt sieerhalten, d.h. ist a′p = ai , a′q = aj und p < q, so nennt man dasVerfahren stabil.Ferner heißt ein Sortierverfahren in-place (oder in situ), wenn derzusatzlich benotigte Speicherbedarf unabhangig von der gegebenenSequenz ist.
Frank Heitmann [email protected] 13/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
O-NotationSuchenSortieren
Sortieren mit Maximumbestimmung (MaxSort)
Algorithmus 3 Sortieren mit Max
1: for i = n downto 1 do2: idx = max(A)3: B[i ] = A[idx ]4: A[idx ] = 05: end for6: return B
Algorithmus 4 Finde Maximum1: max = 12: for i = 2 to n do3: if a[i ] > a[max ] then4: max = i5: end if6: end for7: return max ;
Frank Heitmann [email protected] 14/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
O-NotationSuchenSortieren
Pause to ponder...
Geht das auch in-place ?
Frank Heitmann [email protected] 15/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
O-NotationSuchenSortieren
Min/MaxSort
Algorithmus 5 MaxSort(A[1 . . . n])
1: for i = n downto 2 do2: idx = max(A[1..i ])3: swap(A[i ],A[idx ])4: end for
Algorithmus 6 max(A[1 . . . n])
1: idxMax = 12: for i = 2 to n do3: if A[i ] > A[idxMax ] then4: idxMax = i5: end if6: end for7: return idxMax ;
Frank Heitmann [email protected] 16/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
O-NotationSuchenSortieren
InsertionSort
Algorithmus 7 InsertionSort(A[1 . . . n])
1: for j = 2 to n do2: key = A[j ]3: i = j − 14: while i > 0 und A[i ] > key do5: A[i + 1] = A[i ]6: i = i − 17: end while8: A[i + 1] = key9: end for
Frank Heitmann [email protected] 17/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
O-NotationSuchenSortieren
Analyse
Zur Laufzeit:
Lineare Suche in O(n)
Binare Suche in O(log n)
Maximumsbestimmung in O(n)
MaxSort in O(n2)
InsertionSort in O(n2)
Die Kenngroße n ist dabei stets die Anzahl der zu sortierendenElemente.
Frank Heitmann [email protected] 18/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
O-NotationSuchenSortieren
Eine kleine Warnung zum Schluss
Wichtige Anmerkung
Die O-Notation ’verschluckt’ Konstanten. Wenn die zu gross/kleinsind, dann kann dies das Ergebnis verfalschen! In dem Fall ist danneine genauere Analyse (ohne O-Notation) notig. I.A. hat sich dieO-Notation aber bewahrt, weil Extreme wie 106 · n und 10−10 · 2nin der Praxis kaum vorkommen.Kurz: O(2n) ist nicht zwingend immer schlimmer als O(n) aber auflange Sicht (d.h. bei wachsenden Eingabelangen) auf jeden Fallund im Allgemeinen (und bei allem, was einem so i.A. in der Praxisbegegnet) ist O(2n) eben doch schlimmer als O(n).
Frank Heitmann [email protected] 19/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
O-NotationSuchenSortieren
Vorgehen bei der Analyse und Ausblick
Bisher haben wir die Laufzeiten meist nur oberflachlichbegrundet/bewiesen. Dies werden wir in der Zukunft ausfuhrlichermachen! (Da die Algorithmen komplizierter werden.)
Zudem werden wir uns mehr auf die Korrektheit von Algorithmenkonzentrieren.
In der Zukunft daher oft:
1 Gegeben ein Problem, einen Algorithmus finden, der es lost.
2 Korrektheit des Algorithmus beweisen.
3 Laufzeit des Algorithmus ermitteln und die Behauptungbeweisen.
Frank Heitmann [email protected] 20/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
O-NotationSuchenSortieren
Beobachtungen und Fragen
Beobachtungen und Fragen bis hierher:
1 Korrektheit der Verfahren bzw. von Algorithmen allgemein?
2 Bisher nur auf Arrays gearbeitet. Geht da auch was anderes,d.h. mit anderen Datenstrukturen? (Einerseits, um esvielleicht schneller zu machen, andererseits, weil die Datenvielleicht nicht in einem Array sind!)
3 Konnen wir schneller sortieren als in O(n2)?
4 Wie kann man die Laufzeit rekursiver Algorithmenanalysieren?
Heute: 1. und 4.
Frank Heitmann [email protected] 21/56

WiederholungKorrektheit von Algorithmen
Rekursive AlgorithmenInsertionSort
Sortieren
Definition (Das Sortierproblem)
Eingabe: Eine Sequenz < a1, a2, . . . , an > von n Zahlen.Gesucht: Eine Permutation < a′1, a
′2, . . . , a
′n > der Eingabesequenz
mit a′1 ≤ a′2 ≤ . . . ≤ a′n.
Anmerkung
Ob die Reihenfolge zweier Elemente ai , aj (i < j) mit ai = ajbeibehalten werden soll oder nicht, ist nicht gesagt. Bleibt sieerhalten, d.h. ist a′p = ai , a′q = aj und p < q, so nennt man dasVerfahren stabil.Ferner heißt ein Sortierverfahren in-place (oder in situ), wenn derzusatzlich benotigte Speicherbedarf unabhangig von der gegebenenSequenz ist.
Frank Heitmann [email protected] 22/56

WiederholungKorrektheit von Algorithmen
Rekursive AlgorithmenInsertionSort
InsertionSort: Die Idee
Beim Sortieren durch Einfugen (InsertionSort) wird ahnlich wiebeim Spielkarten sortieren vorgegangen:
Starte mit der leeren linken Hand
Nimm ein Karte und fuge sie an der richtigen Position in derlinken Hand ein. Dazu
Vergleiche diese neue Karte von rechts nach links mit denKarten, die schon auf der linken Hand sind.Sobald eine kleinere Karte erreicht wird, fuge ein.
⇒ Zu jedem Zeitpunkt sind die Karten auf der linken Handsortiert.
⇒ Die Karten auf der linken Hand sind jeweils die oberstenKarten des Haufens.
Frank Heitmann [email protected] 23/56

WiederholungKorrektheit von Algorithmen
Rekursive AlgorithmenInsertionSort
InsertionSort: Der Algorithmus
Algorithmus 8 InsertionSort(A[1 . . . n])
1: for j = 2 to n do2: key = A[j ]3: i = j − 14: while i > 0 und A[i ] > key do5: A[i + 1] = A[i ]6: i = i − 17: end while8: A[i + 1] = key9: end for
Frank Heitmann [email protected] 24/56

WiederholungKorrektheit von Algorithmen
Rekursive AlgorithmenInsertionSort
InsertionSort: Korrektheit 1/4
Die Korrektheit zeigen wir mit folgender Schleifeninvarianten:
Zu Beginn jeder Iteration der for-Schleife besteht dasTeilfeld A[1..j − 1] aus den ursprunglich in A[1..j − 1]enthaltenden Elementen, alledings in geordneterReihenfolge.
Anmerkung
’Zu Beginn der Iteration’ heißt hier nach Zuweisung des neuenWertes an j und vor dem Test im Schleifenkopf.
Frank Heitmann [email protected] 25/56

WiederholungKorrektheit von Algorithmen
Rekursive AlgorithmenInsertionSort
InsertionSort: Korrektheit 2/4
Zu zeigen ist:
1 Initialisierung: Die Invariante ist vor der ersten Iteration wahr.
2 Fortsetzung: Wenn die Invariante vor der Iteration der Schleifewahr ist, so ist sie es auch vor der nachsten Iteration.
3 Terminierung: Die Schleife bricht irgendwann ab.
Wenn die Schleife abbricht, so sollte die Invariante eine nutzlicheEigenschaft liefern, die uns hilft, die Korrektheit des Algorithmuszu zeigen.
Frank Heitmann [email protected] 26/56

WiederholungKorrektheit von Algorithmen
Rekursive AlgorithmenInsertionSort
InsertionSort: Korrektheit 3/4
1 Initialisierung: Vor der ersten Iteration ist j = 2 und dasTeilfeld A[1..j − 1] = A[1] besteht aus nur einem Feld, dasauch ursprunglich dort war und das sortiert ist.
2 Fortsetzung: Zu zeigen ist, dass die Invariante bei jederIteration erhalten bleibt. Es wird die richtige Position fur A[j ]gesucht (darum sind nachfolgend in A[1..j ] nur jene Elemente,die dort auch vorher waren) und gefunden (daher sind sie nunsortiert). Letzteres ware mit einer weiterenSchleifeninvarianten fur die while-Schleife zu zeigen.
3 Terminierung: Die while-Schleife terminiert stets (warum?)und damit auch die for-Schleife (warum?)
Frank Heitmann [email protected] 27/56

WiederholungKorrektheit von Algorithmen
Rekursive AlgorithmenInsertionSort
InsertionSort: Korrektheit 4/4
Wenn die Schleife abbricht, gilt j = n + 1. Setzen wir diesen Wertfur j in die Invariante ein (die ja zu Beginn jeder Iteration wahrist!), so erhalten wir, dass A[1..n] aus den ursprunglichenElementen in sortierter Reihenfolge besteht. Damit ist das gesamteFeld sortiert und der Algorithmus korrekt!
Frank Heitmann [email protected] 28/56

WiederholungKorrektheit von Algorithmen
Rekursive AlgorithmenInsertionSort
InsertionSort: Laufzeit
Die Laufzeit ist in O(n2), da der der Rumpf der for-Schleife n − 1mal ausgefuhrt wird und im i-ten Durchgang der for-Schleife derRumpf der while-Schleife maximal i-mal ausgefuhrt wird. Damitwird der Rumpf der while-Schleife maximal1 + 2 + ...+ n − 1 = n(n−1)
2 -mal ausgefuhrt.
Hinweis
Eine detailliertere Analyse ist in Kapitel 2.2 im [Cormen] zu finden.
Frank Heitmann [email protected] 29/56

WiederholungKorrektheit von Algorithmen
Rekursive AlgorithmenInsertionSort
Zu Korrektheitsbeweisen
Zum Vorgehen bei Korrektheitsbeweisen:
Kein generelles Verfahren! Jeder Algorithmus muss “neu” alskorrekt bewiesen werden.
Schleifeninvarianten sind oft nutzlich - aber auch diese lassensich nicht automatisch bestimmen! Man muss also jedes Malneu uberlegen, was eine sinnvolle Schleifeninvariante seinkonnte und dann beweisen, dass diese gilt (um sie dannhoffentlich beim Korrektheitsbeweis sinnvoll nutzen zukonnen).
Ansonsten: Wie bei mathematischen Beweisen! Ein StuckText schreiben, dass euer Gegenuber von der Richtigkeit derAussage uberzeugt. Bei der Beweisfuhrung ist i.A. anirgendeiner Stelle ein kreativer Schritt notig (Erfahrung hilfthier und wir uben dies im Laufe der Vorlesung).
Frank Heitmann [email protected] 30/56

WiederholungKorrektheit von Algorithmen
Rekursive AlgorithmenInsertionSort
Zu Korrektheitsbeweisen
Eine letzte Anmerkung:
Oft wird die Idee zu einem Algorithmus als korrekt bewiesen.In der Implementierung konnten sich dann trotzdem Fehlereinschleichen. Diese musste also ebenfalls als korrektnachgewiesen werden. Hierzu gibt es hilfreiche Tools, das gehtaber uber diese Vorlesung hinaus.
Frank Heitmann [email protected] 31/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
EinfuhrungRekurrenzgleichungenZusammenfassung
Eine andere Art von Algorithmen
Algorithmus 9 fac(n)
1: if n == 0 then2: return 13: else4: return n · fac(n − 1)5: end if
Dies ist ein rekursiver Algorithmus... unsere bisherigen Technikensind hier bei der Analyse wenig hilfreich (vor allem beikomplizierteren rekursiven Algorithmen).
Frank Heitmann [email protected] 32/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
EinfuhrungRekurrenzgleichungenZusammenfassung
Fakultatsfunktion - Iterativ
Jeder rekursive Algorithmus lasst sich auch iterativ schreiben (undumgekehrt)...
Algorithmus 10 fac(n)
1: res = 12: for i = 1 to n do3: res = res · i4: end for5: return res
Anmerkung
Die Laufzeit ist in O(n). Aber Achtung! Dies ist exponentiell inder Große der Eingabe! Diese ist namlich nur in O(log n). DenWert einer Zahl als Kenngroße zu nehmen ist i.A. nicht sinnvoll.
Frank Heitmann [email protected] 33/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
EinfuhrungRekurrenzgleichungenZusammenfassung
Rekursive Algorithmen
Rekursive Algorithmen sind oft aufgrund der wiederholtenFunktionsaufrufe und der mit den rekursiven Aufrufeneinhergehenden Kontextspeicherung langsam.
Andererseits lohnt sich fur kompliziertere Probleme einrekursiver Ansatz oft, da dieser meist ubersichtlicher ist. Hierwerden iterative Ansatze oft ebenfalls langsam, da sie vielverwalten mussen (im schlimmsten Fall muss dieStackverwaltung des rekursiven Algorithmus selbstgeschrieben werden).
⇒ Wir wollen nachfolgend die Laufzeit rekursiver Algorithmenmittels Rekurrenz- oder auch Rekursionsgleichungenanalysieren...
Frank Heitmann [email protected] 34/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
EinfuhrungRekurrenzgleichungenZusammenfassung
Die Turme von Hanoi
Definition (Aufgabenstellung)
Seien drei Stangen A, B, C gegeben und n Scheiben, die der Großenach sortiert auf Stange A liegen. Die Aufgabe ist es, den ganzenTurm von Scheiben auf Stange C zu verschieben, dabei nur eineScheibe in einem Zeitschritt zu bewegen und nie eine großereScheibe auf eine kleinere zu legen.
Ein rekursiver Algorithmus
1 Verschiebe die n − 1 oberen Scheiben von A auf B.
2 Verschiebe die großte Scheibe von A auf C.
3 Verschiebe alle n − 1 Scheiben von B auf C.
Frank Heitmann [email protected] 35/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
EinfuhrungRekurrenzgleichungenZusammenfassung
Die Turme von Hanoi - Analyse
Sei T (n) die Anzahl der Verschiebungen, die obiger Algorithmusbraucht, um n Scheiben zu verschieben. Es gilt:
T (n) =
1 , falls n = 12T (n − 1) + 1 , falls n ≥ 2
Wie ermitteln wir eine geschlossene Form fur T (n)?
Frank Heitmann [email protected] 36/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
EinfuhrungRekurrenzgleichungenZusammenfassung
Die Turme von Hanoi - Analyse. Methode 1
Methode 1. Wir berechnen T (n) fur kleine Werte, Raten eineLosung und beweisen diese.
T (n) =
1 , falls n = 12T (n − 1) + 1 , falls n ≥ 2
n 1 2 3 4 5 6 7 8 9 10
T (n) 1 3 7 15 31 63 127 255 511 1023
Losung raten? ... T (n) = 2n − 1. Dies ist nun noch zu beweisen!
Frank Heitmann [email protected] 37/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
EinfuhrungRekurrenzgleichungenZusammenfassung
Die Turme von Hanoi - Analyse. Methode 1
Gegeben:
T (n) =
1 , falls n = 12T (n − 1) + 1 , falls n ≥ 2
Zu zeigen: T (n) = 2n − 1. - Machen wir mittels Induktion...
Induktionsanfang. Fur n = 1 gilt T (1) = 21 − 1 = 1.
Induktionsannahme. Wir nehmen an, dass fur ein n ≥ 1 dieBehauptung gilt, d.h. dass T (n) = 2n − 1 ist.
Induktionsschritt.T (n + 1) = 2T (n) + 1 = 2(2n − 1) + 1 = 2n+1 − 1.
Damit sind wir fertig. Fur alle n ≥ 1 gilt damit T (n) = 2n − 1.
Frank Heitmann [email protected] 38/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
EinfuhrungRekurrenzgleichungenZusammenfassung
Die Turme von Hanoi - Analyse. Methode 2
Methode 2. Rekursives Einsetzen (Substitutions- oderAbwicklungsmethode)
T (n) =
1 , falls n = 12T (n − 1) + 1 , falls n ≥ 2
T (n) = 2T (n − 1) + 1
= 2(2T (n − 2) + 1) + 1 = 4T (n − 2) + 2 + 1
= 4(2T (n − 3) + 1) + 2 + 1 = 8T (n − 3) + 4 + 2 + 1
= ...
= 2kT (n − k) + 2k−1 + 2k−2 + . . .+ 21 + 20 (∗)
(*) Diese Zeile ist mit vollstandiger Induktion zu zeigen (Ubung)!Frank Heitmann [email protected] 39/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
EinfuhrungRekurrenzgleichungenZusammenfassung
Die Turme von Hanoi - Analyse. Methode 2
Methode 2. Rekursives Einsetzen (Substitutions- oderAbwicklungsmethode)
T (n) =
1 , falls n = 12T (n − 1) + 1 , falls n ≥ 2
T (n) = 2kT (n − k) + 2k−1 + 2k−2 + . . .+ 21 + 20
Wann bricht die Rekursion ab? Bei k = n − 1
Frank Heitmann [email protected] 40/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
EinfuhrungRekurrenzgleichungenZusammenfassung
Die Turme von Hanoi - Analyse. Methode 2
Methode 2. Rekursives Einsetzen (Substitutions- oderAbwicklungsmethode)
T (n) =
1 , falls n = 12T (n − 1) + 1 , falls n ≥ 2
T (n) = 2kT (n − k) + 2k−1 + 2k−2 + . . .+ 21 + 20 (∗)= 2n−1T (n − (n − 1)) + 2n−2 + 2n−3 + . . .+ 21 + 20
=n−1∑i=0
2i =2n − 1
2− 1= 2n − 1 ∈ Θ(2n)
(*) Da bei T (1), also n − k = 1, die Rekursion abbricht, wird mitk = n − 1 weiter gerechnet.
Frank Heitmann [email protected] 41/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
EinfuhrungRekurrenzgleichungenZusammenfassung
Methode 2 - Vorgehen
Das Vorgehen bei der Substitutionsmethode:
1 Abwickeln, bis eine Formel abhangig von k erkennbar ist.
2 Diese Formel mittels Induktion beweisen.
3 Den Wert von k bestimmen, bei dem die Rekursion abbricht.
4 Einsetzen und zu einem Ergebnis kommen.
5 Eventuell mit diesem Ergebnis noch Abschatzungen machen,um zu Aussagen bzgl. der O-Notation zu kommen.
Frank Heitmann [email protected] 42/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
EinfuhrungRekurrenzgleichungenZusammenfassung
Eine andere Rekurrenzgleichung
Die Rekurrenzgleichung
T (n) =
c , falls n = 13T (n/3) + 1/n , falls n ≥ 2
Kann auch mit der Substitutionsmethode gelost werden.
Eine Alternative bietet das Mastertheorem.
Frank Heitmann [email protected] 43/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
EinfuhrungRekurrenzgleichungenZusammenfassung
Mastertheorem
Definition (Mastertheorem)
Das Mastertheorem gilt fur Rekurrenzen der Form:
T (n) =
c falls n = 1a · T (nb ) + f (n) falls n > 1
Hierbei sind a ≥ 1, b > 1 und c Konstanten, nb wird als bnbc oder
dnbe verstanden und T (n) uber N definiert. Es gilt:
1 T (n) ∈ Θ(nlogb(a)), falls f (n) ∈ O(nlogb(a)−ε) fur ein ε > 0.
2 T (n) ∈ Θ(nlogb(a) log2(n)), falls f (n) ∈ Θ(nlogb(a)).
3 T (n) ∈ Θ(f (n)), falls f (n) ∈ Ω(nlogb(a)+ε) fur ein ε > 0 unda · f (nb ) ≤ δ · f (n) fur ein δ < 1 und große n.
Frank Heitmann [email protected] 44/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
EinfuhrungRekurrenzgleichungenZusammenfassung
Mastertheorem - Beispiel
T (n) ∈ Θ(nlogb(a)), falls f (n) ∈ O(nlogb(a)−ε) fur ein ε > 0
T (n) =
c ′
3T (n/3) + 1/nT (n) =
ca · T (nb ) + f (n)
Wegen logb(a) = log3(3) = 1 und f (n) = 1n ist f (n) ∈ O(n1−ε) bei
Wahl von z.B. ε = 2 > 0.
Es liegt also Fall 1 vor und dies ergibt (wie auch beim Abwickeln)T (n) ∈ Θ(n).
Frank Heitmann [email protected] 45/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
EinfuhrungRekurrenzgleichungenZusammenfassung
Mastertheorem. Methode 3
Anmerkung
Das Mastertheorem ist die dritte Methode, die wir zur Losungvon Rekurrenzgleichungen nutzen werden.Das Mastertheorem ist ein machtiges Hilfsmittel. Es ist aber nichtimmer einsetzbar! Z.B. bei T (n) = 2 · T (n/2) + n · log n nicht.
Literaturhinweis
Das Mastertheorem selbst wollen wir hier nicht beweisen. Einen Be-weis findet man im [Cormen].
Frank Heitmann [email protected] 46/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
EinfuhrungRekurrenzgleichungenZusammenfassung
Zusammenfassung und Wiederholung
Ubliches Vorgehen in der Algorithmik:
1 Gegeben ein Problem, einen Algorithmus finden, der es lost.
2 Korrektheit des Algorithmus beweisen.
3 Laufzeit des Algorithmus ermitteln und beweisen.
Frank Heitmann [email protected] 47/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
EinfuhrungRekurrenzgleichungenZusammenfassung
Zusammenfassung und Wiederholung
Zu 1. Algorithmentechniken / Algorithmenentwurf. Bisher:
Lineare Methoden (z.B. Suche, Maximum/Minimum)
Binare Suche (’Halbieren’)
Suchraum komplett durcharbeiten (geht (fast) immer, aberteuer)
Frank Heitmann [email protected] 48/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
EinfuhrungRekurrenzgleichungenZusammenfassung
Zusammenfassung und Wiederholung
Zu 2. Vorgehen beim Korrektheitsbeweis:
Kein generelles Verfahren! Jeder Algorithmus muss “neu” alskorrekt bewiesen werden.
Schleifeninvarianten sind oft nutzlich.
Ansonsten: Vorgehen wie bei mathematischen Beweisen!Erfahrung hilft!
Frank Heitmann [email protected] 49/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
EinfuhrungRekurrenzgleichungenZusammenfassung
Zusammenfassung und Wiederholung
Zu 3. Laufzeitanalyse...
... mittels O-Notation.
Laufzeitanalyse einfacher sequentieller Algorithmen.
Laufzeitanalyse rekursiver Algorithmen (z.B. von Divide andConquer Verfahren) mittels dreier Methoden:
Raten und BeweisenAbwickelnMastertheorem
Frank Heitmann [email protected] 50/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
EinfuhrungRekurrenzgleichungenZusammenfassung
Zusammenfassung und Wiederholung
Wichtig bei der Laufzeitanalyse:
1 Uberlegen bzgl. welcher Kenngroße der Eingabe wir messenwollen. Diese kann sich von der Große der Eingabeunterscheiden! (Beispiel: Anzahl Knoten eines Graphen).
2 Laufzeit/Speicherbedarf bzgl. dieser Kenngroße ausdrucken.
3 Nochmal uberlegen, ob dies die Aussage des Ergebnissesverfalscht (so wie bei der Fakultatsberechnung oben).
⇒ I.A. sollte sich die eigentliche Eingabegroße leicht durch dieKenngroße ausdrucken lassen und der Unterschied sollte nichtzu groß sein.
+ Beim Graphen mit n Knoten ist die Adjazenmatrix in O(n2).− Ist eine Zahl n die Eingabe, so ist die Eingabegroße in O(log n).
Eine Laufzeit von O(n) ware also exponentiell in der Eingabe!
Frank Heitmann [email protected] 51/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
EinfuhrungRekurrenzgleichungenZusammenfassung
Ausblick
Nachstes Mal:
Divide and Conquer als klassische Algorithmentechnik (=Algorithmen-’Muster’) bzw. klassisches rekursives Verfahren
⇒ Großere Probleme werden in kleinere zerlegt, die dann seperat(und i.A. rekursiv) nach der gleichen Methode (!) gelostwerden. Die Teilergebnisse werden dann passend zur Losungdes Problems zusammengesetzt.Unter anderem MergeSort als BeispielRekurrenzgleichungen sind hier wichtig
Mehr zum MastertheoremNutzliches Hilfsmittel: Variablentransformation
Frank Heitmann [email protected] 52/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
EinfuhrungRekurrenzgleichungenZusammenfassung
Anhang
Anhang
Frank Heitmann [email protected] 53/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
EinfuhrungRekurrenzgleichungenZusammenfassung
Ein weitere Beispiel
T (n) =
c , falls n = 13T (n/3) + 1/n , falls n ≥ 2
T (n) = 3 · T (n
3) +
1
n
= 3 ·(
3 · T (n
32) +
3
n
)+
1
n
= 32 · T (n
32) +
32
n+
30
n
= 32 ·(
3 · T (n
33) +
32
n
)+
32
n+
30
n
= 33 · T (n
33) +
34
n+
32
n+
30
n= . . .
Frank Heitmann [email protected] 54/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
EinfuhrungRekurrenzgleichungenZusammenfassung
Ein weitere Beispiel
T (n) = 33 · T (n
33) +
34
n+
32
n+
30
n= . . .
= 3k · T (n
3k) +
1
n
k−1∑i=0
32i (∗)
= c · n +1
n
32k − 1
32 − 1(mit k = log3(n) bzw. n = 3k)
= c · n +n2 − 1
8n= c · n +
1
8
(n − 1
n
)
(*) Diese Zeile ist wieder mit vollstandiger Induktion zu zeigen!
Frank Heitmann [email protected] 55/56

WiederholungKorrektheit von Algorithmen
Rekursive Algorithmen
EinfuhrungRekurrenzgleichungenZusammenfassung
Ein weitere Beispiel
Aus
T (n) = c · n +1
8
(n − 1
n
)folgt nun
T (n) < (c + 18) · n und damit T (n) ∈ O(n) und
T (n) > c · n und damit T (n) ∈ Ω(n).
Insgesamt haben wir also
T (n) ∈ Θ(n)
gezeigt!
Frank Heitmann [email protected] 56/56