Er gaat iets mis — top-3 fouten
Leerdoel: je herkent de klassieke valkuilen van binair zoeken.
Oneindige lus (laag = midden)
Geen foutmelding — Python loopt gewoon oneindig door. De browser-tab bevriest, en de Reset-knop reageert dan ook niet meer, want Python draait in dezelfde tab als de les. Sluit de tab en open de les opnieuw. Je code ben je dan kwijt, dus kopieer hem eerst naar een kladblok als je iets uitprobeert wat mis kan gaan.
Oorzaak: je hebt laag = midden geschreven in plaats van
laag = midden + 1. Bij laag = 1, hoog = 2 blijft midden = 1 keer op
keer — het zoekgebied krimpt nooit.
Oplossing: schrijf laag = midden + 1. Door het al-onderzochte midden
weg te gooien krimpt het zoekgebied elke stap met minstens één element, en
dan stopt de lus altijd.
# FOUT
elif lijst[midden] < doel:
laag = midden # zoekgebied krimpt niet → oneindige lus
# GOED
elif lijst[midden] < doel:
laag = midden + 1
Meer uitleg: Bouwsteen 3 — vergelijken.
laag <= hoog vs laag < hoog
Geen foutmelding, maar bij sommige lijsten wel een fout antwoord.
Oorzaak: met while laag < hoog slaat de lus de laatste ronde over
zodra laag == hoog. Dan blijft één element ongecontroleerd.
Oplossing: gebruik while laag <= hoog. Bij laag == hoog is er nog
één element over om te bekijken.
# FOUT
while laag < hoog:
...
binair_zoek([5], 5) # returnt -1, terwijl 5 wél in de lijst staat
# GOED
while laag <= hoog:
...
Ongesorteerde lijst meegeven
Geen foutmelding, alleen een fout antwoord. Dit is de gevaarlijkste soort bug, omdat hij stilletjes verkeerde dingen doet.
Oorzaak: het algoritme veronderstelt als lijst[midden] < doel, dan
moet het doel in de rechter helft zitten. Die aanname klopt alleen op een
gesorteerde lijst.
Oplossing: zorg dat je input gesorteerd is — sorteer hem eerst of bewaar een gesorteerde versie.
# FOUT
binair_zoek([3, 1, 4, 1, 5], 4) # output kan -1 zijn, of toevallig 2
# GOED
lijst = sorted(jouw_lijst)
binair_zoek(lijst, doel)
Zoek je vaak, sorteer dan één keer en bewaar de gesorteerde versie. Het sorteren kost O(n log n), maar daarna is elk zoeken O(log n) — bij veel zoekopdrachten loont dat.
Door naar cheatsheet.