📘 CodingMarble Learn

Technieken om algoritmen te ontwerpen

Om een algoritme te ontwerpen beschrijf je eerst het probleem: de invoer, de gewenste uitvoer en de voorwaarden. Daarna schrijf je duidelijke stappen die eindigen, in gewone taal, als lijst, in pseudocode of als stroomdiagram. Een groot probleem knip je top-down in kleinere delen (stapsgewijs verfijnen), of je bouwt bottom-up verder met kleine, geteste onderdelen. De bekende technieken zijn: brute kracht (alles proberen), verdeel en heers (splitsen, oplossen, samenvoegen; halveren zoals bij binair zoeken en mergesort), greedy (telkens de beste keuze van dit moment; snel, maar niet altijd optimaal), dynamisch programmeren (elk klein deelprobleem één keer oplossen en in een tabel bewaren) en backtracking (een keuze proberen en bij een doodlopend eind terugdraaien). Kies de techniek en de datastructuren (arrays, stacks, binaire bomen) door te letten op juistheid en efficiëntie (tijdcomplexiteit).

🎬 Verhaal in stappen

  1. Beschrijf eerst het probleem. Invoer: 8 getallen. Uitvoer: het grootste. Stappen: kijk in elk vakje en onthoud het grootste tot nu toe.
  2. Verdeel en heers: om een getal van 1 tot 16 te raden vraag je naar het midden en gooi je de helft weg. Maar 4 vragen.
  3. Greedy: pak steeds de grootste munt die past. Dat is snel, maar voor 6 met munten 1, 3 en 4 krijg je 3 munten in plaats van de beste 2.
  4. Dynamisch programmeren: los eerst kleine bedragen op en bewaar elk antwoord in een tabel. De tabel vindt 6 = 3 + 3.
  5. Backtracking: loop een pad; bij een doodlopend eind ga je terug naar de laatste keuze en probeer je een andere weg, tot je de uitgang bereikt.
  6. Nu jij: kies een bedrag en munten. Voorspel: geeft greedy het minste aantal munten? Vergelijk met DP.

Tip: sleep de 3D-scène om hem te draaien. Gebruik twee vingers om te zoomen.

🤔 Veelvoorkomende twijfels, opgehelderd

Waarom invoer en uitvoer beschrijven vóór het programmeren?

Als je niet precies weet wat er binnenkomt en wat er eruit moet komen, kun je niet testen of de stappen kloppen.

Hoe kunnen 4 vragen genoeg zijn voor 16 getallen?

Elk antwoord gooit de helft weg: 16, 8, 4, 2, 1. De grijze vakjes laten de weggegooide helft zien.

Als greedy fout kan zijn, waarom gebruiken we het dan?

Het is heel snel en simpel, en voor veel problemen (gewone munten, activiteiten die het vroegst eindigen) is bewezen dat het klopt.

Wat is het verschil tussen DP en gewoon alles proberen?

DP lost elk klein bedrag één keer op en gebruikt het opnieuw, dus de tabel groeit stap voor stap in plaats van dat je elke combinatie afzoekt.

Begint backtracking weer helemaal opnieuw?

Nee. Je gaat alleen terug naar de laatste splitsing met een weg die nog niet is geprobeerd, en gaat dan verder.

Hoe weet ik of greedy werkt voor mijn munten?

Vergelijk het met DP voor veel bedragen. Probeer munten 1, 7, 10 in het vrije spel.

Een probleem beschrijven: invoer, uitvoer en stappen

Voordat je code schrijft, beschrijf je het probleem precies. Dat heet de specificatie.

De stappen opschrijven

Een algoritme is een eindige lijst duidelijke stappen die elke geldige invoer omzet in de juiste uitvoer. Je schrijft het op als:

Test het met de hand op kleine invoer, ook op lastige gevallen (alles gelijk, negatieve getallen, maar één getal).

Top-down en bottom-up ontwerpen

Top-down (stapsgewijs verfijnen): begin met de hele taak, knip die in een paar grote stappen en knip elke stap weer op, tot elk deel makkelijk te programmeren is. Voorbeeld: "Maak een rapport" → cijfers inlezen → gemiddelden berekenen → beoordelingen bepalen → afdrukken.

