edubun
Nederlands

Zoeken: lineair en binair zoeken

Om één naam in een gesorteerde lijst van een miljoen te vinden, heeft binair zoeken nooit meer dan 20 controles nodig.

Eén waarde zoeken

Zoeken is bepalen waar een waarde in een verzameling staat of vaststellen dat zij ontbreekt. Je telefoon doet dit wanneer je een contactnaam intypt, een winkel wanneer die controleert of een artikel op voorraad is en een spellingcontrole bij elk woord dat je typt. De invoer is een lijst en een doelwaarde. De uitvoer is de positie van het doel of een teken zoals -1 dat ‘niet gevonden’ betekent.

Lineair zoeken: één tegelijk

De eenvoudigste methode is links beginnen en elke waarde op volgorde controleren totdat je het doel vindt of het einde bereikt. Dit is lineair zoeken. Het werkt op elke lijst, gesorteerd of niet. De kosten hangen af van geluk: staat het doel vooraan, dan is één controle genoeg; staat het achteraan of ontbreekt het, dan controleer je elke waarde. Voor een lijst van n waarden is het slechtste geval n controles. Een tweemaal zo lange lijst kan tweemaal zoveel controles vragen. Daar komt de naam ‘lineair’ vandaan: het werk groeit langs een rechte lijn met de grootte.

function linearSearch(list, target) {
  for (let i = 0; i < list.length; i++) {
    if (list[i] === target) return i;  // found it
  }
  return -1;                             // checked everything
}

Binair zoeken: halveer wat overblijft

Als de lijst gesorteerd is, kan het veel beter. Denk aan het getallenraadspel: iemand kiest een getal van 1 tot 100 en antwoordt alleen ‘hoger’ of ‘lager’. Een verstandige speler raadt eerst 50. Wat het antwoord ook is, de helft van de mogelijkheden valt weg. De volgende gok is het midden van wat resteert, enzovoort. Binair zoeken doet precies dit met een gesorteerde lijst. Het houdt twee markeringen, lo en hi, rond het deel waar het doel nog kan staan. Het controleert de middelste waarde. Is dat het doel, dan is het klaar. Is de middelste waarde kleiner, dan is alles links ervan ook kleiner en schuift lo voorbij het midden. Is zij groter, dan schuift hi vóór het midden. Zodra lo hi passeert, resteert niets en staat het doel niet in de lijst.

function binarySearch(list, target) {
  let lo = 0, hi = list.length - 1;
  while (lo <= hi) {
    const mid = Math.floor((lo + hi) / 2);
    if (list[mid] === target) return mid;
    if (list[mid] < target) lo = mid + 1;  // target is to the right
    else hi = mid - 1;                     // target is to the left
  }
  return -1;
}
Laden

Sleep om te draaien. Scroll of knijp om te zoomen.

Een gesorteerde lijst van 31 getallen. Kies een doel, doorloop dan binair en lineair zoeken stap voor stap en vergelijk het aantal controles.

Hoeveel controles?

Elke controle bij binair zoeken halveert het resterende deel minstens. Begin je met n waarden, dan zijn er na één controle hoogstens ongeveer n/2 over, na twee ongeveer n/4, enzovoort tot er één waarde overblijft. Het aantal halveringen om van n naar 1 te komen is de logaritme van n met grondtal 2, geschreven als log₂ n. Met de laatste controle erbij kost binair zoeken hoogstens ⌊log₂ n⌋ + 1 controles, waarbij ⌊ ⌋ naar beneden afronden betekent. Voor 100 waarden zijn dat 7 controles, en daarom kun je het raadspel altijd in 7 pogingen winnen. Voor 1000 waarden zijn het er 10, voor een miljoen 20 en voor een miljard 30.

Lijstgrootte nLineair zoeken, slechtste gevalBinair zoeken, slechtste geval
773
1001007
1,0001,00010
1,000,0001,000,00020
1,000,000,0001,000,000,00030

De voorwaarde: de lijst moet gesorteerd zijn

