Hoe snel? Grote-O-notatie
Bij een miljard stappen per seconde kost een n²-methode op een miljoen waarden ongeveer 17 minuten; een n log n-methode kost 0.02 seconden.
Groei telt meer dan het exacte aantal
Tot nu toe telden we stappen exact: 45 vergelijkingen, 4 verwisselingen, 20 controles. Exacte aantallen zijn nuttig voor kleine voorbeelden, maar hangen af van details zoals vroeg stoppen bij bubblesort of de keuze van een spil. Als de invoer groot wordt, overheerst één ding: hoe het aantal groeit als n groeit. Een algoritme waarvan de stappen groeien als n² verliest uiteindelijk van een dat groeit als n log n, hoe zorgvuldig het eerste ook is geoptimaliseerd.
Grote-O-notatie is de verkorte schrijfwijze voor die groei. Schrijven dat een algoritme O(n²) is, uitgesproken ‘grote O van n kwadraat’, betekent dat het aantal stappen voor grote n hoogstens een constante maal n² is. Twee regels maken het gebruik eenvoudig. Laat constante factoren weg: 3n en n/2 zijn beide O(n). Behoud alleen de snelst groeiende term: n²/2 − n/2, de vergelijkingen van selectionsort, is O(n²), omdat voor grote n het n²-deel bijna alles vormt. De cursus 6.006 van MIT gebruikt hetzelfde idee om gegevensstructuren en sorteermethoden op hun asymptotische looptijd te vergelijken.
Veelvoorkomende groeisnelheden
- O(1), constant. Het werk hangt niet af van n: de eerste waarde van een lijst lezen of een waarde op een bekende positie.
- O(log n), logaritmisch. Elke stap halveert het probleem: binair zoeken. Een miljoen waarden, ongeveer 20 stappen.
- O(n), lineair. Elke waarde wordt eenmaal verwerkt: lineair zoeken, de grootste waarde vinden, een lijst optellen.
- O(n log n). Mergesort en gemiddeld quicksort. Het beste dat sorteren met vergelijkingen kan bereiken.
- O(n²), kwadratisch. Elk paar wordt bekeken: bubblesort, selectionsort en insertionsort in het slechtste geval, of twee geneste lussen.
- O(2ⁿ), exponentieel. Het werk verdubbelt met elk extra item: elke deelverzameling van n items proberen of n schijven in de Torens van Hanoi verplaatsen.
Sleep om te draaien. Scroll of knijp om te zoomen.
Wat de getallen in seconden betekenen
Stel dat een computer een miljard (10⁹) basisstappen per seconde uitvoert, een redelijk rond getal voor één processorkern. Dit betekent elke groeisnelheid voor een miljoen waarden. O(log n) is ongeveer 20 stappen, ver onder een microseconde. O(n) is een miljoen stappen, één milliseconde. O(n log n) is ongeveer 20 miljoen stappen, 0.02 seconden. O(n²) is 10¹² stappen, duizend seconden, ongeveer 17 minuten. O(2ⁿ) kan niet worden voltooid: 2 tot de macht een miljoen heeft meer dan 300 000 cijfers. Daarom is het juiste algoritme kiezen meestal veel belangrijker dan een snellere computer kopen. Een tienmaal snellere machine maakt van 17 minuten 1.7 minuten; overstappen van O(n²) naar O(n log n) maakt er een vijftigste seconde van.
| Groei | Stappen voor n = 1 000 000 | Tijd bij 10⁹ stappen per seconde |
|---|---|---|
| O(1) | 1 | ongeveer een nanoseconde |
| O(log n) | ongeveer 20 | ongeveer 20 nanoseconden |
| O(n) | 1,000,000 | 1 milliseconde |
| O(n log n) | ongeveer 20 000 000 | ongeveer 0.02 seconden |
| O(n²) | 1,000,000,000,000 | ongeveer 17 minuten |
| O(2ⁿ) | meer dan 300 000 cijfers lang | wordt nooit voltooid |
Grote O uit code aflezen
Vaak kun je de groeisnelheid direct uit de vorm van de code aflezen. Eén lus over de lijst is O(n). Twee lussen, één binnen de andere, beide over de lijst, zijn O(n²): voor elk van de n buitenrondes doet de binnenlus maximaal n rondes. Een lus die elke keer een getal halveert, zoals while (n > 1) n = Math.floor(n / 2), is O(log n): vanaf 1000 loopt die 9 keer, vanaf een miljoen 19 keer. Stappen na elkaar tel je op en de grotere term wint: een O(n)-lus gevolgd door een O(n²)-lus is samen O(n²).
// O(n): one pass
let total = 0;
for (const x of list) total += x;
// O(n²): every pair
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): halving
let k = list.length, rounds = 0;
while (k > 1) { k = Math.floor(k / 2); rounds++; }Beste, gemiddelde en slechtste geval
Eén algoritme kan zich op verschillende invoer heel anders gedragen. Insertionsort is O(n) op een al gesorteerde lijst en O(n²) op een omgekeerde. Quicksort is gemiddeld O(n log n) en O(n²) met steeds slechte spillen. Als mensen één grote-O-waarde noemen zonder geval, bedoelen ze meestal het slechtste geval, omdat dat een garantie is: het algoritme doet nooit slechter. Grote O laat ook dingen weg. Het negeert constante factoren, dus voor kleine invoer kan een O(n²)-methode met heel eenvoudige stappen een O(n log n)-methode verslaan. Daarom schakelen veel echte sorteerroutines voor korte delen van de lijst over op insertionsort.
| Grote O | Hoe het aantal stappen met n groeit, zonder constante factoren |
| O(1) | Constant: hetzelfde werk voor elke n |
| O(log n) | Logaritmisch: elke stap halveren, zoals binair zoeken |
| O(n) | Lineair: één doorgang door de invoer |
| O(n log n) | Mergesort; het beste voor sorteren met vergelijkingen |
| O(n²) | Kwadratisch: elk paar, twee geneste lussen |
| O(2ⁿ) | Exponentieel: verdubbelt bij elk extra item |
| slechtste geval | Een garantie: het algoritme doet nooit meer dan dit |
- Wat is 3n² + 5n + 2 in grote-O-notatie?
- O(n)
- O(n²)
- O(3n²)
- O(n² + n)
- Twee geneste lussen die elk n waarden doorlopen. Wat is de grote O?
- O(n)
- O(2n)
- O(n²)
- O(log n)
- Binair zoeken is
- O(1)
- O(log n)
- O(n)
- O(n log n)
- Een O(n²)-methode kost 2 seconden voor 1000 waarden. Hoeveel seconden ongeveer voor 10 000 waarden?
- Een O(n)-methode kost 2 seconden voor 1000 waarden. Hoeveel seconden ongeveer voor 10 000 waarden?
- Hoeveel seconden kosten 10¹² stappen bij 10⁹ stappen per seconde (een n²-methode op een miljoen waarden)?
- Hoe vaak wordt
while (n > 1) n = Math.floor(n / 2)uitgevoerd als n bij 64 begint? - Een programma voert een O(n)-lus uit en dan een O(n²)-lus. In totaal is het
- O(n)
- O(n²)
- O(n³)
- O(n + 2)
- Insertionsort op een al gesorteerde lijst is
- O(1)
- O(n)
- O(n log n)
- O(n²)
- Waarom kan een O(n²)-methode op kleine invoer een O(n log n)-methode verslaan?
- Grote O negeert constante factoren en de eenvoudigere methode kan minder per stap doen
- Grote O is fout voor kleine n
- n² is voor elke n kleiner dan n log n
- Kleine invoer is altijd gesorteerd
- Het extra geheugen van mergesort is
- O(1)
- O(log n)
- O(n)
- O(n²)
- Zet deze groeisnelheden van langzaamst naar snelst groeiend op volgorde.
- Grote O beschrijft hoe stappen met n groeien, zonder constante factoren en kleinere termen.
- Gebruikelijke snelheden: 1, log n, n, n log n, n², 2ⁿ.
- Een miljoen waarden bij 10⁹ stappen/s: n log n ongeveer 0.02 s, n² ongeveer 17 minuten.
- Eén lus is O(n); twee geneste lussen O(n²); halveren O(log n).
- Eén genoemde grote-O-waarde betekent meestal het slechtste geval.
Bronnen van deze cursus (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.
Geraadpleegd: 2026-10-17