TU Ilmenau, Fakultät IA FG Telematik/Rechnernetze Prof. Dr.-Ing. G. Schäfer http://www.tu-ilmenau.de/telematik/aup Algorithmen und Programmierung WS 15/16 Übungsblatt 7 Abgabe der Lösungen am 16.12.2015 in der Vorlesung Aufgabe 1 (Korrektheit imperativer Algorithmen) 4 Punkte Gegeben sei der folgende Algorithmus GAUSS. Zeigen Sie, dass {N ≥ 0} GAUSS {S = N * (N + 1) / 2} gilt. GAUSS: var N,C,S : int; input N; C := 0; S := 0; while C 6= N do C := C + 1 S := S + C; od output S. Aufgabe 2 (Korrektheit applikativer Algorithmen) 4 Punkte Den folgenden applikativen Algorithmus kennen Sie bereits aus Aufgabe 4 vom Übungsblatt 3. f(x,y) = if (y = 0) then 1 else if (y < 0) then (1.0)/f(x,-y) else if (y > 0) then x · f(x,y-1) fi fi fi Damals haben einige von Ihnen die Behauptung aufgestellt, dass f(x,y) = xy gelten würde. Beweisen Sie diese Behauptung per vollständiger Induktion. Aufgabe 3 (Master-Theorem) 8 Punkte Das Master-Theorem besagt, dass eine Rekurrenzgleichung T (n) = aT ( nb ) + f (n), mit Konstanten a, b > 1 und einer Funktion f (n) über den nicht-negativen Zahlen, wie folgt asymptotisch abgeschätzt werden kann: logb a ) falls gilt: ∃ε > 0 : f (n) = O(nlogb a−ε ) Θ(n Θ(nlogb a log n) falls gilt: f (n) = Θ(nlogb a ) T (n) = Θ(f (n)) falls gilt: ∃ε > 0 : f (n) = Ω(nlogb a+ε ) ∧∃0 < c < 1, ∃n0 ∀n ≥ n0 : a · f ( nb ) ≤ c · f (n) Nutzen Sie das Master-Theorem, um die folgenden Rekurrenzgleichungen abzuschätzen, bzw. geben Sie an wo dies nicht möglich ist. Begründen Sie ihre Lösung. √ √ a) T (n) = 27 · T n3 + 2n2,5 n b) T (n) = T n2 + n c) T (n) = 64 · T n4 + 3n2 d) T (n) = 0, 5 · T n2 + n Bitte wenden! 2 Algorithmen und Programmierung WS 15/16 Aufgabe 4 (Zahlendreieck applikativ) Übungsblatt 7 4 + 1 + 3 Punkte Startet man an der Spitze eines Zahlendreiecks und bewegt sich in jedem Schritt stets zu einem benachbarten Feld der darunterliegenden Zeile, so entsteht ein Weg von der Spitze bis zum Boden. Die Länge eines Weges sei definiert als die Summe der Zahlen auf dem Weg. Beispiel für einen Weg der Länge 3 + 7 + 4 + 5 = 19: 3 7 2 8 4 4 5 6 9 3 Der folgende applikative Algorithmus berechnet die Länge des kürzesten Weges (Weg mit der geringsten Summe) von der Spitze bis vom Boden: d(t) = h(t,0,0) h(t,i,j) = if i = length(t)-1 then t[i,j] else t[i,j] + min(h(t,i+1,j), h(t,i+1,j+1)) fi Dabei sei im Parameter t das Zahlendreieck als Array kodiert, so dass t[i,j] das j-te Element der i-ten Zeile (jeweils beginnend mit 0) liefert. length(t) sei die Anzahl der Zeilen in t. (a) Beweisen Sie mittels vollständiger Induktion die Korrektheit des Algorithmus. Hinweis: Zeigen Sie dafür, dass h(t, i, j) den kürzesten Weg von (i,j) zum Boden berechnet. (b) Leiten Sie aus dem Algorithmus eine Rekurrenzrelation T(n) für die Anzahl der Array-Zugriffe bei Ausführung von d(t) mit n = length(t) und n ≥ 1 ab. (c) Finden Sie eine geschlossene Form für T(n) und beweisen Sie die Äquivalenz der geschlossenen Form und der Rekurrenz mittels vollständiger Induktion. Aufgabe 5 (Zahlendreieck effizient) 4 + 1 + 1 Punkte Leider ist der applikative Algorithmus aus Aufgabe 4 nicht besonders effizient (siehe Teilaufgabe 4c)). (a) Entwickeln Sie einen (asymptotisch) effizienteren Algorithmus in Java, der die Länge des kürzesten Weges eines Zahlendreiecks von der Spitze bis zum Boden ermittelt. (b) Auf der Internetseite zur Vorlesung (http://www.tu-ilmenau.de/telematik/ aup) ist neben dem Übungsblatt ein Beispiel eines größeren Zahlendreiecks verlinkt. Geben Sie die Länge des kürzesten Weges dieses Zahlendreiecks an. (c) Welche asymptotische Laufzeit besitzt Ihr Algorithmus für eine Eingabe mit n Zeilen? Hinweis: Zum Einlesen des Zahlendreiecks können Sie die Klasse aup.FileUtils verwenden: import aup . ∗ ; ... S t r i n g path = F i l e U t i l s . g e t F i l e P a t h ( ) ; i n t [ ] [ ] t r i a n g l e = F i l e U t i l s . r e a d I n t M a t r i x ( path ) ;