Algorithmen und Datenstrukturen Universität Konstanz Fachbereich Informatik & Informationswissenschaft WS 2011/2012 Jun.-Prof. Dr. Steffen Rendle / Dr. Andreas Karrenbauer / Arlind Nocaj / Uwe Nagel 2. Übungsblatt Ausgabe: 26. Oktober 2011 Abgabe: 03. November 2011, 12.00 Uhr Die Bearbeitung in Zweiergruppen ist ausdrücklich erwünscht. Aufgabe 1: MergeSort – Varianten 5 Punkte Im Folgenden werden drei Varianten von MergeSort vorgestellt, die eine unterschiedliche Strategie für die Aufteilung in Teilfolgen benutzen. Geben Sie für jede der Varianten die asymptotische Laufzeit in der Θ-Notation an; begründen Sie jeweils ihre Entscheidung. (Wir vernachlässigen, dass die Längen der Teilfolgen in einigen Fällen auf ganze Zahlen gerundet werden müssen; dies hat keine Auswirkung auf die asymptotischen Laufzeiten. Genauso vernachlässigen wir die Abbruchbedingungen für kleine n.) (a) Eine Folge der Länge n wird in zwei Teilfolgen aufgeteilt von denen eine die Länge 2n/3 und die andere die Länge n/3 hat. (b) Eine Folge der Länge n wird in zwei Teilfolgen aufgeteilt von denen eine die Länge n − 100 und die andere die Länge 100 hat. (c) Eine Folge der Länge n wird in drei Teilfolgen aufgeteilt von denen jede die Länge n/3 hat. Aufgabe 2: MergeSort3 3 Punkte Der Algorithmus MergeSort3 soll im Gegenteil zum Algorithmus MergeSort aus der Vorlesung das Array in drei statt in zwei Teilarrays zerlegen. Diese drei Teilarrays sollen dann analog zum Algorithmus MergeSort rekursiv sortiert und anschließend zusammengefügt werden. Sortieren Sie das Array A = [6, 8, 3, 2, 1, 4, 9, 5, 7] mit MergeSort3 und geben Sie jeden Zwischenschritt an. [Bitte wenden] Aufgabe 3: SelectionSort – Beispiel 2 Punkte Führen Sie die Algorithmen SelectionSort auf der folgenden Eingabe aus 7 3 9 8 5 11 1 Geben Sie den Zustand des Arrays M nach jeder Ausführung der ersten for Schleife (d. h., nach jeder Vertauschung) an. Aufgabe 4: Natürliches MergeSort 4 Punkte Mit einer MergeSort-Variante kann man berücksichtigen, wenn bereits Teile der Eingabe „natürlich“ vorsortiert sind: Die Eingabe wird nicht in zwei Teile zerteilt, die man dann rekursiv sortiert, sondern in monotone Teile (Beispiel: 12536545 wird zu 125|36|5|45). Diese werden ohne rekursiven Aufruf wie üblich zusammengemischt. (a) Implementieren Sie natürliches MergeSort in Java mit einer Klasse u02.nachname1_nachname2.NaturalMergeSortImpl. Verwenden Sie das Interface material.u02.ISort. (b) Denken Sie darüber nach, bei welchen Eingaben diese Heuristik besser funktioniert als das Standard-MergeSort und bei welchen schlechter. Aufgabe 5: Fibonacci-Zahlen 6 Punkte Die n-te Fibonacci-Zahl (n ∈ N) ist definiert durch fn = fn−1 + fn−2 für n > 1 und f0 = 0, f1 = 1. Man kann sie auf folgende Arten berechnen: (1) mit rekursiven Aufrufen, also unter direkter Verwendung der obigen Definition, (2) mit einem Array der Länge n + 1 zum Speichern vorheriger Teilergebnisse, √ n √ n 1+ 5 (3) mit der Formel fn = √15 − 1−2 5 . 2 Entwickeln Sie eine Klasse Fibonacci.java, die das Interface material.u02.IFibonacci, und damit alle obengenannten Varianten implementiert. (3 Punkte) Messen Sie die empirischen Laufzeiten für die drei Varianten für einen sinnvollen Bereich von n. Stellen Sie die gemessenen Werte in einem Diagramm im eps- oder pdf-Format dar, z.B. mit dem Tool gnuplot. Verwenden Sie zur Messung z.B. die Methode currentTimeMillis() der Klasse System aus java.lang. Sie dürfen geeignete Klassen in java.io verwenden, um den Input für die Diagrammerstellung zu generieren. Interpretieren Sie die Ergebnisse und setzen Sie sie mit den asymptotischen Laufzeiten (bis auf (1)) in Beziehung. Die asymptotischen Laufzeiten müssen hierbei nicht bewiesen werden. (3 Punkte) Beachten Sie bitte die allgemeinen Hinweise auf der Homepage zur Vorlesung!