Algorithmen und Datenstrukturen Hochschule RheinMain
Sommersemester 2014 Prof. Dr. Steffen Reith
6. Übungsblatt
Aufgabe 1 (Mischen)
Algorithmus 1 mischt zwei sortierte Zahlenfolgen in eine dritte sortierte Zahlenfolge.
Data: Zwei sortierte FolgenF1 und F2
Result: Eine sortierte FolgeF, die die Elemente vonF1 und F2 enthält F =leere Folge;
while((F1 nicht leer) && (F2 nicht leer))do
if (Anfangselement von F1 ist kleiner als Anfangselement vonF2) then t=Anfangselement von F1;
lösche Anfangselement von F1; else
t=Anfangselement von F2; lösche Anfangselement von F2; end
hänget anF an;
end
hänge eine evtl. verbliebene Restfolge anF an;
returnF;
Algorithm 1: merge-Operation i) Entwerfen Sie ein Struktogramm für die Mischoperation.
ii) Entwerfen Sie eine Implementierung von Algorithmus 1, wobei die FolgenF1 und F2 als Array dargestellt werden sollen.
iii) Entwerfen Sie ein Testprogramm mit dessen Hilfe Sie Ihre Implementierung testen können.
Aufgabe 2 (Merge Sort)
Mit Hilfe der merge-Operation aus Aufgabe 1 können wir nun den rekursiven Mer- ge Sort formulieren. Als Abbruchbedingung verwenden wir, dass einelementige Folgen automatisch schon sortiert sind.
Data: Eine unsortierte FolgeF
Result: Eine sortierte FolgeF′, die alle Elemente von F enthält if ( F hat genau ein Element ) then
return F;
else
halbiere F inF1 und F2; F1=Merge Sort(F1);
F2=Merge Sort(F2);
return merge(F1,F2);
end
Algorithm 2: Merge Sort
Zur Lösung dieser Aufgabe sind die folgenden Punkte zu bearbeiten:
i) Schreiben Sie eine main-Funktion, die 1000 (pseudo)zufälligen Zahlen aus dem Bereich0. . .99999berechnet und ausgibt, dann mit Merge Sort sortiert und auch das sortierte Feld ausgibt.
ii) Die Rekursion in Algorithmus 2 bricht ab, wenn die zu sortierende Folge nur noch aus einem Element besteht. Modifizieren Sie Ihre Implementation so, dass die Rekursion schon bei Folgen der Länge ≤ 3 abbricht und dann die Folge mit höchstens 3 Elementen direkt sortiert.
iii) Bei einer C-Implementierung kann man mitint gettimeofday(struct timeval
*tp, struct timezone *tzp); (oder auch durch andere Systemaufrufe) die ak- tuelle Systemzeit direkt bestimmen. Für Ruby gibt es eine Time Class die einen ähnlichen Zugriff ermöglicht. Modifizieren Sie Ihre Implementation von Merge Sort so, dass Sie messen können, wie viel Zeit der reine Sortiervorgang benötigt (also ohne Erzeugung der Zufallszahlen und Ausgabe!).
Sie können auch den (gleichen!) Sortiervorgang in einer Schleifeoftausführen und die Zeit einfach mit einer Uhr von Hand stoppen.
(a) Erstellen Sie eine Tabelle, die die Sortierzeiten für10000,20000,40000,80000 und 100000Pseudozufallszahlen enthält.
(b) Modifizieren Sie Ihren Selection Sort aus der letzten Übungsaufgabe so, dass Sie messen können wieviel Zeit der reine Sortiervorgang benötigt. Erstel- len Sie eine Tabelle, die die Sortierzeiten für 10000, 20000, 40000, 80000 und 100000 Pseudozufallszahlen enthält. Welche Rechenzeit erwarten Sie für 200000,400000und 800000 Zufallszahlen?
Aufgabe 3 (Rekursion)
Sei i ≥ 1. Mit si werden in dieser Aufgabe Strings bezeichnet. Wir legen fest, dass s1 =„a“unds2=„b“ gilt. Neue Strings werden durch die Konkatenation, symbolisiert durch⊙, von Strings (≜Aneinanderhängen) wie folgt gebildet:
sn+2=sn+1⊙sn, wobein >0.
Beispiel: „Wies“ ⊙„baden“ =„Wiesbaden“.
i) Bestimmen Sie die Strings s3,s4 und s5 von Hand.
ii) Entwickeln Sie eine Funktion / Methode mit dem Argument i FString, die si
berechnet (Rückgabewert).
iii) Entwerfen Sie ein rekursives Programm, dass eine Zahl n ∈ N einliest und dann den Stringsn ausgibt.
Hinweis: Wenn Sie C programmieren, dann achten Sie auf eine korrekte Verwendung undFreigabe von dynamisch allokiertem Speicher, d.h. nicht mehr benötigter Speicher soll nicht erst zum Ende frei gegeben werden. Dabei ist es hilfreich nach dem Prinzip
„Die Funktion, die Speicher allokiert gibt ihn auch wieder frei“ zu arbeiten.
Die Abnahme der Lösungen zu diesen Aufgaben findet in der KW 21 ab dem 22.
Mai 2014 nach der Vorlesung statt. Die Termine für die Studenten der „Wirt- schaftsinformatik“ gibt Herr Werntges bekannt.
2
Weitere Übungsaufgaben zur O-Notation
• Es seien die folgenden Funktionen definiert:
f = 5 + 3·n g = 4·82+ 7·n h = 210·log4(n) k = n
2+13·n4+2·n n2
Füllen Sie die leeren Kästchen mit dem korrekten Symbol aus der Menge{=,̸=,∈ ,̸∈,⊆,̸⊆}
n2 O(f) f·g·h·k O(2n)
g·g O(k) O(O(h3)) O(h)
O(g) O(3·h) O(f·g) O(n2) O(O(f·f)) O(n2)
O(3·k·h) O(f·g) O(3·k−k) O(n2)
h O(h3)
3