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.