Informatik Bachelor 1. Semester WS 2014/15 Prof. Dr. Wolfgang Schramm Algorithmen und Datenstrukturen (ADS)
Übungsblatt 3 Ausgabe: 6.11.2014 1
Übungsblatt 3
Ausgabe: 6.11.2014Abgabe: 14.11.2014
Hinweise: -‐ Die Abnahme der Übungen gilt als Prüfungsleistung. Bei einer Verhinderung durch Krankheit ist eine ärztliche Bescheinigung der Arbeitsunfähigkeit vorzu-‐
legen.
-‐ Zur Abnahme müssen die Ergebnisse (Pseudocode, Stichpunkte) – soweit nichts anderes angegeben ist – schriftlich (ausgedruckt) vorliegen.
Aufgabe 1: Suchfunktionen 30 Punkte
Schreiben Sie vier Suchfunktionen, die einen Wert in einem Array suchen und den Index des Wertes (falls vorhanden) oder -‐1 (falls nicht vorhanden) zurückliefern:
a) Lineare Suche, wobei immer das gesamte Array durchsucht wird und der Index des letz-‐
ten gefundenen Wertes zurückgegeben wird.
b) Lineare Suche, wobei die Funktion zurückgekehrt, sobald der Wert gefunden wurde.
c) Binäre Suche in der rekursiven Fassung.
d) Binäre Suche in der iterativen Fassung.
Um Ihre Funktionen testen zu können, schreiben Sie
e) ein Hauptprogramm mit folgenden Eigenschaften:
− ein Array wird angelegt und mit Werten gefüllt,
− ein Wert wird eingelesen und in dem Array gesucht, rufen Sie nacheinander alle Suchfunktionen auf.
Denken Sie an Kommentare (in Englisch)!
Anmerkung:
Die lineare Suche gemäß a) wird z.B. benötigt, wenn Sie bei mehrfach vorkommenden Werten den Index des letzten haben möchten. Die lineare Suche nach b) liefert demgegenüber den ersten Index des gesuchten Wertes.
Aufgabe 2: Komplexitätsexperiment 30 Punkte
Ändern Sie die Suchfunktionen aus Aufgabe 1 so um, dass Sie die Anzahl der Schlüssel-‐
Vergleiche beim Suchen zählen können. Die Funktionen sollen zu diesem Zweck nicht den Index des gefundenen Elements, sondern die Anzahl der Vergleiche zurückliefern.
Ermitteln Sie die Anzahl der Schlüssel-‐Vergleiche
Übungsblatt 3 Ausgabe: 6.11.2014
2
− bei erfolgreicher und erfolgloser Suche
− für alle vier Suchfunktionen
− für drei verschiedene Array-‐Größen (Länge jeweils verdoppelt, z.B. 1024 – 2048 – 4096 Elemente)
Tragen Sie die Ergebnisse in einer Tabelle ein, z.B.
Größe des Arrays
Suchverfahren 1024 2048 4096
erfolgreich Linear (erster Treffer) Linear (letzter Treffer)
Binär iterativ
Binär rekursiv
erfolglos Linear (erster Treffer) Linear (letzter Treffer)
Binär iterativ
Binär rekursiv
und diskutieren Sie die Ergebnisse: welchen Einfluss hat die Array-‐Größe oder die Strategie?
Können Sie die Zahlen erklären, gibt es ggf. Abweichungen gegenüber von Ihnen erwarteten Werten?
Um eine statistisch signifikante Aussage für erfolgreiche Suche zu erhalten, müssen Sie die Suche mehrmals durchführen und anschließend den Mittelwert bestimmen. Damit die Suche erfolgreich ist, finden Sie unten Hinweise zur Belegung des Arrays und zur Wahl der Schlüssel.
− Suchen Sie jeweils mindestens 100 mal
− mit zufällig gewählten Schlüsseln
Wie sieht es bei der erfolglosen Suche, aus? Sie können die gesuchten Werte wie bei der er-‐
folgreichen Suche bestimmen (wie müssten Sie das Experiment ändern?); aber ist das Experi-‐
ment überhaupt nötig, oder können Sie die gesuchten Werte auch errechnen?
Hinweise:
− Kopieren Sie Ihre Programme aus Aufgabe 1, bevor Sie sie für diese Aufgabe verändern!
− Dokumentieren Sie Hauptprogramm und die Suchfunktionen mit sinnvollen (englischen) Kommentaren.
− Für das Experiment „erfolgreiche Suche“ müssen Sie (1) ein Array mit sortierten Zahlen definieren, und
(2) alle Zahlen aus dem Array mit der gleichen Wahrscheinlichkeit suchen, sowie (3) immer erfolgreich suchen.
Dies können Sie einfach erreichen, indem Sie
− für das sortiertes Array die Array-‐Elemente mit Index als Wert belegen, d.h.
for (int i = 0; i<data.length; i++) {data[i] = i;};
(ein automatisches Belegen ist bei einem 1024 Elemente großen Array natürlich sinnvoll),
Übungsblatt 3 Ausgabe: 6.11.2014
3
− oder als Schlüssel zufällig eine Zahl aus dem Bereich 0 bis N-‐1 (einschließlich) wäh-‐
len;
zufällige ganzzahlige Werte im Bereich 0 bis N-‐1 können Sie in Java erzeugen mit der Funktion:
(int) Math.floor(Math.random()*N)
Aufgabe 3: Insertion Sort 30 Punkte
Programmieren Sie den Insertion Sort und dann eine Variante des in der Vorlesung vorgestell-‐
ten Insertion Sort. Diese Variante unterscheidet sich von der auf dem Folienskript dadurch, dass die Einfügeposition für das aktuelle Element mittels binärer Suche im bereits sortierten Teil der Folge gesucht wird.
Protokollieren Sie
den Aufwand, indem sie die Anzahl der Vergleiche und die Anzahl der Vertauschungen zählen.
Zu Testzwecken ist es durchaus sinnvoll
die schrittweise Veränderung der Sortierfolge auszugeben, d.h. nach jedem Durchlauf den aktuellen Zustand der Sortierfolge.
Stellen Sie die Ergebnisse der beiden Insertion Sort Varianten ähnlich wie in Aufgabe 1 für Arrays der Größe 1024, 2048 und 4096 gegenüber.
Hinweis:
Füllen Sie die großen Arrays mit „zufälligen“ Werten aus dem Bereich von 1 bis N ddurch Verwendung der Funktion:
(int) Math.floor(Math.random()*N)
Aufgabe 4: Shaker Sort 30 Punkte
Als weitere Verbesserung des Bubble Sort wurde der Shaker Sort Algorithmus entwickelt. Kurz beschrieben, arbeitet er wie folgt:
Die prinzipielle Arbeitsweise ist die des Bubble Sort, nur ändert sich die Richtung aufeinander-‐
folgender Durchläufe. D.h. einmal läuft man von links nach rechts und vertauscht die Elemen-‐
te. Beim nächsten Mal läuft man von rechts nach links und vertauscht die Elemente.
Übungsblatt 3 Ausgabe: 6.11.2014
4
Beispiel:
F0 = 44 55 12 42 94 18 6 67 (Ausgangsfolge)
F1 = 44 12 42 55 18 6 67 94 (nach dem 1. Durchlauf) F2 = 6 44 12 42 55 18 67 94 (nach dem 2. Durchlauf) F3 = 6 12 42 44 18 55 67 94 (nach dem 3. Durchlauf) F4 = 6 12 18 42 44 55 67 94 (nach dem 4. Durchlauf)
Der 1. Durchlauf erfolgt von unten nach oben (links nach rechts), der 2. Durchlauf erfolgt von rechts nach links (oben nach unten) etc. Die Elemente, die vertauscht werden müssen sind jeweils unterstrichen.
Schreiben Sie ein Programm mit einer Methode ShakerSort und protokollieren Sie die Arbeits-‐
schritte und den Aufwand wie in Aufgabe 3.
Protokollieren Sie
den Aufwand wie in Aufgabe 3, indem Sie die Anzahl der Vergleiche und die Anzahl der Vertauschungen zählen.
die schrittweise Veränderung der Sortierfolge. D.h. bei einer Vertauschung soll die Sortierfolge, unter besonderer Kennzeichnung der vertauschten Elemente ausge-‐
geben werden. Und nach jedem Durchlauf soll der aktuelle Zustand der Sortierfolge ausgegeben werden.