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