Übungen zur Vorlesung Informatik II WS 2009/10 Prof. Dr. A. Clausing Institut für Informatik Abgabe bis Donnerstag, 6. 5. 2010, 1200 Uhr Blatt 2 Aufgabe 4. Überlegen Sie einen O(n2 )–Algorithmus, der eine längste nicht–fallende Teilfolge aus einer Folge (a1 , . . . , an ) von Zahlen heraussucht. Die Elemente der Teilfolge müssen nicht nebeneinanderstehen. Beispiel: Für (1, 5, 3, 2, 3) ist (1, 3, 3) eine längste nicht-fallende Teilfolge. Implementieren Sie Ihren Algorthmus in Java oder t.Scheme und begründen Sie Korrektheit und Laufzeit Ihres Algorithmus. Aufgabe 5. Überlegen Sie einen Algorithmus, der mit höchstens n + dlog ne − 2 Vergleichen die zweitgrößte Zahl aus n Zahlen heraussucht. Implementieren Sie Ihren Algorthmus in Java oder t.Scheme und begründen Sie Korrektheit und Laufzeit Ihres Algorithmus. (Tipp: Suchen Sie die größte Zahl mit einem Verfahren, das einem Tennisturnier ähnelt und speichern Sie im Verlauf des Turniers die Gegner“ dieser Zahl. Eine davon ist die zweitgrößte ” Zahl.) Aufgabe 6. Man kann den Euklidischen Algorithmus so umformulieren, dass er zu a, b ∈ Z neben dem größten gemeinsamen Teiler d noch zwei Koeffizienten u, v ∈ Z liefert, so dass gilt d = ua + vb. Beispiel: Der ggT von 8 und 13 ist 1, es gilt 1 = 5 · 8 − 3 · 13. Die folgende t.Scheme–Funktion beschreibt ein Verfahren zur Berechnung dieser Koeffizienten: (define (extended-gcd a (if (= b 0) (list a 1 (let rec (extended-gcd x (car rec) y (cadr rec) z (caddr rec) (list x z (- y (* b) 0) b (mod a b)) (// a b) z)))))) a) Begründen Sie die Korrektheit des Programms. b) Welches Resultat liefert (extended-gcd fn+1 fn )? (fn ist die n-te Fibonacci-Zahl) Beweisen Sie Ihre Antwort. c) Der ggT von n natürlichen Zahlen a1 , . . . , an ist rekursiv definiert durch ggT (a1 , . . . , an ) = ggT (ggT (a1 , . . . , an−1 ), an ) für n > 2. Warum ist diese Definition unabhängig von der Reihenfolge der Argumente? Implementieren Sie eine Funktion in Java oder t.Scheme zur Bestimmung ganzzahliger Koeffizienten u1 , . . . , un , für die ggT (a1 , . . . , an ) = u1 a1 + . . . un an gilt. −→ d) Zeigen Sie, dass für jedes n ≥ 2 die Anzahl der von Ihrem Algorithmus ausgeführten Divisionen O(n log a) mit a = max(a1 , . . . , an ) ist. (Wenn das nicht der Fall sein sollte, müssen Sie zuerst Ihren Algorithmus verbessern ;–) Die Aufgabe 6 wird mit 20 Punkten bewertet.