1. Praktische Übung - Universität Konstanz

Werbung
Universität Konstanz
Algorithmen und Datenstrukturen
Fachbereich Informatik & Informationswissenschaft
WS 2014/2015
Prof. Dr. Ulrik Brandes / Dr. Martin Mader / Dr. Barbara Pampel / Felix Schönenberger
1. Praktische Übung
6. November 2014 Abgabe: 19. November 2014, 18:00 Uhr
Die Bearbeitung in Zweiergruppen ist ausdrücklich erwünscht.
Ausgabe:
Generelle Anmerkungen:
• Kommentieren Sie Ihren Code ausführlich!
• Kopieren Sie die gegebenen Klassen nicht in Ihr Verzeichnis. Interfa-
ces sollen implementiert werden; andere Klassen können gegebenenfalls
erweitert werden.
• Legen Sie die Quelldateien Ihres Java-Codes, sowie zusätzliche Skripte
und in den einzelnen Aufgaben geforderte Dateien im svn-Repository
ab. Insbesondere sollten keine .class-Dateien, sowie z.B. Einstellungsdateien der benutzten Entwicklungsumgebung abgelegt werden.
Aufgabe 1: Sortierverfahren
6 Punkte
Implentieren Sie MergeSort, QuickSort, und HeapSort in Java. Implementieren Sie dazu das Interface material.p01.ISort durch die Klassen
• <team>.p01.MergeSort,
• <team>.p01.QuickSort, und
• <team>.p01.HeapSort.
Aufgabe 2: Laufzeit-Experiment
5 Punkte
Messen Sie die empirischen Laufzeiten für die Sortierung von Double-Arrays
mit den drei Sortierverfahren aus Aufgabe 1. Führen Sie aussagekräftige
Tests durch und stellen Sie die gemessenen Werte in Diagrammen dar.
Hinweise:
• Verwenden Sie zur Messung z.B. die Methode currentTimeMillis()
aus java.lang. Sie dürfen geeignete Klassen in java.io verwenden,
um die Messdaten anderen Programmen verfügbar zu machen.
• Generieren Sie Double-Arrays hinreichender Gröÿen basierend auf min-
destens zwei unterschiedlichen Anordnungen der Eingaben (z.B. eine
uniform verteilte Anordnung der Zahlen). Sie können dazu die Klasse material.p01.DoubleArrayGenerator verwenden. Wiederholen Sie
Laufzeitmessungen, um robustere Ergebnisse zu erhalten.
• Wir empfehlen die Benutzung der Programme R oder gnuplot (Links
siehe Homepage), um Diagramme aus den Laufzeitmessungen zu erstellen.
Fassen Sie die Diagramme in einer Datei <team>_p01_runtimes.pdf zusammen, erläutern und begründen Sie Ihre Vorgehensweise bezüglich der Tests
und deren Auswertung, und interpretieren Sie die Ergebnisse (maximal eine
Seite Text). Fügen Sie diese pdf-Datei dem Repository in einem Verzeichnis data unterhalb Ihres Grundverzeichnisses hinzu. Es werden Bonuspunkte
vergeben, wenn die theoretischen Laufzeiten durch sog. curve tting auf den
empirischen Messungen untermauert werden.
Aufgabe 3: Sparklines
9 Punkte
Sparklines sind nach Edward Tufte kleine, (aussage-)kräftige, und einfache
Datenwörter.1 In seinem Buch Beautiful Evidence (2006) verweist Tufte auf
eine Sparkline-artige Darstellung des Ablaufs von Sortieralgorithmen, welche ihrerseits in dem Buch Algorithms in C (1998) von Robert Sedgewick
auftaucht:
1
siehe http://www.edwardtufte.com/bboard/q-and-a-fetch-msg?msg_id=0001OR
Diese Darstellung illustriert die Rekursionsschritte von MergeSort auf einem
Array der Länge 200. Die Elemente der Eingabe werden als angewinkelte Linien repräsentiert; der Winkel entspricht hierbei der Position eines Elements
im sortierten Array.
Erweitern Sie ihre Implementationen aus Aufgabe 1 so, dass ein Aufruf von
sort(...) eine solche Sparkline-Darstellung erzeugt. Sie dürfen hier Methoden aus java.util verwenden.
(a) Implementieren Sie die im Interface ISort angegebene Methode
calculateAngles(). Diese soll als Vorverabeitungsschritt zu jedem
Element einen zugehörigen Winkel zwischen 45◦ (gröÿtes Element) und
135◦ (kleinstes Element) berechnen. Gleichen Elementen soll dabei der
gleiche Winkel zugewiesen werden.
(b) Um eine Sparkline-Darstellung zu erzeugen, können Sie die bereitgestellte Klasse material.p01.TikZDrawer verwenden. Heben Sie dabei
die Linien besonderer Elemente hervor, z.B. die jeweiligen Grenzen des
Sortierbereichs (QuickSort und MergeSort), das aktuelle Pivot (QuickSort), oder das aktuell einsortierte Element (HeapSort).
TikZDrawer kapselt einige Zeichenbefehle des LATEX-Pakets TikZ2 und
stellt weitere Methoden, z.B. zum Schreiben des LATEX-Headers, zur
Verfügung.
Sie dürfen die Klasse TikZDrawer durch eine abgeleitete Klasse beliebig erweitern oder ändern, um die Funktionalität Ihren Bedürfnissen
anzupassen.
Hinweis: Während der Durchführung der Sortieralgorithmen müssen
Sie gegebenenfalls zusätzliche Informationen mitführen, wie z.B. die
Rekursionstiefe bei QuickSort oder MergeSort.
(c) Generieren Sie zwei Double-Arrays mit hinreichender Gröÿe und hinreichend unterschiedlichen Anordnungen. Sie können dazu wieder
material.p01.DoubleArrayGenerator verwenden. Erstellen Sie mit
Ihrer Implementation entsprechende Sparkline-Darstellungen der drei
Sortierverfahren.
Fassen Sie die Graken in einer Datei <team>_p01_sparklines.pdf
zusammen, erläutern Sie Ihre Vorgehensweise, und interpretieren Sie
die Ergebnisse (maximal eine Seite Text). Legen Sie diese pdf-Datei
ebenfalls im Verzeichnis data unterhalb Ihres Grundverzeichnisses ab.
2
Das Paket ist ausführlich dokumentiert unter http://www.ctan.org/tex-archive/
graphics/pgf/base/doc/generic/pgf/pgfmanual.pdf. Viele kompaktere Tutorials sind
im WWW zu nden.
Herunterladen