Datenstrukturen und Algorithmen Funke/Weiß SS 2012 Institut für Formale Methoden der Informatik Universität Stuttgart http://www.fmi.informatik.uni-stuttgart.de/alg Übungsblatt 2 Abgabe: 25.April 2011; 23:59 Uhr Übersicht O-Notation: • O (f (n)) = {g : N → R; ∃c > 0, n0 ∈ N sodass ∀n ≥ n0 : |g(n)| ≤ c · |f (n)|} • o(f (n)) = {g : N → R; ∀c > 0 ∃n0 ∈ N sodass ∀n ≥ n0 : |g(n)| ≤ c · |f (n)|} • Ω(f (n)) = {g : N → R; ∃c > 0, n0 ∈ N sodass ∀n ≥ n0 : |g(n)| ≥ c · |f (n)|} • ω(f (n)) = {g : N → R; ∀c > 0 ∃n0 ∈ N sodass ∀n ≥ n0 : |g(n)| ≥ c · |f (n)|} • Θ(f (n)) = O (f (n)) ∩ Ω(f (n)) Informell: • g ∈ O (f (n)) heißt: “g wächst asymptotisch höchstens so schnell wie f” • g ∈ o(f (n)) heißt: “g wächst asymptotisch echt langsamer als f” • g ∈ Ω(f (n)) heißt: “g wächst asymptotisch mindestens so schnell wie f” • g ∈ ω(f (n)) heißt: “g wächst asymptotisch echt schneller als f” • g ∈ Θ(f (n)) heißt: “g und f verhalten sich asymptotisch gleich” Beispiel: b(n) = n2 , c(n) = n, d(n) = 0.5 · n2 − 10 · n Es gilt: • b(n) ∈ O (b(n)), trivial mit c = 1, n0 = 1 • b(n) ∈ O (d(n)), z.B. mit c = 4, n0 = 40 • d(n) ∈ O (b(n)), trivial • c(n) ∈ o(b(n)), für n0 = d1/ce + 1 • d(n) ∈ / o(b(n)), da für c > 2 immer ein n0 existiert, sodass für n ≥ n0 : d(n) > c · b(n) • b(n) ∈ Ω(c(n)), trivial mit c = 1, n0 = 1 • b(n) ∈ ω(c(n)), trivial mit c = 1, n0 = 1 • b(n) ∈ Ω(d(n)), für c = 1, n0 = 1 • d(n) ∈ Ω(b(n)), für c = 4, n0 = 40 • d(n) ∈ Θ(b(n)) und b(n) ∈ Θ(d(n)) Problem 1 (5 P.) Zeigen Sie: 1. Für beliebige Funktionen f, g, h, i : N → R mit f ∈ O (g) und h ∈ O (i) gilt: (a) f (n) + h(n) ∈ O (max(|g(n)|, |i(n)|)). (b) f (n) · h(n) ∈ O (g(n) · i(n)). 2. Seien f, g, h : N → R mit f ∈ O (g) und g ∈ O (h). Dann ist auch f ∈ O (h). 3. Seien f, g : N → R mit g(n) 6= 0 für alle n. Dann gilt: f (n) < ∞. (a) f ∈ O (g) genau dann, wenn lim sup g(n) n→∞ (b) f ∈ o(g) genau dann, wenn lim n→∞ f (n) = 0. g(n) 4. Für a, b ∈ R, a, b > 0 gilt an ∈ o(bn ) genau dann, wenn a < b. 5. Sei f ein Polynom vom Grad k > 0. Dann gilt: (a) f (n) ∈ Θ(nk ). (b) Für l > k gilt f (n) ∈ o(nl ). (c) Für l < k gilt f (n) ∈ ω(nl ). (d) Für a > 1 gilt f (n) ∈ o(an ). (e) Für a > 1 gilt f (n) ∈ ω(loga n). Hinweis: Verwenden Sie für Ihre Beweise möglichst nur die Definitionen von O etc. und versuchen Sie formal korrekt zu argumentieren! Für die Abgabe können Sie auch Ihre handschriftliche Lösung einscannen. Der Limes superior ist definiert als lim sup xn := lim sup xm . n→∞ n→∞ m≥n Problem 2 (2 P.) Sind die folgenden Aussagen wahr oder falsch? Beweisen oder widerlegen Sie sie. 1. f ∈ o(g) impliziert f ∈ / Ω(g). 2. f ∈ o(g) genau dann, wenn f ∈ / Ω(g). 3. f ∈ o(g) genau dann, wenn f ∈ O (g) und f ∈ / Ω(g). 4. Seien f und g Polynome. Dann gilt f ∈ o(g) genau dann, wenn f ∈ / Ω(g). Problem 3 (2 P.) Betrachten Sie folgende Funktionen und ordnen Sie sie gemäß ihrem asymptotischen Verhalten aufsteigend an: n a(n) = 3 · n − 12 , b(n) = n log n, c(n) = 7, e(n) = 2n , f (n) = n27 , g(n) = log(n4 ). Problem 4 (2 P.) Geben Sie bestmögliche obere Schranken für die Laufzeit (in O-Notation, in Abhängigkeit von n) der folgenden Routinen an. f1(n) { sum=0 for i=1 to n for j=1 to n sum=sum+1 return sum } f2(n) { sum=0 for i=1 to n for j=i to n sum=sum+1 return sum } f3(n) { sum=0 for i=1 to 1000*n for j=1 to 1000 sum=sum+1 return sum } f4(n) { sum=0 for i=1 to n sum=sum+1 if (n>1) sum=sum+f4(n-1) return sum } f5(n) { sum=0 for i=1 to 99999 sum=sum+1 return sum } f6(n) { if (n>=2) return f6(n/2)+1 else return 1 } Problem 5 (4+1 P.) a) Implementieren Sie Mergesort analog zu Blatt 1 Problem 2+3. b) Geben Sie wieder die Laufzeiten für das Sortieren von n = 10000, 20000, . . . , 640000 Zahlen an. Verwenden Sie dazu wieder die zahlen.txt aus Blatt 0. Hinweis: Erweitern Sie ihr Framework aus Blatt 1 um möglichst viel Code wiederverwenden zu können. Sollte Ihre Zeitmessung zu ungenau sein, empfiehlt es sich mehr als einmal zu sortieren und die gesamte Ausführungszeit zu messen.