Het complete algoritme
Leerdoel: je herkent alle bouwstenen die je hebt geleerd en ziet ze samen werken. Daarna onderzoek je het algoritme als geheel.
Alles samen
def binair_zoek(lijst, doel):
laag = 0
hoog = len(lijst) - 1
while laag <= hoog:
midden = (laag + hoog) // 2
if lijst[midden] == doel:
return midden
elif lijst[midden] < doel:
laag = midden + 1
else:
hoog = midden - 1
return -1
Zie je de bouwstenen?
- Regels 2-3 → bouwsteen 1: grenzen
laagenhoog - Regel 5 → bouwsteen 2: het midden berekenen
- Regels 6-11 → bouwsteen 3: vergelijken en de juiste helft kiezen
- Regel 4 → bouwsteen 4: de while-lus
- Regel 12 → bouwsteen 5:
-1bij niet gevonden
Run
Code-omgeving wordt voorbereid…
Onderzoek
Speel met de code. Probeer in elk geval:
- Wat gebeurt er op een lege lijst?
- Wat gebeurt er op een lijst van één element?
- Wat gebeurt er op een ongesorteerde lijst?
Code-omgeving wordt voorbereid…
Wat zie je?
- Lege lijst →
hoog = -1, duslaag (0) > hoog (-1)→ while draait 0 keer →return -1. Veilig. - Eén element →
laag = hoog = 0, midden = 0. Check direct. - Ongesorteerd → een toevallig antwoord, vaak verkeerd. Het algoritme is niet correct op ongesorteerde input.
Visualiseer de stappen
Soms helpt het om te zien hoeveel stappen er zijn. Hier draaien we het algoritme op lijsten van verschillende lengtes en plotten we het aantal stappen.
Code-omgeving wordt voorbereid…
Wat zie je?
Op een logaritmische x-as zie je een rechte lijn. Dat is precies
de definitie van O(log n): bij elke verdubbeling van n komt er één stap
bij.
- 10 → 4 stappen
- 100 → 7 stappen
- 1000 → 10 stappen
- 10.000 → 14 stappen
- 100.000 → 17 stappen
Voor 100.000 elementen: 17 vergelijkingen in het ergste geval. Lineair zoeken zou er 100.000 doen. Factor ~6000.
Door naar stap 9: aanpassen →