1. Motivation 1.1 Fallstudie: Sortieralgorithmen 1.2 Fallstudie: Selektionsalgorithmen 2. Laufzeit von Algorithmen 2.1 Grundlagen 2.2 3. Paradigmen des Algorithmenentwurfs 3.1 Dynamisches Programmieren 3.2 Divide & Conquer Algorithmen 3.3 Greedy-Algorithmen 4. Ausgewählte Datenstrukturen 5. Anwendungsgebiet: Algorithmische Geometrie 6. Randomisierte Algorithmen 5/1 relevante Aspekt Beurteilung der Laufzeit einzelner Algorithmen Vergleich unterschiedlicher Algorithmen (/* zur Lösung desselben Problems */) Sortieralgorithmus BubbleSort InsertionSort HeapSort Wc-time(A,n) 1/2(n(n-1)) 1/2(n(n-1)) 3(n-1) log (n) 5/2
relevante Aspekt Beurteilung der Laufzeit einzelner Algorithmen Vergleich unterschiedlicher Algorithmen (/* zur Lösung desselben Problems */) Sortieralgorithmus BubbleSort InsertionSort HeapSort Wc-time(A,n) 1/2(n(n-1)) 1/2(n(n-1)) 3(n-1) log (n) Normalisierung n 2 n 2 n log(n) 5/3 Begriff: obere Schranke g(n) ist eine obere Schranke für f(n) gdw. es gibt c > 0 und n o 0, so daß für alle n n 0 gilt: f(n) c*g(n) f(n) wächst asymptotisch höchstens so schnell wie g(n) f(n) O(g(n)) 5/4
Beispiele: obere Schranke einige obere Schranken für f(n) g(n) = n 3 g(n) = n 4 g(n) = n 5... 5/5 Begriff: untere Schranke g(n) ist eine untere Schranke für f(n) gdw. es gibt c > 0 und n o 0, so daß für alle n n 0 gilt: g(n) c*f(n) f(n) wächst asymptotisch mindestens so schnell wie g(n) f(n) Ω(g(n)) Beobachtung: wenn f(n) Ω(g(n)), so g(n) O(f(n)) 5/6
Beispiele: untere Schranke einige untere Schranken für f(n) g(n) = n 3 g(n) = n 2 g(n) = n... 5/7 Begriff: obere und untere Schranke g(n) ist obere und untere Schranke für f(n) gdw. f(n) O(g(n)) und f(n) Ω(g(n)) f(n) wächst asymptotisch genau so schnell wie g(n) f(n) Θ(g(n)) 5/8
Beispiele: obere und untere Schranke g(n) = n 3 ist gleichzeitig obere und untere Schranke für f(n) es sei f(n) = 4n - 1 g(n) = n ist gleichzeitig obere und untere Schranke für f(n) 5/9 Begriff: echte obere Schranke g(n) ist eine echte obere Schranke für f(n) gdw. für jedes c > 0 gibt es n o 0, so daß für alle n n 0 gilt: f(n) c*g(n) mit anderen Worten: lim n f(n)/g(n) = 0 f(n) wächst asymptotisch langsamer als g(n) f(n) o(g(n)) 5/10
Beispiele: echte obere Schranke einige echte obere Schranken für f(n) g(n) = n 3 log(n) g(n) = n 4 g(n) = n 5... 5/11 Begriff: echte untere Schranke g(n) ist eine echte untere Schranke für f(n) gdw. für jedes c > 0 gibt es n o 0, so daß für alle n n 0 gilt: g(n) c*f(n) mit anderen Worten: lim n g(n)/f(n) = 0 f(n) wächst asymptotisch schneller als g(n) f(n) ω(g(n)) 5/12
Beispiele: echte untere Schranke einige echte untere Schranken für f(n) g(n) = n 2 log(n) g(n) = n 2 g(n) = n... 5/13 Arbeitszeit eines Rechners mit 10 6 Op/sec wc-time(a,n) n = 10 n = 20 n = 30 n = 40 n = 50 Θ(n) 0,00001 s 0,00002 s 0,00003 s 0,00004 s 0,00005 s Θ(n 2 ) 0,0001 s 0,0004 s 0,0009 s 0,0016 s 0,0025 s Θ(n 3 ) 0,001 s 0,008 s 0,027 s 0,064 s 0,125 s Θ(n 5 ) 0,1 s 3,2 s 24,3 s 1,7 min 5,2 min Θ(2 n ) 0,001 s 1,0 s 17,9 min 12,7 Tage 35,7 Jahre Θ(3 n ) 0.059 s 58 min 6.5 Jahre 3855 Jahrhunderte 2*10 8 Jahrhunderte 5/14
Problemgröße, die in einer Stunde bewältigt werden kann wc-time(a,n) heute 100-fache Geschwindigkeit 1000-fache Geschwindigkeit Θ(n) N 1 100 N 1 1000 N 1 Θ(n 2 ) N 2 10 N 2 31,6 N 2 Θ(n 3 ) N 3 4,6 N 3 10 N 3 Θ(n 5 ) N 4 2,5 N 4 3,9 N 5 Θ(2 n ) N 5 N 5 + 6,6 N 5 + 9,9 Θ(3 n ) N 6 N 6 + 4,2 N 6 + 6,3 5/15 Grenzen der asymptotischen Notation es seien A und A Algorithmen für dasselbe Problem und es gelte wc-time(a,n) = 10n 3 und wc-time(a,n) = 10000n 2 offenbar gilt: wc-time(a,n) Θ(n 3 ) und wc-time(a,n) Θ(n 2 ) aber wc-time(a,n) < wc-time(a,n) für alle n < 1000... wenn nur Eingaben x mit x < 1000 interessant sind, so sollte Algorithmus A anstelle von Algorithmus A verwendet werden 5/16