Lektion
Die Theorie — Big-O-Komplexitäts-Explorer
Big-O ist eine obere Schranke für das Wachstum, keine Zeitmessung. Die Aussage, ein Algorithmus sei O(N²), bedeutet, dass sein Aufwand ab einer bestimmten Eingabegröße unter einem festen Vielfachen von N² bleibt — sie sagt nichts über Sekunden aus und überhaupt nichts über kleine Eingaben.
Was die einzelnen Symbole bedeuten
N- die Eingabegröße — wie viele Elemente dem Algorithmus übergeben werden. Das ist die oben eingestellte Zahl, irgendwo von 2 bis 1.000.000.
f(N)- der tatsächlich bei dieser Größe geleistete Aufwand, gezählt in abstrakten Operationen statt in Sekunden.
c- ein konstanter Faktor, den die Notation verbergen darf. Die Aussage lautet
f(N) ≤ c·g(N); c könnte 2 oder 2000 sein, und genau das ist die Information, die Big-O verwirft. n₀- die Größe, ab der die Schranke gelten muss. Unterhalb von
n₀können die Klassen in beliebiger Reihenfolge liegen; deshalb drängen sich die fünf Zahlen oben bei kleinem N zusammen.
Woher die Formel kommt
- Beginne mit der Aussage, die präzisiert werden muss: Der Aufwand
f(N)wächst schließlich nicht schneller als eine Referenzfunktiong(N). - “Nicht schneller” muss einen konstanten Faktor zulassen, denn das Optimieren einer inneren Schleife ändert nur die Konstante, nicht den Verlauf. Erlaube also einen Faktor:
f(N) ≤ c·g(N). - Und “schließlich” muss kleine Eingaben entschuldigen, bei denen alles passieren kann. Verlange die Ungleichung erst, sobald
N ≥ n₀gilt. Zusammen:f(N) = O(g(N))bedeutet, dass einc > 0und einn₀existieren, sodassf(N) ≤ c·g(N)für jedesN ≥ n₀gilt.
So liest du, was du siehst
Die fünf Zeilen zeigen eine Eingabegröße, angewendet auf fünf Wachstumsklassen mit allen Konstanten auf 1 gesetzt — es handelt sich also um Operationszahlen, nicht um Laufzeiten. Beim Standardwert N = 100 lauten sie 1, 7, 100, 664 und 10,000. Der Logarithmus ist zur Basis 2: log₂ 100 ≈ 6.64, weshalb O(log N) 7 anzeigt und O(N log N) 664 statt 700.
- Setzt voraus
- Dass eine Operation genauso viel kostet wie jede andere und dass die Anzahl exakt gezählt statt gemessen ist. Genau das macht den Vergleich sauber und ebenso abstrakt — Speicherzugriffsmuster, Cache-Verhalten und Festplatte liegen außerhalb dieses Modells, und auf realer Hardware entscheiden sie regelmäßig darüber, welcher von zwei Algorithmen gewinnt.
- Versagt, wenn
- Die Schranke verspricht unterhalb von
n₀nichts, und das lässt sich direkt beobachten: Stellt manN = 2ein, lauten die fünf Klassen1,1,2,2und4— kaum voneinander zu unterscheiden. Die von der Notation garantierte Reihenfolge zeigt sich erst, wenn N groß ist. So kann einO(N²)-Verfahren mit einer kleinen Konstanten einO(N log N)-Verfahren bei jeder Eingabe schlagen, die man in der Praxis tatsächlich jemals hat.
Aufgabe vollständig gelöst
-
Wo sich die Kluft zwischen N log N und N ² auftut 5 Schritte
Bei N = 100 zeigt das Feld 664 für N log N und 10 000 für N² an. Das ist nur ein Faktor von fünfzehn – kaum der Abgrund, den Komplexitätsklassen eigentlich darstellen sollen. Finden Sie heraus, wo sich der Abgrund tatsächlich auftut.
-
Beginnen Sie mit den beiden Zahlen. log₂ 100 ist 6,6439, also ist N log₂ N gleich 664 und N² gleich 10 000.
-
Das Verhältnis zwischen ihnen ist keine Konstante, und genau darum geht es bei Komplexitätsklassen. Teilt man, kürzt sich N einmal heraus und es bleibt N/log N – eine Größe, die unbeschränkt wächst, nur langsam.
-
Bei N = 100 beträgt es 15,1. Das ist zwar spürbar, aber unbeeindruckend: Eine 15-fache Beschleunigung ist etwas, das ein besserer konstanter Faktor bewirken könnte – genau deshalb führen Benchmarks mit kleinen Eingaben in die Irre.
-
Setzen Sie nun eine Million ein. Der Logarithmus hat sich kaum bewegt – von 6,6 auf 19,9, ein Faktor von drei –, während N um das Zehntausendfache gewachsen ist. Das Verhältnis beträgt nun 50 172.
-
Und es kehrt sich nie wieder um. Die Ableitung von N/log N ist für jedes N größer als e positiv, sodass keine Eingabegröße existiert, ab der der quadratische Algorithmus wieder aufholt.
Antwort
Das Werkzeug gibt 664 gegenüber 10 000 bei N = 100 aus. Die Zahl, die man sich merken sollte, ist die andere: Bei einer Million sind dieselben zwei Kurven um 50 172 voneinander entfernt. Komplexitätsklassen sind keine Aussagen über einhundert Elemente, und sie dort zu vergleichen ist der klassische Weg, sich für den falschen Algorithmus zu entscheiden – eine 15-fache Lücke sieht nach etwas aus, das eine schnellere Programmiersprache schließen könnte. Schieben Sie den Regler nach oben und beobachten Sie, wie das Verhältnis mitsteigt. Das ist auch der Grund, warum der Logarithmus in der Praxis so oft ignoriert wird: Er wuchs um den Faktor drei, während die Eingabe um das Zehntausendfache wuchs.
-
Lernpfad
Arbeit zählen, nicht Sekunden
Quellen (1)
- The definition the lesson states, and the case for using it carefully: D. E. Knuth, “Big Omicron and big Omega and big Theta.” ACM SIGACT News 8, 18–24, 1976.