Laufzeit messen: Operationen zählen und O-Notation
Du hast zwei Programme, die dasselbe Problem lösen. Welches ist besser? Die Stoppuhr ist eine schlechte Antwort: Das Ergebnis hängt vom Rechner, vom Compiler und davon ab, was nebenbei läuft. Außerdem sagt eine Messung bei Eingaben nichts darüber, was bei einer Million passiert.
Die Informatik misst deshalb nicht Sekunden, sondern zählt Grundoperationen (Vergleiche, Zuweisungen, Rechenschritte) in Abhängigkeit von der Eingabegröße . Und weil es bei großen nur auf die Wachstumsart ankommt, vergisst man Konstanten und Nebenglieder. Das Ergebnis ist die O-Notation: eine grobe, aber maschinenunabhängige Sprache für die Frage „Wie schnell wächst der Aufwand, wenn die Eingabe größer wird?"
Operationen in Schleifen zählen
Operationen in Schleifen zählen
Betrachte zwei verschachtelte Schleifen, wie sie in Sortieralgorithmen vorkommen: Die äußere Schleife läuft für , die innere für , und im Inneren steht ein Vergleich. Wie oft wird verglichen?
Für gar nicht, für einmal, für zweimal, und so weiter bis mit Vergleichen. Die Summe ist die Gaußsche Summenformel:
Für sind es Vergleiche, für schon , und für etwa . Verzehnfachst du , wächst die Zahl der Vergleiche etwa um den Faktor . Das ist die Signatur eines quadratischen Aufwands.
O-Notation (obere Schranke)
Seien und Funktionen von den natürlichen Zahlen in die nichtnegativen reellen Zahlen. Man sagt liegt in , wenn es eine Konstante und eine Schwelle gibt, sodass ab dieser Schwelle höchstens so groß wie mal ist.
Die Idee: Ab einer gewissen Eingabegröße wächst nicht schneller als ein konstantes Vielfaches von . Konstante Faktoren und Glieder niedrigerer Ordnung spielen dabei keine Rolle. Man schreibt oft ungenau statt .
Nachweis:
Nachweis:
Wir wählen und . Für alle gilt (denn ), also:
Damit ist die Definition erfüllt. Ebenso gilt , denn für große dominiert das quadratische Glied. Umgekehrt ist : Egal wie groß ist, ab gilt .
Wichtige Wachstumsklassen
Diese Klassen begegnen dir in jedem Algorithmus-Lehrbuch, geordnet vom langsamsten zum schnellsten Wachstum:
- konstant: ein Arrayzugriff.
- logarithmisch: binäre Suche; jeder Schritt halbiert das Problem.
- linear: ein Durchlauf durch die Daten.
- linearithmisch: gute Sortierverfahren wie Mergesort.
- quadratisch: zwei verschachtelte Schleifen, einfache Sortierverfahren.
- exponentiell: alle Teilmengen durchprobieren.
Mit dem Logarithmus ist in der Informatik fast immer der Logarithmus zur Basis gemeint. Die Basis ändert nur einen konstanten Faktor und ist in der O-Notation egal.
Zusammenfassung
Aufwand wird als Anzahl der Grundoperationen in Abhängigkeit von der Eingabegröße angegeben, nicht in Sekunden.
Die O-Notation ignoriert konstante Faktoren und Glieder niedrigerer Ordnung: , wenn ab einem .
Zwei verschachtelte Schleifen mit Dreiecksform liefern .
Rangfolge: .
Meist wird die Worst-Case-Laufzeit angegeben, weil sie eine Garantie ist.
Übungen
Eine äußere Schleife läuft für , die innere für . Wie oft wird der Rumpf der inneren Schleife für ausgeführt?
Welche der folgenden Aussagen ist richtig?
Ein Verfahren braucht ungefähr Schritte. Wie viele sind es für ?
Zeige mit der Definition der O-Notation, dass gilt. Gib und an.