Bottom-up: bouw en test eerst kleine, herbruikbare stukjes (een functie die het maximum vindt, een functie die sorteert) en voeg ze daarna samen tot het hele programma.

In echte projecten gebruik je beide: plannen doe je top-down, bouwen en testen bottom-up.

Verdeel en heers, en de halveringsmethode

Verdeel en heers heeft drie stappen: het probleem splitsen in kleinere delen van dezelfde soort, elk deel oplossen (vaak met recursie) en de antwoorden samenvoegen.

Greedy-algoritmen

Een greedy (hebzuchtig) algoritme maakt de keuze die nu het beste lijkt en verandert die nooit meer.

Maar greedy is niet altijd goed: met munten 1, 3, 4 geeft 6 betalen op de greedy manier 4 + 1 + 1 (3 munten), terwijl 3 + 3 maar 2 munten kost. Om een greedy methode te vertrouwen moet je hem bewijzen of testen tegen een methode die zeker klopt.

Dynamisch programmeren en backtracking

Dynamisch programmeren (DP)

Als dezelfde kleinere problemen steeds terugkomen, los je ze één keer op en bewaar je het antwoord in een tabel. Minste munten voor bedrag a: best[a] = 1 + min(best[a - c]) over de munten c ≤ a, beginnend met best[0] = 0. Voor munten 1, 3, 4: best = 0, 1, 2, 1, 1, 2, 2. De tabel van klein naar groot invullen is bottom-up; recursie met een geheugen is top-down (memoisatie). Zie de aparte les over dynamisch programmeren voor meer.

Backtracking

Bouw een oplossing keuze voor keuze op. Als een keuze een regel breekt of in een doodlopend eind belandt, draai je hem terug en probeer je de volgende mogelijkheid. Je gebruikt het voor doolhoven, sudoku, het N-koninginnenprobleem en het opsommen van alle deelverzamelingen. Het is brute kracht met verstand: hele takken die niet kunnen werken sla je over.

Brute kracht

Probeer elk mogelijk antwoord. Altijd juist, maar vaak veel te traag (2ⁿ deelverzamelingen, n! volgordes).

Een techniek kiezen: juistheid, efficiëntie en datastructuren

TechniekGebruik alsVoorbeeldTypische tijd
Brute krachtde invoer heel klein isalle pincodes van 3 cijfers proberenvaak 2ⁿ of n!
Verdeel en heersde delen onafhankelijk zijnbinair zoeken, mergesortO(log n), O(n log n)
Greedyeen beste lokale keuze bewezen veilig isactiviteitenkeuze, wisselgeldO(n log n)
Dynamisch programmerendeelproblemen terugkomenmuntenprobleem, kortste padengrootte van de tabel
Backtrackingje zoekt met regelsdoolhof, sudokuexponentieel, maar met snoeien

Onderbouw je keuze

Juistheid: laat zien dat het algoritme altijd stopt en de juiste uitvoer geeft (een lusinvariant, een bewijs of tests op randgevallen). Efficiëntie: tel de stappen als n groter wordt (grote-O) en vergelijk met andere methoden.

Datastructuren helpen

Arrays voor tabellen (DP), stacks voor backtracking (onthouden waar je naartoe moet terugkeren), queues voor zoeken laag voor laag. Een binaire boom bewaart items zo dat elke knoop hoogstens twee kinderen heeft; in een binaire zoekboom gaan kleinere sleutels naar links en grotere naar rechts, zodat zoeken op elk niveau het werk halveert, net als binair zoeken.

Probeer het: munten en een raadspel

  1. Speel het raadspel 1-100 met een vriend. Vraag altijd naar het midden. Kun je altijd winnen in 7 vragen? (2⁷ = 128.)
  2. Schrijf met munten 1, 3, 4 de DP-tabel voor bedragen 0 tot 10 op papier. Waar gaat greedy fout?
  3. Open de laatste 3D-stap. Probeer munten 1, 7, 10 en bedrag 14. Greedy geeft 10 + 1 + 1 + 1 + 1; DP geeft 7 + 7.
  4. Schrijf een stappenlijst voor "vind het kleinste getal in een lijst" en test die op 5, 5, 5 en op één getal.

