1. Aufgabe 2. Aufgabe - fbi.h

Werbung
Algorithmik
Prof. Dr. Steffen Lange
2. Übungsblatt
1. Aufgabe
Modifizieren Sie den in der Vorlesung vorgestellten Divide & Conquer –Verfahren,
mit dem das Element vom Rank k in einer Folge von n verschiedenen Zahlen
bestimmt werden kann. Im Unterschied zur der in der Vorlesung vorgestellten
Variante soll nun die gegebene Folge in Gruppen von drei Elementen(/* anstelle
von fünf Elementen wie in der Vorlesung */) zerlegt werden, um den Median
der Mediane zu bestimmen.
(a) Illustrieren Sie die Arbeitsweise des Verfahrens, um das Element vom
Rank 3 in der folgenden Folge zu bestimmen: 2, 4, 1, 5, 7, 3, 8, 9, 6
(b) Geben Sie eine Rekursionsgleichung an, um die Anzahl der von diesem modifizierten Verfahren durchgeführten Vergleichsoperation abzuschätzen.
Hinweis: Um die Lösung der Rekursionsgleichung kümmern wir uns in der
Übung.
2. Aufgabe
Bestimmen Sie möglichst gute obere Schranken für die worst-case-, best-case und
average-case Komplexität des Bubblesort-Algorithmus in Abhängigkeit von n,
wobei n die Anzahl der Elemente in der zu sortierenden Liste bezeichnet.
Das folgende C++ Programm implemeniert den Bubblesort-Algorithmus (/* ein
wenig geschickter als die in der Vorlesung vorgestellte Version */):
int a[n];
bool flag = true;
int help;
while( flag == true ) {
flag = false;
for( int i = 0; i < n-1; ++i ) {
if(a[i] > a[i+1]) {
flag = true;
help = a[i];
a[i] = a[i+1];
a[i+1] = help;
}
}
}
1
Hinweis: Bei Ihrer Analyse genügt es, wenn Sie die Anzahl der Vergleiche von
Array-Elementen berücksichtigen.
Hinweis: Für die Bestimmung der average-case Komplexität des BubblesortAlgorithmus ist es vernünftig, nach einer Klasseneinteilung zu suchen. Hilfreich
ist es diejenigen Listen der Länge n in einer Klasse Km zusammenzufassen, für
die garantiert ist, daß die While–Schleife mindestens m–mal ausgeführt wird.
Versuchen Sie eine Klasseneinteilung und eine Formel, mit der die average-case
Komplexität des Bubblesort-Algorithmus nach unten abgeschätzt werden kann,
anzugeben! Die weiteren Details diskutieren wir dann in der Übung.
3. Aufgabe
Welche der folgenden Aussagen sind richtig, welche sind falsch? Begründen Sie
Ihre Antwort.
(i) f (n) ∈ O(n), wobei gilt: f (n) = 2 für alle n ∈ IN
(ii) f (n) ∈ O(2n−1 ), wobei gilt: f (n) = 2n für alle n ∈ IN
√
(iii) f (n) ∈ Ω(n), wobei gilt: f (n) = 22 · n2 für alle n ∈ IN
(iv) f (n) ∈ Θ(n2 ), wobei gilt: f (n) = 8 · n3 + 4 · n2 + 83 für alle n ∈ IN
(v) f (n) ∈ O(n), wobei gilt: f (n) = log n für alle n ∈ IN
4. Aufgabe
Es seien Algorithmen A1 und A2 zur Lösung ein und desselben Problems gegeben. Ferner sei bekannt, daß sich die Laufzeit dieser Algorithmen wie folgt in
Abhängigkeit von der Problemgröße bestimmt:
• time(A1 , n) = 13n3 − 7n2 + 18n
• time(A2 , n) = 2n4 − 15n2 + 18n log(n)
Welche dieser beiden Algorithmen ist der effizientere? Begründen Sie Ihre Aussage, in dem Sie geeignete obere und untere Schranken für die Laufzeit der
beiden Algorithmen bestimmen.
Viel Erfolg bei der Bearbeitung der Aufgaben!
2
Herunterladen