Het complete algoritme
Leerdoel: je ziet alle bouwstenen samen en onderzoekt het algoritme.
Alles samen
def max_en_min(lijst):
klein = groot = lijst[0]
for waarde in lijst:
if waarde < klein:
klein = waarde
elif waarde > groot:
groot = waarde
return klein, groot
- Regel 2:
Beide accumulators starten op
lijst[0]— één regel, twee namen, allebei een echte waarde uit de lijst. - Regel 4-5:
Kleiner dan de kleinste tot nu toe? Nieuwe kleinste.
- Regel 6-7:
De
elifdoet het spiegelbeeld, en alleen als de waarde géén nieuwe kleinste was — één waarde kan nooit allebei tegelijk zijn. - Regel 8:
Eén
return, twee waardes: Python maakt er een tuple van.
Acht regels, met één for-lus. Zet je vind-maximum en vind-minimum los naast elkaar, dan heb je er twee nodig en lees je de lijst twee keer.
Run
Interactief model
Max en min in een pass
Werk twee accumulators tegelijk bij.
Startwaardes
We starten met 5 als minimum en maximum.
Onderzoek — tel de vergelijkingen
Hoeveel werk doet ons algoritme? We bouwen een teller-versie en
vergelijken hem met twee-aparte-passes. De else met een if erin is
hetzelfde als de elif uit het algoritme, alleen kun je zo de tweede
vergelijking tellen.
Wat zie je?
- Twee passes: altijd precies
2nvergelijkingen, 2000 hier. - Eén pass, willekeurig: bijna 2000.
kleinis na een paar elementen al heel klein, duswaarde < kleinis bijna nooit waar en de tweede vergelijking is bijna altijd nodig. - Eén pass, aflopend: precies 1000. Elke waarde is kleiner dan de vorige, dus de eerste vergelijking is elke keer raak en de tweede wordt overgeslagen.
In vergelijkingen scheelt één pass dus tussen niets en de helft, en op gewone data bijna niets. De echte winst zit ergens anders: elk element wordt één keer gelezen in plaats van twee keer. Bij grote data, of data die van een trage bron komt, is dat wat telt.
Door naar aanpassen.