74 Algorithmen und Datenstrukturen 3 Rekursionen Vor allem bei rekursiven Algorithmen besitzt die Laufzeitfunktion eine naheliegende rekursive Formulierung, d.h. die Laufzeitfunktion ist konstant für den Basisfall und ansonsten durch den Funktionswert für kleinere Argumente angegeben. Das Auflösen von Rekursionen, d.h. die Umwandlung der rekursiven in eine explizite (oder asymptotische) Darstellung, ist Gegenstand dieses Kapitels. Wir stellen hierfür drei Techniken vor: Substitutionsmethode Lösung raten und dann per Induktion verifizieren Rekursionsbäume Aufstellen eines Baumes dessen Knoten die Laufzeit auf jeder Rekursionsstufe darstellen und Aufsummieren Hauptsatz Eine formale Methode, welche obere asymptotische Schranken für Rekursionen der Form T (n) = aT (n/b) + f (n) liefert. 3 Rekursionen TU Bergakademie Freiberg, WS 2005/06 75 Algorithmen und Datenstrukturen Beispiele: ( • T (n) = ( • T (n) = ( • T (n) = 3 Rekursionen falls n = 1, T (n − 1) + 1 falls n > 1. 1 falls n = 1, 2T (n/2) + n falls n > 1. 0 √ T ( n) + 1 ( • T (n) = 1 falls n = 2, Lösung: T (n) = n. Lösung: T (n) = n log2 n+n Lösung: T (n) = log log n falls n > 2. 1 falls n = 1, T (n/3) + T (2n/3) + n falls n > 1. Lösung: T (n) = Θ(n log n) TU Bergakademie Freiberg, WS 2005/06 76 Algorithmen und Datenstrukturen Hilfreiche Vereinfachungen Reellwertige Argumente. Oft ist es einfacher, mit reellen Argumenten zu rechnen, auch wenn die Laufzeitfunktion nur für natürliche Argumente definiert ist. Beispielsweise ist die rekursive Beschreibung der Laufzeit von M ERGE -S ORT strenggenommen ( Θ(1) falls n = 1, T (n) = T (dn/2e) + T (bn/2c) + Θ(n) falls n > 1. Ignorieren von Basisfällen. Typischerweise gilt T (n) = Θ(1) für hinreichend kleines n, sodass bei der Formulierung von Rekursionen oft der Basisfall weggelassen wird und beispielsweise nur T (n) = 2T (n/2) + Θ(n) angegeben wird. Wir werden jedoch Fälle kennenlernen, bei denen diese Vereinfachungen nicht zulässig sind. 3 Rekursionen TU Bergakademie Freiberg, WS 2005/06 77 Algorithmen und Datenstrukturen 3.1 Die Substitutionsmethode Vorgehen: 1. Lösung oder deren Asymptotik raten 2. Durch vollständige Induktion zeigen, dass geratene Lösung stimmt Beispiel: Gesucht sei eine asymptotische Oberschranke für die Rekursion (3.1) T (n) = 2T (bn/2c) + n. In Anbetracht der Ähnlichkeit mit der Rekursion für wir die obere Schranke T (n) = O(n log n). MERGE -S ORT erraten Somit ist also zu zeigen: T (n) ≤ cn log n für eine geeignet gewählte Konstante c. 3.1 Die Substitutionsmethode TU Bergakademie Freiberg, WS 2005/06 78 Algorithmen und Datenstrukturen Induktionsannahme: die Aussage gelte für bn/2c, d.h. es gelte T (bn/2c) ≤ cbn/2c log2 (bn/2c). Einsetzen in die Rekursion ergibt T (n) = 2T (bn/2c) + n ≤ 2 cbn/2c log2 (bn/2c) + n ≤ cn log2 (n/2) + n = cn log2 n − cn log2 2 + n = cn log2 n + (1 − c)n ≤ cn log2 n für jedes c ≥ 1. 3.1 Die Substitutionsmethode TU Bergakademie Freiberg, WS 2005/06 79 Algorithmen und Datenstrukturen Induktionsanfang: Zeige, dass c so gewählt werden kann, dass T (n) ≤ cn log n auch für den Basisfall zutrifft. Für den Basisfall T (1) = 1 hieße dies T (1) ≤ c · 1 · log 1 = 0, hier scheint sich also ein Problem aufzutun. Für den Nachweis der gewünschten asymptotischen Aussage muss jedoch lediglich T (n) ≤ cn log n für n ≥ n0 gezeigt werden (n0 noch frei wählbar). Rekursion (3.1) ist für n > 3 unabhängig von T (1). Wir können also auch T (2) und T (3) anstelle von T (1) als Basisfälle – des Induktionsbeweises, nicht der Rekursionsgleichung – betrachten (n0 = 2). Rekursion (3.1) liefert desweiteren T (2) = 4, T (3) = 5 und T (2) ≤ c·2 log2 2 sowie T (3) ≤ c · 3 log2 3 sind somit für alle c ≥ 2 erfüllt. 3.1 Die Substitutionsmethode TU Bergakademie Freiberg, WS 2005/06 80 Algorithmen und Datenstrukturen Erfolgreiches Raten: • Erfordert etwas Übung • Manchmal Rekursionsbäume hilfreich (siehe nächsten Abschnitt) • Ähnlichkeiten mit bekannten Rekursionen beachten. T (n) = 2T (bn/2c + 17) + n legt T (n) = O(n log n) nahe. (Verifizieren!) • Zunächst (einfache aber) schwächere asymptotische Schranken herleiten und diese dann verfeinern. (Hier etwa zunächst T (n) = Ω(n) oder T (n) = O(n2 )). 3.1 Die Substitutionsmethode TU Bergakademie Freiberg, WS 2005/06 81 Algorithmen und Datenstrukturen Feinheiten: Manchmal muss die Induktionsannahme durch Abziehen eines Terms niedrigerer Ordnung gestärkt werden, um den Induktionsschluss zu ermöglichen: betrachte T (n) = T (bn/2c) + T (dn/2e) + 1. Wir raten T (n) = O(n) und versuchen daher T (n) ≤ cn für eine geeignete Konstante c nachzuweisen. Einsetzen: T (n) = T (bn/2c) + T (dn/2e) + 1 ≤ cbn/2c + cdn/2e + 1 = cn + 1, läßt sich nicht durch cn abschätzen. 3.1 Die Substitutionsmethode TU Bergakademie Freiberg, WS 2005/06 82 Algorithmen und Datenstrukturen Lösung: wir subtrahieren einen Term niederer Ordnung von der zuvor geratenen Schranke: T (n) ≤ cn − b, b ≥ 0 konstant. Einsetzen: T (n) ≤ (cbn/2c − b) + (cdn/2e − b) + 1 = cn − 2b + 1 ≤ cn − b, sofern b ≥ 1. Nun muss lediglich c hinreichend groß gewählt werden, damit die Anfangsbedingung erfüllt ist. 3.1 Die Substitutionsmethode TU Bergakademie Freiberg, WS 2005/06 83 Algorithmen und Datenstrukturen Vorsicht ! In der Verwendung der asymptotischen Notation kann man leicht Fehler machen: ein falscher Beweis“, dass die Rekursion (3.1) eine Schranke von ” O(n) besitzt, könnte so lauten: wir raten zunächst T (n) ≤ cn und folgern daraufhin T (n) ≤ 2(cbn/2c) + n ≤ cn + n = O(n) ⇐ falsch ! mit der Argumentation, dass c ja eine Konstante sei. Der Fehler besteht darin, dass nicht gezeigt wurde: es existiert eine Konstante c, sodass T (n) ≤ cn. 3.1 Die Substitutionsmethode TU Bergakademie Freiberg, WS 2005/06 84 Algorithmen und Datenstrukturen Einführung neuer Variablen Manchmal bringt etwas algebraische Manipulation eine Rekursion in eine freundlichere Form. Betrachte √ T (n) = 2T (b nc) + log2 n. Umbenennen von m = log2 n, d.h. n = 2m , lieferta T (2m ) = 2T (2m/2 ) + m. Umbenennung der abhängigen Variablen durch S(m) = T (2m ) führt auf S(m) = 2S(m/2) + m, eine Rekursion, die (3.1) sehr ähnlich ist. Tatsächlich gilt hier S(m) = O(m log2 m). a hier ignorieren wir das Runden auf ganze Zahlen 3.1 Die Substitutionsmethode TU Bergakademie Freiberg, WS 2005/06 85 Algorithmen und Datenstrukturen Umschreiben in die alten Variablen liefert nun T (n) = T (2m ) = S(m) = O(m log2 m) = O ((log2 n) log2 log2 n) . 3.1 Die Substitutionsmethode TU Bergakademie Freiberg, WS 2005/06 86 Algorithmen und Datenstrukturen 3.2 Rekursionsbäume Gute Methode, um Ansatz für Substitutionsmethode zu finden. Rekursionsbaum: • Jeder Knoten repräsentiert Aufwand für ein Teilproblem irgendwo innerhalb der Rekursionshierarchie. • Aufsummieren innerhalb jeder Ebene liefert Aufwand pro Ebene, Summieren über alle Ebenen liefert Gesamtaufwand. Beispiel 1: Rekursionsbaum für T (n) = 3T (bn/4c) + Θ(n2 ). (i) Ignoriere Floor-Funktion, Ausschreiben der Konstanten: T (n) = 3T (n/4)+ cn2 . (ii) Weitere Vereinfachung: n = 4p . 3.2 Rekursionsbäume TU Bergakademie Freiberg, WS 2005/06 87 Algorithmen und Datenstrukturen • Teilproblemgröße auf Ebene i (i = 0, 1, . . . ) ist n/4i , wird 1 für i = log4 n, ⇒ Baum enthält 1 + log4 n Ebenen (i = 0, 1, . . . , log4 n). • Aufwand pro Ebene: # Knoten auf Ebene i: 3i (i = 0, 1, . . . , log4 n), Problemgröße auf Ebene i: n/4i , ⇒ Aufwand pro Knoten auf Ebene i: c(n/4i )2 (i = 0, 1, . . . , log4 n − 1) ⇒ Aufwand auf Ebene i i n 2 3 2 i (i = 1, 2, . . . , log4 n − 1). 3 c i = cn 4 16 • # Knoten auf unterster Ebene: 3log4 n = nlog4 3 Aufwand für diese Knoten (Blätter): T (1) ⇒ Aufwand für Blätter: nlog4 3 T (1) = Θ(nlog4 3 ). 3.2 Rekursionsbäume TU Bergakademie Freiberg, WS 2005/06 88 Algorithmen und Datenstrukturen Gesamtaufwand: 3 3 + · · · + cn2 16 16 i log4 n−1 X 3 = cn2 + Θ(nlog4 3 ) 16 i=0 i ∞ X 3 2 + Θ(nlog4 3 ) < cn 16 i=0 T (n) = cn2 + cn2 log4 n−1 + Θ(nlog4 3 ) 1 log4 3 + Θ(n ) 3 1 − 16 16 = cn2 + Θ(nlog4 3 ) 13 = O(n2 ). = cn2 3.2 Rekursionsbäume TU Bergakademie Freiberg, WS 2005/06 89 Algorithmen und Datenstrukturen Wir erraten“ also in der Substitutionsmethode eine obere Schranke von 2” O(n ) und schreiten zum Induktionsbeweis. Wir wollen zeigen: T (n) ≤ dn2 für geeignete Konstante d. T (n) = 3T (bn/4c) + cn2 ≤ 3dbn/4c2 + cn2 n 2 ≤ 3d + cn2 4 3 2 = dn + cn2 16 ≤ dn 2 16 c. sofern d ≥ 13 Damit ist die obere Schranke von O(n2 ) verfiziert. 3.2 Rekursionsbäume TU Bergakademie Freiberg, WS 2005/06 90 Algorithmen und Datenstrukturen Beispiel 2: Rekursion T (n) = T (n/3) + T (2n/3) + O(n) • Längster Weg von Wurzel zu Blatt: 2 2 2 n→ n→ n → · · · → 1. 3 3 (2/3)k n = 1 ⇔ k = log 32 n ⇒ Höhe des Baumes ist log 23 n. • Gesamtaufwand: Aufwand pro Ebene · Höhe des Baumes = cn · log 23 n = O(n log n). • # Blätter bei vollständigem binären Baum: 2log3/2 n = nlog3/2 2 . Aufwand pro Blatt konstant ⇒ Blätter kosten Θ(nlog3/2 2 ) = ω(n log n). Aber: Baum ist nicht vollständig, hat daher weniger als nlog3/2 2 Blätter. 3.2 Rekursionsbäume TU Bergakademie Freiberg, WS 2005/06 91 Algorithmen und Datenstrukturen Wir vermuten aber trotz dieser Ungenauigkeit eine obere Schranke von O(n log n) und versuchen zu beweisen, dass T (n) ≤ dn log n für eine Konstante d ≥ 0. T (n) ≤ T (n/3) + T (2n/3) + cn n n 2n 2n ≤ d log + d log + cn 3 3 3 3 dn 2dn 3 = (log n − log 3) + log n − log + cn 3 3 2 dn 2dn 3 = dn log n − log 3 + log + cn 3 3 2 dn (log 3 + 2 log 3 − 2 log 2) + cn = dn log n − 3 2 = dn log n − dn log 3 − log 2 + cn 3 ≤ dn log n sofern d ≥ (log 3 − 2/3 log 2)/c. 3.2 Rekursionsbäume TU Bergakademie Freiberg, WS 2005/06 92 Algorithmen und Datenstrukturen 3.3 Der Hauptsatz Kochrezept“ zur Auflösung von Rekursionen der Bauart ” (3.2) T (n) = aT (n/b) + f (n) mit Konstanten a ≥ 1, b > 1 sowie einer asymptotisch positiven Funktion f . Durch Unterscheidung zwischen drei Fällen bei einer Rekursion ist damit deren Auflösen oft ohne Rechnung möglich. Interpretation von (3.2): • Laufzeit eines rekursiven Algorithmus, welcher ein Problem in a Teilprobleme der Größe jeweils n/b zerlegt. • Aufwand von Zerlegen/Zusammenfügen durch f beschrieben. • Beispiel M ERGE -S ORT: a = 2, b = 2, f (n) = Θ(n). 3.3 Der Hauptsatz TU Bergakademie Freiberg, WS 2005/06 93 Algorithmen und Datenstrukturen Satz 3.1 (Hauptsatz) Seien a ≥ 0, b > 0 Konstanten, f : N0 → R eine asymptotisch positive Funktion und die Funktion T erfülle die Rekursionsgleichung T (n) = aT (n/b) + f (n), wobei n/b als entweder bn/bc oder dn/be zu interpretieren ist. Dann kann T asymptotisch wie folgt beschränkt werden: (1) Ist f (n) = O(nlogb a− ) für ein > 0, so gilt T (n) = Θ(nlogb a ). (2) Ist f (n) = Θ(nlogb a ), so gilt T (n) = Θ(nlogb a log n). (3) Ist f (n) = Ω(nlogb a+ ) für ein > 0 und gilt af (n/b) ≤ cf (n) für eine Konstante c < 1 und alle hinreichend grossen n, so gilt T (n) = Θ(f (n)). 3.3 Der Hauptsatz TU Bergakademie Freiberg, WS 2005/06 94 Algorithmen und Datenstrukturen Bemerkungen 3.2 1. In allen Fällen werden die Funktionen f (n) und nlogb a verglichen. Ist, wie im Fall (1), letztere größer, so gilt T (n) = Θ(nlogb a ), ist diese kleiner (Fall (3)), so gilt T (n) = Θ(f (n)). Im Fall (2) asymptotisch gleich schnellen Anwachsens ergibt sich die Asymptotik durch Multiplikation mit log n zu T (n) = Θ(nlogb a log n) = Θ(f (n) log n). 2. Im Fall (1) muss f nicht nur kleiner als nlogb a , sondern polynomiell kleiner sein, d.h. es muss asymptotisch kleiner sein als n · nlogb a . 3. Im Fall (3) muss f nicht nur größer sein als nlogb a , sondern polynomiell größer und darüberhinaus der Regularitätsbedingung af (n/b) ≤ cf (n) genügen. Diese Bedingung ist bei den meisten der hier auftretenden polynomiell beschränkten Funktionen erfüllt. 4. Die Fallunterscheidung ist nicht erschöpfend; trifft keiner der Fälle zu, so kann der Hauptsatz nicht angewandt werden. 3.3 Der Hauptsatz TU Bergakademie Freiberg, WS 2005/06 95 Algorithmen und Datenstrukturen Beispiele: 1. T (n) = 9T (n/3) + n, Hauptsatz liefert T (n) = Θ(n2 ). 2. T (n) = T (2n/3) + 1, Hauptsatz liefert T (n) = Θ(log n). 3. T (n) = 3T (n/4) + n log2 n, Hauptsatz liefert T (n) = Θ(n log n). 4. T (n) = 2T (n/2) + n log2 n, Hauptsatz nicht anwendbar. 3.3 Der Hauptsatz TU Bergakademie Freiberg, WS 2005/06