Christian Sohler u.v.a. Paderborn, den 11. April 2007 Abgabe 23. April 2007 Übungen zur Vorlesung Datenstrukturen und Algorithmen SS 2007 Blatt 1 AUFGABE 1: Wir betrachten zwei Algorithmen A und B, die dasselbe Problem lösen. Algorithmus A benötigt bei einer Eingabe der Größe n genau 2n2 Basisoperationen. Algorithmus B benötigt bei Eingabegröße n genau 50n log n Basisoperationen. Weiter betrachten wir zwei unterschiedlich schnelle Computer C1 und C2 . Dabei ist C1 ein neuer Supercomputer, der in der Lage ist, jede Sekunde 1016 Basisoperationen durchzuführen, während Computer C2 ein einfacher Pentium mit nur 6 · 109 Basisoperationen pro Sekunde ist. a) Wie lange braucht man mit Algorithmus A auf Supercomputer C1 , bzw. mit Algorithmus B auf dem PC C2 , um ein Problem der Größe 1013 zu lösen? b) Für welche Problemgrößen ist Algorithmus A schneller und für welche ist Algorithmus B schneller, wenn beide Algorithmen auf dem gleichen Computer laufen? AUFGABE 2: Seien a = (a1 , a2 , · · · , an ) und b = (b1 , b2 , · · · , bn ) zwei binäre Zahlen bestehend aus jeweils n Bits. Wir betrachten das Problem, die Summe der beiden Zahlen zu berechnen. Dazu sei a in einem Array A[1, · · · , n] (A[i] enthält ai ) und b in einem Array B[1, · · · , n] (B[i] enthält bi ) abgespeichert. Die Summe der beiden Zahlen soll in binärer Form in einem Array C[1, · · · , n + 1] abgespeichert werden. a) Beschreiben Sie einen Algorithmus im Pseudocode, der dieses Problem löst. b) Zeigen Sie, dass der Algorithmus korrekt ist. Finden Sie dazu eine geeignete Schleifeninvariante. c) Welche Worst-Case Laufzeit hat der Algorithmus? AUFGABE 3: Gegeben seien a0 , a1 , · · · , an−1 und eine reelle Zahl x. Berechnet werden soll Pn−1n Koeffizienten i der Wert i=0 ai x . a) Beschreiben Sie einen einfachen Algorithmus im Pseudocode, der dieses Problem in einer Laufzeit von Θ(n2 ) löst. b) Beschreiben Sie einen Algorithmus im Pseudocode mit Laufzeit Θ(n), der die folgende Methode (genannt Horner-Schema) zur Umschreibung eines Polynoms benutzt: n−1 X ai xi = (· · · (an−1 x + an−2 )x + · · · + a1 )x + a0 . i=0 AUFGABE 4: Wir betrachten den Bubble-Sort Algorithmus. Seien a1 , a2 , · · · , an n Zahlen, die in einem Array A[1, · · · , n] gespeichert sind (A[i] enthält ai ). Ein elementarer Schritt im Bubble-Sort Algorithmus ist der sogenannte Compare-Exchange Schritt (C/E). Für 1 ≤ i < j ≤ n hat C/E(i, j) die Wirkung: Falls A[i] > A[j], dann vertausche A[i] und A[j].“ ” Wir nennen das Auftreten von A[i] > A[j] mit 1 ≤ i < j ≤ n eine Inversion. Um ein sortiertes Array A[1, · · · , n] zu erhalten, müssen alle Inversionen beseitigt werden. Dazu führt der Bubble-Sort Algorithmus C/E(i, i+1) Schritte, also Compare-Exchange Operationen auf benachbarten Array-Positionen, aus und zwar in der Reihenfolge: Runde 1: Runde 2: Runde 3: (1, 2), (1, 2), (1, 2), (2, 3), (2, 3), (2, 3), Runde n − 2: Runde n − 1: (1, 2), (1, 2) (2, 3), ··· ··· ··· .. . (n − 3, n − 2), (n − 3, n − 2), (n − 3, n − 2) (n − 2, n − 1), (n − 2, n − 1) (n − 1, n) Es wird nun folgende Modifikation des Bubble-Sort Algorithmus vorgenommen: Falls in Runde i die letzte vorgenommene Vertauschung (n − j, n − j + 1) war mit j > i, dann werden die Runden i + 1, · · · , j übersprungen, und erst mit Runde j + 1 weitergemacht. a) Geben Sie den Bubble-Sort Algorithmus ohne Modifikation im Pseudocode an und bestimmen Sie dessen Laufzeit. b) Geben Sie den modifizierten Bubble-Sort Algorithmus im Pseudocode an. c) Wie sieht eine Eingabe aus, so dass die Laufzeit des Bubble-Sort Algorithmus ohne Modifikation am kürzesten ist? (Eine solche Eingabe wird als Best-Case Eingabe bezeichnet.) Wie sieht eine Best-Case Eingabe des modifizierten Algorithmus aus? d) Analysieren Sie die Laufzeit des Algorithmus ohne Modifikation und des modifizierten Algorithmus im Best-Case. e) Wie sieht eine Worst-Case Eingabe des Algorithmus ohne Modifikation aus? Wie sieht eine Worst-Case Eingabe des modifizierten Algorithmus aus? f) Analysieren Sie die Laufzeit des Algorithmus ohne Modifikation und des modifizierten Algorithmus im Worst-Case. g) Beweisen Sie die Korrektheit des modifizierten Algorithmus. (Hinweis: Zeigen Sie unter anderem, dass es keine Inversion bei zwei Elementen gibt, die rechts von n − j + 1 stehen, wenn die letzte Vertauschung in Runde i die Elemente (n − j, n − j + 1) mit j > i behandelt hat.)