Binair zoeken werkt alleen doordat in een gesorteerde lijst één vergelijking vertelt aan welke kant het doel moet staan. In een ongesorteerde lijst vertelt de middelste waarde niets over de buren, dus val je terug op lineair zoeken. Sorteren kost zelf werk (daarover gaan de volgende twee hoofdstukken), dus de keuze hangt af van het gebruik. Zoek je eenmaal in een lijst, dan kan lineair zoeken het goedkoopst zijn. Zoek je duizenden keren in dezelfde lijst, dan loont eenmaal sorteren en daarna binair zoeken snel. Deze afweging tussen gegevens voorbereiden en vragen erover beantwoorden komt overal in het onderwerp terug.

Een klassieke fout bij binair zoeken is de bijwerkstap. lo = mid schrijven in plaats van lo = mid + 1 kan de lus eindeloos laten lopen als er twee waarden over zijn, omdat mid niet meer verandert. De middelste waarde is al gecontroleerd en mag dus buiten het volgende bereik blijven.
lineair zoekenControleer waarden vanaf het begin één voor één
binair zoekenControleer het midden van een gesorteerd bereik en laat de helft zonder mogelijke doelwaarde vallen
slechtste gevalDe invoer die het algoritme het meeste werk laat doen
log₂ nHoe vaak je n kunt halveren voordat je 1 bereikt
lo en hiDe twee uiteinden van het bereik waar het doel nog kan staan
-1Een gebruikelijke terugkeerwaarde voor ‘niet gevonden’
  1. Hoeveel controles heeft binair zoeken hoogstens nodig voor een gesorteerde lijst van 1000 waarden?
  2. Hoeveel controles heeft lineair zoeken hoogstens nodig voor een lijst van 1000 waarden?
  3. Voor binair zoeken moet de lijst
    • gesorteerd zijn
    • kort zijn
    • uit gehele getallen bestaan
    • geen herhaalde waarden bevatten
  4. Hoeveel controles voert binair zoeken in [2, 5, 8, 12, 16, 23, 38, 56, 72, 91] uit om 23 te vinden?
  5. Hoeveel controles voert lineair zoeken in dezelfde lijst uit om 23 te vinden?
  6. Binair zoeken controleert een middelste waarde 40 tijdens het zoeken naar 25. Wat gebeurt er daarna?
    • hi schuift tot net vóór het midden
    • lo schuift tot net na het midden
    • het zoeken stopt: 25 ontbreekt
    • het controleert de volgende waarde rechts
  7. Je mag een getal van 1 tot 100 raden en krijgt ‘hoger’ of ‘lager’ te horen. Hoeveel pogingen zijn met de beste strategie altijd genoeg?
  8. Een lijst verdubbelt in grootte. Wat gebeurt er met het maximale aantal controles bij binair zoeken?
    • Het verdubbelt
    • Het groeit met ongeveer één
    • Het blijft precies gelijk
    • Het wordt gekwadrateerd
  9. Je zoekt eenmaal één waarde op in een ongesorteerde lijst. Wat is goedkoper?
    • Lineair zoeken
    • De lijst sorteren en dan binair zoeken
  10. Waarom kan lo = mid (in plaats van mid + 1) binair zoeken eindeloos laten doorgaan?
    • Met twee resterende waarden kan mid elke ronde gelijk blijven
    • mid wordt negatief
    • JavaScript staat het niet toe
    • De lijst wordt langer
  11. Hoeveel controles heeft binair zoeken hoogstens nodig voor 1 000 000 waarden?
Belangrijkste punten
  • Lineair zoeken controleert één waarde tegelijk: maximaal n controles.
  • Binair zoeken halveert het resterende bereik: maximaal ⌊log₂ n⌋ + 1 controles.
  • Binair zoeken werkt alleen op een gesorteerde lijst.
  • Een miljoen waarden: hoogstens 20 controles.
  • Werk bij met mid + 1 en mid − 1 zodat het bereik altijd krimpt.
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