Belangrijke formules en begrippen

Uitgewerkte voorbeelden

1. Schrijf een specificatie en een stappenlijst om het grootste van n getallen te vinden.

Invoer: n ≥ 1 getallen. Uitvoer: het grootste. Stappen: 1. beste ← eerste getal. 2. Voor elk ander getal x: als x > beste, beste ← x. 3. Geef beste terug. Voor 4, 9, 2, 7, 12, 5, 10, 3 is de uitvoer 12 na 7 vergelijkingen.

2. Hoeveel vragen heeft halveren nodig om een getal van 1 tot 1000 te vinden?

Elke vraag halveert het bereik: 1000 → 500 → 250 → 125 → 63 → 32 → 16 → 8 → 4 → 2 → 1. Dat zijn 10 vragen (2¹⁰ = 1024 ≥ 1000).

3. Betaal 87 op de greedy manier met munten 50, 20, 10, 5, 2, 1.

50 (37 over), 20 (17), 10 (7), 5 (2), 2 (0): 50 + 20 + 10 + 5 + 2 = 5 munten.

4. Vul de DP-tabel in voor munten 1, 3, 4 tot bedrag 7.

best[0]=0, [1]=1, [2]=2, [3]=1, [4]=1, [5]=min(best4, best2, best1)+1=2, [6]=min(best5, best3, best2)+1=2, [7]=min(best6, best4, best3)+1=2 (3 + 4).

5. Activiteiten (begin-eind): A 9-11, B 10-12, C 11-13, D 12-14, E 13-15. Kies zoveel mogelijk activiteiten die elkaar niet overlappen.

Greedy op vroegste einde: A (eindigt 11), dan C (begint 11, eindigt 13), dan E (begint 13). 3 activiteiten: A, C, E.

6. Plan top-down: een programma dat een klas het gemiddelde cijfer en de beste leerling vertelt.

Niveau 1: gegevens inlezen → berekenen → afdrukken. Niveau 2: namen en cijfers in lijsten inlezen; totaal en gemiddelde berekenen; het hoogste cijfer en de bijbehorende naam vinden; beide afdrukken. Elk stukje wordt daarna bottom-up geprogrammeerd en getest.

Veelgemaakte fouten

Oefentoets

1. Een probleemspecificatie moet vermelden:
2. Binair zoeken in 16 gesorteerde items heeft hoogstens ongeveer nodig:
3. Welke techniek neemt altijd de keuze die nu het beste lijkt?
4. Dynamisch programmeren werkt goed als:
5. Bij het zoeken in een doolhof teruggaan naar de laatste splitsing na een doodlopend eind is:

Oefenen: beantwoord deze zelf

Typ of kies je antwoord en druk op Controleer. Gebruik een hint als je vastzit; de volledige uitwerking verschijnt na je antwoord.

Veelgestelde vragen

Wat zijn de belangrijkste technieken om algoritmen te ontwerpen?

Brute kracht, verdeel en heers, greedy, dynamisch programmeren en backtracking, gekozen nadat je invoer en uitvoer hebt beschreven.

Wat is het verschil tussen greedy en dynamisch programmeren?

Greedy maakt bij elke stap één keuze die het beste lijkt en kijkt nooit terug. DP bekijkt alle keuzes voor kleine deelproblemen en bewaart de beste antwoorden, dus het vindt het echte optimum als deelproblemen overlappen.

Wat is het verschil tussen top-down en bottom-up ontwerpen?

Top-down knipt de hele taak in kleinere stappen; bottom-up bouwt en test eerst kleine delen en voegt ze samen. De meeste programma's gebruiken beide.

Waar dit wordt onderwezen

PolandSzkoła podstawowa, klasa VIIUnderstanding, analysing and solving problems
PolandSzkoła podstawowa, klasa VIIIUnderstanding, analysing and solving problems
PolandLiceum ogólnokształcące, klasa IUnderstanding, analysing and solving problems
China高三Electives (选修)

Leer eerst

Leer hierna

Verwante lessen

Alle lessen Computer Science