am 17. Juli 2009
Als ich in der Ideenschmiede den Vorschlag O-Notation gelesen habe, habe ich es fast nicht glauben können und schon vermutet, ich kenne ein PHP Feature namens O-Notation noch nicht. Doch es handelt sich wirklich um die mathematische O-Notation (oder Landau-Notation), die mit diesem Artikel auf Nils Wunsch hin den Blog auch mit etwas theoretischem Background erweitern soll.
Also was ist dieses
nun?
Doch keine Angst, es ist wesentlich einfacher als es aussieht. Die O-Notation gibt an, wie komplex ein Algorithmus oder Codestück ist und wie es skaliert.
Ein klassisches Beispiel ist der BubbleSort Algorithmus, der ein Array von Zahlen sortiert. Er hat eine Komplexität von
. Das heißt, wenn das zu sortierende Array eine Größe n hat, dann benötigt BubbleSort nicht mehr als
Vergleichsschritte im Worst-Case, um das Array zu sortieren. Gezählt werden hier die Vergleichsschritte, da diese am meisten Ressourcen benötigen (im Gegensatz zum Schreiben/Lesen des Arrays) und damit die Skalierung am stärksten beeinflussen. Der derzeit beste vergleichsbasierte Sortieralgorithmus hat übrigens eine Komplexität von
. Wenn jemand etwas Schnelleres programmieren kann (und den bestehenden Beweis dazu widerlegen kann), veröffentlicht Nils sicher gerne einen Artikel im Blog
Zusätzlich vereinfacht die O-Notation die Angabe der Komplexität. Nehmen wir einmal an, ein Algorithmus benötigt
Vergleichsschritte. Die O-Notation beschreibt dabei die Skalierung (in der theoretischen Informatik Wachstum genannt) und betrachtet daher nur die am schnellsten wachsenden Bereiche. So kann auch bei
Vergleichen von
gesprochen werden, da bei einem großen n das
am schnellsten wächst und somit der Rest nicht mehr ins Gewicht fällt. Die Konstanten, die weggelassen werden können, haben in der Realität aber sehr wohl eine Bedeutung, da z.B. ein +1000000 Vergleiche (fällt in der O-Notation als Konstante weg) in der praktischen Welt trotzdem zu Buche schlägt.
Natürlich kann in dem O alles mögliche stehen und so gibt es natürlich auch
und viele mehr. Die beste Komplexität ist
. Dies bedeutet, dass der Algorithmus in konstanter Zeit läuft, egal wie groß das n ist bzw. wie viele Elemente durch den Algorithmus behandelt werden. Beispiel wäre hierzu eine Suchfunktion mit der Hilfe einer Hashtabelle. Egal wie viele Elemente die Hashtabelle beinhaltet, für die Suche muss nur einmal die Hashfunktion berechnet und sonst keine Elemente mehr verglichen werden.
Vielen InformatikstudentInnen liegt vermutlich noch der Satz des Professors “Welche Komplexität hat dieser Algorithmus, schreiben Sie das in der O-Notation einmal auf” im Nacken. Der Grund dafür ist jedoch nicht die Schwierigkeit der O-Notation an sich, sondern der Hintergrund. Um die O-Notation angeben zu können, muss man den Algorithmus verstehen und seine Komplexität abschätzen können. Leider denken viele Programmierer nicht über ihren eigenen Code nach und so werden einzelne Algorithmen oft zum schlecht skalierenden Flaschenhals. Ich bin der Meinung, dass auch in Zeiten von Profilern der Code mit Köpfchen erstellt werden sollte. Es kann also nicht schaden, wichtige Algorithmen ein paar Minuten zu analysieren und sich einmal zu überlegen, welche Komplexität denn wirklich dahinter steckt.
Warum brauche ich nun dieses komische
?
- Man kann vergleichen und verglichen werden. Im wissenschaftlichen Bereich ist es üblich, die Komplexität von neu entwickelten Algorithmen anzugeben um die Algorithmen vergleichbarer zu machen.
- Man befasst sich mit eigenen Algorithmen oder Abläufen und entdeckt so Fehler oder Verbesserungen
- Man lernt Einschätzungen zur Skalierung zu machen
- Man steht nicht unwissend da, wenn jemand einmal die O-Notation erwähnen sollte
- Und eigentlich der wichtigste Grund für den modernen Programmierer von Heute: Man kann mit seinem Wissen imponieren
Zum Imponieren hier auch noch ein paar Begriffe zum googlen, die man unbedingt benötigt, um im Komplexitäts-Bullshit-Bingo zu bestehen:
– Notation
- Linear Speedup Theorem
- Asymptotische Laufzeitkomplexität
- Super- und Hyperexponentielle Komplexität
- O-Kalkül
- Landau-Symbole
- Definition des asymptotischen Maßes mit Limites
- Univariate Funktionen
Natürlich gibt es noch ganze Bücher hinter der O-Notation und ihrem mathematischen Hintergrund (siehe auch Bullshit-Bingo Liste). Dies würde aber natürlich den Rahmen dieses Blogs sprengen und so verabschiede ich mit
?
Weiterführende Links:
http://www.linux-related.de/index.html?/coding/o-notation.htm
http://de.wikipedia.org/wiki/O-Notation
http://en.wikipedia.org/wiki/Big_O_notation
http://de.wikipedia.org/wiki/Komplexitätstheorie
http://mathworld.wolfram.com/AsymptoticNotation.html