Karlsruher Institut für Technologie Institut für Theoretische Informatik Prof. Dr. Peter Sanders G.V. Batz, C. Schulz, J. Speck 2. Übungsblatt zu Algorithmen I im SS 2010 http://algo2.iti.kit.edu/AlgorithmenI.php {sanders,batz,christian.schulz,speck}@kit.edu Aufgabe 1 (Rekurrenzen, 4 + 4 Punkte) a) Gegeben sei folgende Rekurrenz: ( 1 falls n = 1, T (n) ≤ 4 · T (dn/2e) + 6 · n falls n ≥ 2. Zeigen Sie durch vollständige Induktion, dass T (n) ≤ 7n2 − 6n, falls n eine Zweierpotenz ist. b) Gegeben sei folgende Rekurrenz: ( c0 n T (n) = 7 T (dn/5e) + T ( 10 n + 2.5) + c1 n falls n ≤ n0 , n0 > 35 geeignet gewählt, falls n > n0 . Finden Sie eine Funktion f , so dass T (n) = Θ(f (n)) gilt und beweisen Sie ihre Behauptung. Aufgabe 2 (Anwendung Mastertheorem, 1 + 1 + 1 + 1 Punkte) Zeigen Sie mit Hilfe des Master-Theorems scharfe asymptotische Schranken für folgende Rekurrenzen: a) A(1) := 1 und für n = 2k , k ∈ N: A(n) = A(n/2) + c̃n b) B(1) := 1 und für n = 3k , k ∈ N: B(n) = 4B(n/3) + 4n c) C(1) := 1 und für n = 6k , k ∈ N: C(n) = 3C(n/6) + n + 7 d) D(1) := 1 und für n = 6k , k ∈ N: D(n) = 6D(n/6) + C(n) Aufgabe 3 (RAM-Code, 4 Punkte) Geben sie einen sequentiellen Algorithmus in RAM-Maschinencode an, der die n-te Fibonacci-Zahl in Zeit O(n) berechnet. Hinweis: Es geht auch in O(log n), aber alle sequentiellen Algorithmen in O(n) ergeben volle Punktzahl. Aufgabe 4 (Invarianten, 5 + 3 Punkte) a) Das Merging Problem ist folgendermaßen definiert: Gegeben: zwei aufsteigend sortierte Arrays A[1..n1 ], B[1..n2 ] von natürlichen Zahlen Gesucht: das aufsteigend sortierte Array C[1..(n1 + n2 ) =: n] von natürlichen Zahlen, dass genau die Zahlen von A und B enthält Der folgende Algorithmus löst das Problem: 1: procedure merge(A : Array [1..n1 ] of N≥0 , B : Array [1..n2 ] of N≥0 ) 2: precondition A[i] ≤ A[j] ∀i ≤ j mit i, j ∈ {1, ..., n1 } 3: precondition B[i] ≤ B[j] ∀i ≤ j mit i, j ∈ {1, ..., n2 } 4: A[n1 + 1] := ∞, B[n2 + 1] := ∞ 5: n := n1 + n2 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: jA := 1, jB := 1; for i := 1 to n do C[i] = min(A[jA ], B[jB ]) if A[jA ] < B[jB ] then jA = jA + 1 else jB = jB + 1 invariant C[1..i] enthält genau A[1..jA − 1], B[1..jB − 1] invariant B[k] ≤ A[jA ] ∀k ∈ {1..jB − 1}, A[k] ≤ B[jB ] ∀k ∈ {1..jA − 1} invariant C[1..i] ist sortiert assert jA = n1 + 1, jB = n2 + 1 postcondition C[i] ≤ C[j] ∀i ≤ j, i, j ∈ {1, ..., n} postcondition C[1..n] enthält genau A[1..n1 ], B[1..n2 ] return C Beweisen sie die Korrektheit des vorgegebenen Algorithmus in dem Sie die vorgebenen Invarianten und Assertions beweisen. Beweisen Sie außerdem, dass der vorgegebene Algorithmus linearen Zeitverbrauch hat. b) Geben sei n ∈ N. Geben Sie einen iterativen Algorithmus an, der n! berechnet und beweisen Sie die Korrektheit Ihres Algorithmus über eine Invariante. Zusatzaufgabe (Graphen, 3 Punkte) Ein ungerichteter Graph heißt dreiecksfrei, wenn zwischen drei beliebigen Knoten des Graphen nie alle drei möglichen Kanten existieren. Zeigen Sie: Ein dreiecksfreier Graph mit 2n Knoten hat maximal n2 Kanten und es gibt für jedes n auch einen Graphen, der die Grenze erreicht. Ausgabe: Mittwoch, 21.4.2010 Abgabe: Freitag, 30.4.2010, 12:45 im Briefkasten im Untergeschoss von Gebäude 50.34