f ist höchstens von der Größenordnung g
in Zeichen: f O(g)
falls
n0, c
N existieren mit
n
n0 : f (n)
c · g(n) .
Statt f O(g) sagt man auch f = O(g)
Wegen des konstanten Faktors c ist die exakte Festlegung
eines Schrittes nicht erforderlich.
Beispiel:
Sei f (n) = 31n + 12n 2.
Dann ist
f O(n 2)
Natürlich gilt auch:
f O(n 7)
Die wesentlichen Klassen
log n | n | n · log n | n 2 | n 3 | n 4 | ... | 2n | 3n | n! |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
|||
binäre | lineare | schlaues | dummes | Gleichungs- | alle | alle | |||
Suche | Suche | Sortieren | Sortieren | system | Teil- | Permu- | |||
lösen | mengen | tationen |
n = | 10 | 20 | 30 | 40 | 50 | 60 |
n | 10 ![]() |
20 ![]() |
30 ![]() |
40 ![]() |
50 ![]() |
60 ![]() |
n 2 | 100 ![]() |
400 ![]() |
900 ![]() |
1.6 ms | 2.5 ms | 3.6 ms |
n 3 | 1 ms | 8 ms | 27 ms | 64 ms | 125 ms | 216 ms |
2n | 1 ms | 1 s | 18 min | 13 Tage | 36 J | 366 Jh |
3n | 59 ms | 58 min | 6.5 J | 3855 Jh | 108 Jh | 1013 Jh |
n! | 3.62 s | 771 Jh | 1016 Jh | 1032 Jh | 1049 Jh | 1066 Jh |
Wächst n um 1 , so wächst 2n um den Faktor 2 .Analoge Aussagen sind möglich bzgl. Speicherplatz.
Wächst n um 10 , so wächst 2n um den Faktor 210 = 1024 .
Ein 1000-mal schnellerer Computer kann eine um 10 Daten größere Eingabe in derselben Zeit bearbeiten.
Aussagen über Laufzeit und Platzbedarf beziehen sich auf
![]() |
günstigster Fall |
![]() |
ungünstigster Fall |
![]() |
im Mittel |
Beispiel:
Minimumsuche in einem Array der Länge n
min = a[0]; for (i = 1; i < n; i++){ if(a[i] < min) min = a[i]; }
Laufzeit O(n) für | best case |
worst case | |
average case. |
Beispiele:
for (i = 0; i < k; i++) { for (i = 0, i < k; i++) { for (j = 0; j < k; j++) { for (j = 0; j < k; j++) { brett[i][j] = 0; if (a[i] == a[j]) treffer = true; } } } }
k 2 Schritte für k 2 Daten |
![]() ![]() ![]() ![]() |
k 2 Schritte für k Daten |
![]() |
![]() |
Beispiel:
Lineare Suche im Array
i = 0; while (i < n) && (a[i] != x) { i++; }
Laufzeit: | best case | 1 Schritt | ![]() |
O(1) |
worst case | n Schritte | ![]() |
O(n) | |
average case | ![]() |
![]() |
O(n) |
Annahme für den average case:
Es liegt Permutation der Zahlen von 1 bis n vor.
Dann ist die mittlere Anzahl
= ![]() ![]() |
![]() |
![]() |
Beispiel:
Suche 0 in einem Array, bestehend aus Nullen und Einsen.
Laufzeit: | best case | 1 Schritt | ![]() |
O(1) |
worst case | n Schritte | ![]() |
O(n) | |
average case |
![]() ![]() ![]() |
![]() |
O(1) |
Obacht:
Alle Laufzeitangaben beziehen sich jeweils auf einen konkreten Algorithmus A (für ein Problem P ) = obere Schranke für Problem P .
Eine Aussage darüber, wie viele Schritte jeder Algorithmus für ein Problem P mindestens durchlaufen muss, nennt man untere Schranke für Problem P .
Beispiel: naives Pattern-Matching
char[] s = new char[N]; // Zeichenkette char[] p = new char[M]; // Pattern
Frage: Taucht Pattern p in Zeichenkette s auf?
for (i = 0; i <= N - M; i++) { // Index in Zeichenkette for (j = 0; (j < M) && (p[j] == s[i+j]); j++); // Index im Pattern if (j == M) break; // Erfolg }
Laufzeit best case: | O(1) | |||
Laufzeit worst case: | (N - M + 1) · M Vergleiche für | s | = | AAA...AB |
p | = | A...AB |
Sei n die Summe der Buchstaben in Pattern p und String s . Sei M = x · n und N = (1 - x) · n für 0 < x < 1 .
Gesucht wird x , welches ((1 - x) · n - x · n + 1) · x · n = (n 2 + n) · x - 2n 2 · x 2 maximiert.
Bilde 1. Ableitung nach x und setze auf 0: 0 = n 2 + n - 4n 2 · x
Beispiel:
Die Laufzeit von fib(n) beträgt:
f (n) =
Gesucht ist also ein , so dass für große n gilt:
=
+
+ 1
Teile durch
:
für n = 20 ist | 1.62n |
![]() |
2n |
![]() |