2. Übungsblatt - Universität Konstanz

Werbung
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!
Herunterladen