Christian Scheideler u.v.a. Paderborn, den 23. April 2010 Abgabe 30. April 2010, 11:15 Uhr Übungen zur Vorlesung Datenstrukturen und Algorithmen SS 2010 Blatt 2 AUFGABE 1: Wir werfen zwei unterscheidbare Würfel mit Augenzahlen 1,2,. . . ,6. • Bestimmen sie alle Elementarereignisse! • Wie hoch ist die Wahrscheinlichkeit dass die Summe beider Würfel 7 ist? • Wie hoch ist die Wahrscheinlichkeit dass einer der beiden Würfel 3 ist unter der Bedingung dass deren Summe 7 ist? • Wie gross ist der Erwartungswert der Augensumme beider Würfel? • Sie würfeln 100 Mal hintereinander zwei Würfel. Wie gross ist die erwartete Anzahl an Würfen, bei denen Sie einen Pasch (d.h. zwei gleiche Augenzahlen) erwürfeln? AUFGABE 2: Bestimmen Sie für je zwei der folgenden Laufzeitfunktionen fi und fj , ob fi = O(fj ), fi = Omega(fj ) oder fi = Θ(fj ) gilt. f1 (n) = n(n + 1) , 2 f2 (n) = 2log(n)+1 , f3 (n) = √ 5n + 2 , f4 (n) = log(n)4 . Begründen Sie Ihre Antwort! AUFGABE 3: Beschreiben Sie, wie sich k neue Elemente in eine sortierte Liste mit n Elementen in Zeit O(k log k + n) einfügen lassen. Die Liste soll hinterher wieder sortiert sein. Geben Sie dazu einen exakten Algorithmus an (z.B. in Pseudocode) und begründen Sie dessen Laufzeit detailliert. Hinweis: Verwenden Sie (die Idee von) mergeSort. Sie dürfen Methodenaufrufe, wie zum Beispiel mergeSort(l,r) aus der Vorlesung benutzen. Achten Sie dabei auf die richtige Verwendung der Parameter und schreiben Sie notfalls dazu, ob Sie den Algorithmus von den Folien oder aus dem Skript benutzen. AUFGABE 4: Betrachten Sie den folgenden Algorithmus, der auf einer Folge von Zahlen v[0] . . . v[n − 1] operiert. a) Zeigen Sie, dass dieser Algorithmus die Folge korrekt sortiert. b) Bestimmen Sie die Anzahl ausgeführter Vergleiche, sowie die Anzahl der ausgeführten swap-Operationen (Vertauschungen) (jeweils worst-case in O()-Notation). shakersort(v, n) // v: Array von Schluesseln, // n: Anzahl Elemente (Groesse von v) { lower = 1; higher = n - 1; lastswap = n - 1; do { // bubble down for (int i = higher; i >= lower; i--) { if (v[i-1] > v[i]) { swap (v, i-1, i); // Vertausche i-tes und (i-1)-tes Element von v lastswap = i; } } lower = lastswap + 1; // bubble up for (int i = lower; i <= higher; i++) { if (v[i-1] > v[i]) { swap (v, i-1, i); // Vertausche i-tes und (i-1)-tes Element von v lastswap = i; } } higher = lastswap - 1; } while (lower <= higher); }