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 16/17 Übungsblatt 8 Die Lösungen der Aufgaben sind am 19.12.16 in der Vorlesung abzugeben. Aufgabe 1 (Türme von Hanoi) 2 + 1 + 2 Punkte Wiederholen Sie zunächst den in der Vorlesung vorgestellten Algorithmus zur Lösung des Problems der Türme von Hanoi (Kapitel 2, Folie 26). (a) Geben Sie die Rekurrenzrelation für die Anzahl T (n) an benötigten Bewegungen für einen Turm der Höhe n ≥ 1 an. (b) Können Sie das Master-Theorem verwenden, um diese Rekurrenz abzuschätzen? Begründen Sie Ihre Antwort. (c) Beweisen Sie mittels vollständiger Induktion, dass T (n) = 2n − 1 gilt. Aufgabe 2 (Master-Theorem) 7 Punkte Das Master-Theorem besagt, dass eine Rekurrenzgleichung T (n) = aT ( nb ) + f (n), mit Konstanten a ≥ 1, b > 1 und einer Funktion f (n) über den nicht-negativen Zahlen, wie folgt asymptotisch abgeschätzt werden kann: log a falls gilt: ∃ε > 0 : f (n) = O(nlogb a−ε ) Θ(n b ) Θ(nlogb a log n) falls gilt: f (n) = Θ(nlogb a ) T (n) = Θ(f (n)) falls gilt: ∃ε > 0 : f (n) = Ω(nlogb a+ε ) ∧∃c, 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 + 3n2 b) T (n) = T n2 + n √ c) T (n) = 0, 5 · T n2 + n d) T (n) = 16 · T n2 + 2n2,5 n3 Aufgabe 3 (Zahlendreieck applikativ) 4 + 1 + 1 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: 2 Algorithmen und Programmierung WS 16/17 Übungsblatt 8 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) Geben Sie eine geschlossene Form für T(n) an und begründen Sie Ihre Antwort. Aufgabe 4 (Zahlendreieck effizient) 5 + 1 + 1 Punkte Leider ist der applikative Algorithmus aus Aufgabe 3 nicht besonders effizient (siehe Teilaufgabe 3c)). (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) Welche asymptotische Laufzeit besitzt Ihr Algorithmus für eine Eingabe mit n Zeilen? (c) 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. 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 ) ; Aufgabe 5 (Binäre Suche) 5 Punkte Implementieren Sie die rekursive Variante der binären Suche (siehe Kapitel 7, Folie 9) in Java. Gehen Sie davon aus, dass es sich bei der Folge F um ein Array aus ganzen Zahlen handelt und somit auch der Suchschlüssel k eine ganze Zahl ist. Sie können zudem davon ausgehen, dass das Feld F bereits sortiert ist.