Ubung 6 - WueCampus2 - Universität Würzburg
Transcrição
Ubung 6 - WueCampus2 - Universität Würzburg
Lehrstuhl für Informatik I Würzburg, den 21. November 2013 Effiziente Algorithmen und wissensbasierte Systeme Prof. Dr. Alexander Wolff M.Sc. Krzysztof Fleszar Universität Würzburg Vorlesung Algorithmen und Datenstrukturen WS 2013/14 Übung 6 Bitte geben Sie Ihre Lösungen bis Do, 28. November 2013, 12:00 Uhr in 2er- oder 3erGruppen (nur innerhalb einer Übungsgruppe!) als ein pdf-Dokument über die WueCampus-Seite der Lehrveranstaltung ab. Andere Dateiformate werden ignoriert! Geben Sie stets die Namen aller BearbeiterInnen und die Nummer Ihrer Übungsgruppe an. Abgaben ohne Namen und ohne Gruppennummer werden nicht korrigiert! Geben Sie Ihren Quelltext zu den Aufgaben 2 (a) und (b) online auf PABS ab: https://pabs.uni-wuerzburg.de/courses/151 Klicken Sie bei Ihrer endgültigen Abgabe auf Submit as solution (dies ist nun auch bei abgelehnten Lösungen möglich.) Vermerken Sie in Ihrer schriftlichen Ausarbeitung, wer aus Ihrem 2er- oder 3er-Team den Quelltext hochgeladen hat. Ohne diesen Vermerk korrigieren wir Ihre PABS-Einreichungen nicht! Aufgabe 1 4 Punkte Onkel Dagobert möchte seinen Geldspeicher in weihnachtlichem Glanz erstrahlen lassen und hat dafür n Leuchtsterne mit Koordinaten {(x1 , y1 ), (x2 , y2 ), . . . , (xn , yn )} auf der Fassade montiert. Um Kosten zu sparen, möchte er die Stromkabel so kurz wie möglich halten. Er plant eine vertikale Hauptleitung, von der horizontale Leitungen zu den einzelnen Sternen abzweigen. Schlagen Sie einen Algorithmus vor, welcher die x-Koordinate der Hauptleitung einer Lösung mit insgesamt kürzester Leitungslänge zurückgibt, und begründen Sie, warum der Algorithmus korrekt ist. Aufgabe 2 3 + 5 + 8 = 16 Punkte In dieser Aufgabe sollen verschiedene Sortieralgorithmen programmiert und experimentell verglichen werden. Implementieren Sie alle geforderten Methoden sowie gegebenenfalls zusätzliche Hilfsmethoden in einer Java-Klasse Sortierverfahren in einem Paket sortierverfahren. a) Programmieren Sie einen Algorithmus in Java, der eine Folge von n ganzen Zahlen aus dem Intervall [0, k] in der Laufzeit O(n + k) sortiert. Implementieren Sie dafür die Methode public static void linearSort(int[] a, int k) . b) Programmieren Sie einen Sortieralgorithmus in Java, der für (Teil-)Felder ab einer bestimmten Anzahl t von Elementen QuickSort verwendet und für (Teil-)Felder mit weniger als t Elementen InsertionSort ausführt. Implementieren Sie dafür eine Methode public static void combinedSort(int[] a, int t) 1 Algorithmen und Datenstrukturen c) Testen Sie die Methoden linearSort, combinedSort und easySort (aus Übung 2) für zufällig generierte Folgen der Größe 100.000 · a für a = 1, 2, . . . , 100 sowohl (i) für ganze Zahlen im Wertebereich [0, 10.000] als auch (ii) für ganze Zahlen im Wertebereich [0, 10.000.000], und halten Sie jeweils die Laufzeit fest. Wenn einer Ihrer Algorithmen mehr als zehn Sekunden für eine Folge braucht, müssen Sie keine größeren Folgen mit demselben Algorithmus sortieren. Experimentieren Sie bei der Methode combinedSort auch mit verschiedenen Werten für den Parameter t. Für welchen Wert erzielen Sie die beste Laufzeit? Stellen Sie die Ergebnisse Ihrer Tests in einem Diagramm für den Wertebereich (i) und einem zweiten Diagramm für den Wertebereich (ii) dar (z.B. mit gnuplot oder Excel), die für linearSort und easySort je eine Laufzeitkurve und für combinedSort drei Laufzeitkurven für verschiedene Werte für den Parameter t enthalten. Auf der x-Achse soll die Größe der Folge aufgetragen sein und auf der y-Achse die benötigte Zeit. Vermelden Sie die Einheit Ihrer Zeitmessung, Betriebssystem, Taktfrequenz und die Größe des Hauptspeichers Ihres Computers. Diskutieren Sie kurz Ihre Beobachtungen. Welche Gründe gibt es für die Ergebnisse? 2 /Lehrstuhl für Informatik I