Wie schnell? Die O-Notation
Bei einer Milliarde Schritten pro Sekunde braucht ein n²-Verfahren für eine Million Werte etwa 17 Minuten, ein n-log-n-Verfahren 0.02 Sekunden.
Das Wachstum zählt mehr als die genaue Zahl
Bisher haben wir Schritte genau gezählt: 45 Vergleiche, 4 Vertauschungen, 20 Prüfungen. Genaue Zahlen sind bei kleinen Beispielen nützlich, hängen aber von Details ab, etwa davon, ob Bubblesort früher aufhört oder wie ein Pivot gewählt wird. Wird die Eingabe groß, überwiegt eine Sache alles andere: wie die Zahl wächst, wenn n wächst. Ein Algorithmus, dessen Schritte wie n² wachsen, verliert irgendwann gegen einen, dessen Schritte wie n log n wachsen, egal wie sorgfältig der erste optimiert ist.
Die O-Notation (Landau-Notation) ist die Kurzschrift für dieses Wachstum. Schreibt man, ein Algorithmus sei O(n²), gesprochen „O von n Quadrat“, heißt das: Für großes n ist seine Schrittzahl höchstens eine Konstante mal n². Zwei Regeln machen den Umgang leicht. Konstante Faktoren fallen weg: 3n und n/2 sind beide O(n). Nur der am schnellsten wachsende Term bleibt: n²/2 − n/2, die Vergleiche von Selectionsort, ist O(n²), weil der n²-Teil für großes n fast alles ausmacht. Der MIT-Kurs 6.006 nutzt dieselbe Idee, wenn er Datenstrukturen und Sortierverfahren nach ihrer asymptotischen Laufzeit vergleicht.
Die üblichen Wachstumsraten
- O(1), konstant. Die Arbeit hängt nicht von n ab: den ersten Wert einer Liste lesen oder einen Wert an bekannter Position.
- O(log n), logarithmisch. Jeder Schritt halbiert das Problem: binäre Suche. Eine Million Werte, etwa 20 Schritte.
- O(n), linear. Jeder Wert wird einmal behandelt: lineare Suche, den größten Wert finden, eine Liste aufsummieren.
- O(n log n). Mergesort und Quicksort im Mittel. Das Beste, was vergleichsbasiertes Sortieren schafft.
- O(n²), quadratisch. Jedes Paar wird angeschaut: Bubblesort, Selectionsort und Insertionsort im schlechtesten Fall oder zwei ineinander verschachtelte Schleifen.
- O(2ⁿ), exponentiell. Die Arbeit verdoppelt sich mit jedem zusätzlichen Wert: jede Teilmenge von n Dingen ausprobieren oder n Scheiben bei den Türmen von Hanoi bewegen.
Zum Drehen ziehen. Zum Zoomen scrollen oder mit zwei Fingern ziehen.
Was die Zahlen in Sekunden bedeuten
Angenommen, ein Computer schafft eine Milliarde (10⁹) Grundschritte pro Sekunde, ein vernünftiger runder Wert für einen Prozessorkern. So viel bedeutet jede Wachstumsrate bei einer Million Werten. O(log n) sind etwa 20 Schritte, weit unter einer Mikrosekunde. O(n) ist eine Million Schritte, eine Millisekunde. O(n log n) sind etwa 20 Millionen Schritte, 0.02 Sekunden. O(n²) sind 10¹² Schritte, tausend Sekunden, etwa 17 Minuten. O(2ⁿ) wird nie fertig: 2 hoch eine Million ist eine Zahl mit mehr als 300 000 Stellen. Deshalb zählt die Wahl des richtigen Algorithmus meist viel mehr als ein schnellerer Computer. Eine zehnmal schnellere Maschine macht aus 17 Minuten 1.7 Minuten. Der Wechsel von O(n²) zu O(n log n) macht daraus eine fünfzigstel Sekunde.
| Wachstum | Schritte bei n = 1 000 000 | Zeit bei 10⁹ Schritten pro Sekunde |
|---|---|---|
| O(1) | 1 | etwa eine Nanosekunde |
| O(log n) | etwa 20 | etwa 20 Nanosekunden |
| O(n) | 1,000,000 | 1 Millisekunde |
| O(n log n) | etwa 20 000 000 | etwa 0.02 Sekunden |
| O(n²) | 1,000,000,000,000 | etwa 17 Minuten |
| O(2ⁿ) | mehr als 300 000 Stellen lang | wird nie fertig |
Die O-Notation aus dem Code ablesen
Oft lässt sich die Wachstumsrate direkt an der Form des Codes ablesen. Eine einzelne Schleife über die Liste ist O(n). Zwei Schleifen, eine in der anderen, beide über die Liste, sind O(n²): Für jede der n äußeren Runden macht die innere Schleife bis zu n Runden. Eine Schleife, die eine Zahl jedes Mal halbiert, etwa while (n > 1) n = Math.floor(n / 2), ist O(log n): Von 1000 aus läuft sie 9-mal, von einer Million aus 19-mal. Schritte, die nacheinander passieren, addieren sich, und der größere Term gewinnt: Eine O(n)-Schleife gefolgt von einer O(n²)-Schleife ist insgesamt O(n²).
// O(n): ein Durchlauf
let total = 0;
for (const x of list) total += x;
// O(n²): jedes Paar
for (let i = 0; i < list.length; i++)
for (let j = i + 1; j < list.length; j++)
if (list[i] === list[j]) console.log("duplicate", list[i]);
// O(log n): halbieren
let k = list.length, rounds = 0;
while (k > 1) { k = Math.floor(k / 2); rounds++; }Bester, mittlerer und schlechtester Fall
Ein Algorithmus kann sich bei verschiedenen Eingaben sehr verschieden verhalten. Insertionsort ist bei einer schon sortierten Liste O(n) und bei einer umgekehrten O(n²). Quicksort ist im Mittel O(n log n) und bei durchweg schlechten Pivots O(n²). Wer eine einzelne O-Angabe nennt, ohne den Fall zu sagen, meint meist den schlechtesten Fall, weil er eine Garantie ist: Schlechter wird der Algorithmus nie. Die O-Notation lässt auch Dinge weg. Sie ignoriert konstante Faktoren, deshalb kann bei kleinen Eingaben ein O(n²)-Verfahren mit sehr einfachen Schritten ein O(n log n)-Verfahren schlagen. Darum wechseln viele echte Sortierroutinen bei kurzen Listenstücken zu Insertionsort.
| O-Notation | Wie die Schrittzahl mit n wächst, ohne konstante Faktoren |
| O(1) | Konstant: dieselbe Arbeit für jedes n |
| O(log n) | Logarithmisch: jeder Schritt halbiert, wie bei der binären Suche |
| O(n) | Linear: ein Durchlauf über die Eingabe |
| O(n log n) | Mergesort; das Beste für vergleichsbasiertes Sortieren |
| O(n²) | Quadratisch: jedes Paar, zwei verschachtelte Schleifen |
| O(2ⁿ) | Exponentiell: verdoppelt sich mit jedem zusätzlichen Element |
| schlechtester Fall | Eine Garantie: Mehr als das tut der Algorithmus nie |
- Was ist 3n² + 5n + 2 in O-Notation?
- O(n)
- O(n²)
- O(3n²)
- O(n² + n)
- Zwei ineinander verschachtelte Schleifen, jede über n Werte. Welche O-Klasse?
- O(n)
- O(2n)
- O(n²)
- O(log n)
- Die binäre Suche ist
- O(1)
- O(log n)
- O(n)
- O(n log n)
- Ein O(n²)-Verfahren braucht für 1000 Werte 2 Sekunden. Wie viele Sekunden etwa für 10 000 Werte?
- Ein O(n)-Verfahren braucht für 1000 Werte 2 Sekunden. Wie viele Sekunden etwa für 10 000 Werte?
- Wie viele Sekunden dauern 10¹² Schritte bei 10⁹ Schritten pro Sekunde (ein n²-Verfahren bei einer Million Werten)?
- Wie oft läuft
while (n > 1) n = Math.floor(n / 2), wenn n bei 64 beginnt? - Ein Programm führt eine O(n)-Schleife und danach eine O(n²)-Schleife aus. Insgesamt ist es
- O(n)
- O(n²)
- O(n³)
- O(n + 2)
- Insertionsort ist bei einer schon sortierten Liste
- O(1)
- O(n)
- O(n log n)
- O(n²)
- Warum kann ein O(n²)-Verfahren bei kleinen Eingaben ein O(n log n)-Verfahren schlagen?
- Die O-Notation ignoriert konstante Faktoren, und das einfachere Verfahren macht pro Schritt vielleicht weniger
- Die O-Notation stimmt bei kleinem n nicht
- n² ist für jedes n kleiner als n log n
- Kleine Eingaben sind immer sortiert
- Der zusätzliche Speicher von Mergesort ist
- O(1)
- O(log n)
- O(n)
- O(n²)
- Ordne diese Wachstumsraten vom langsamsten zum schnellsten Wachstum.
- Die O-Notation beschreibt, wie die Schritte mit n wachsen, ohne konstante Faktoren und kleinere Terme.
- Übliche Raten: 1, log n, n, n log n, n², 2ⁿ.
- Eine Million Werte bei 10⁹ Schritten/s: n log n etwa 0.02 s, n² etwa 17 Minuten.
- Eine Schleife ist O(n); zwei verschachtelte Schleifen O(n²); Halbieren O(log n).
- Eine einzelne O-Angabe meint meist den schlechtesten Fall.
Quellen zu diesem Kurs (11)
- MIT OpenCourseWare 6.006 Introduction to Algorithms, Spring 2020 (Demaine, Ku, Solomon)
- lecture notes 1 Introduction, 3 Sorting, 9 Breadth-First Search, 10 Depth-First Search (ocw.mit.edu/courses/6-006-introduction-to-algorithms-spring-2020/pages/lecture-notes) and Fall 2011 lecture 13 BFS notes (ocw.mit.edu/courses/6-006-introduction-to-algorithms-fall-2011)
- Cormen, Leiserson, Rivest, Stein, Introduction to Algorithms (MIT Press)
- with the CLRS-based Khan Academy algorithms unit by Thomas Cormen and Devin Balkcom of Dartmouth (khanacademy.org/computing/computer-science/algorithms: binary search, selection sort analysis, merge sort, quicksort overview and analysis)
- MacTutor History of Mathematics, Al-Khwarizmi (mathshistory.st-andrews.ac.uk/Biographies/Al-Khwarizmi: word algorithm from the Latin title Algoritmi de numero Indorum)
- D. E. Joyce, Euclid's Elements Book VII Propositions 1 and 2 (mathcs.clarku.edu/~djoyce/elements/bookVII)
- Wolfram MathWorld, Merge Sort (mathworld.wolfram.com/MergeSort.html: proposed by John von Neumann in 1945, after Knuth 1998 p. 159)
- Stanford CS "Tony Hoare: Quicksort" (cs.stanford.edu/people/eroberts/courses/soco/projects/2008-09/tony-hoare/quicksort.html: devised while a student at Moscow State University for Russian-English machine translation with a tape dictionary, programmed in Algol 60 and published 1961; the year 1959 from the Wikipedia Quicksort article and its cited sources)
- Bodleian Libraries, Ada Lovelace (blogs.bodleian.ox.ac.uk/adalovelace: 1843 paper, Note G Bernoulli numbers)
- Fourmilab text of Menabrea's Sketch with Lovelace's notes (fourmilab.ch/babbage/sketch.html)
- Seven Bridges of Konigsberg (Euler 1736) and Tower of Hanoi (Edouard Lucas, 1883) checked against the Wikipedia articles and their cited sources.
Abgerufen: 2026-10-17