Ga naar hoofdinhoud

4.11 Er gaat iets mis — top-3 fouten

Leerdoel: je herkent de klassieke valkuilen van binair zoeken.

Oneindige lus (laag = midden)

Geen foutmelding — de Python loopt gewoon oneindig door. Browser-tab hangt. Druk op Reset als dit gebeurt.

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, moet het zoekgebied krimpen met minstens 1 element per stap → de lus stopt 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 Python-foutmelding — wél een logische fout bij sommige inputs.

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 — gewoon 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)

Als je vaak zoekt, 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 stap 12: cheatsheet.