Wat is Dynamisch programmeren (dynamic programming)?
Ontwerpmethode voor algoritmen die een probleem opsplitst in kleinere deelproblemen en de antwoorden daarop in een tabel vastlegt om ze opnieuw te gebruiken, zodat dezelfde berekening niet herhaald wordt. Ze wordt gebruikt voor het knapzakprobleem, het minimale aantal munten, de langste gemeenschappelijke deelreeks, kortste paden en meer.
Japanse benaming: 動的計画法
“Dynamisch programmeren (dynamic programming)” komt voor in 3 oefenvragen uit 1 onderwerpen, bijv. Datastructuren en algoritmen.
Vakgebied: Datastructuren en algoritmen
Verschil met gretige algoritmen, en toepassingen
Een gretig algoritme kiest gewoon de keuze die op elk moment het beste lijkt en gaat verder, dus het is snel, maar voor sommige problemen niet optimaal. Bij het betalen van 8 yen met munten van 1, 4 en 6 yen gebruikt het gretige algoritme drie munten, 6 + 1 + 1, terwijl dynamisch programmeren er twee vindt, 4 + 4. Dynamisch programmeren wordt breed toegepast, bijvoorbeeld voor de bewerkingsafstand en de langste gemeenschappelijke deelreeks van tekenreeksen (zoals in het diff-commando), het uitlijnen van DNA-sequenties, het viterbialgoritme in spraakherkenning en het algoritme van Floyd-Warshall voor kortste paden tussen alle paren knopen.
Veelgestelde vragen
Wat is het verschil tussen dynamisch programmeren en verdeel-en-heers?
Beide splitsen een probleem op in deelproblemen, maar bij verdeel-en-heersalgoritmen zoals mergesort overlappen de deelproblemen niet, dus hoeven antwoorden niet te worden vastgelegd. Dynamisch programmeren verschilt doordat het antwoorden vastlegt en hergebruikt als dezelfde deelproblemen vaak terugkomen.
Wat zijn de zwakke punten van dynamisch programmeren?
Het vraagt geheugen en werk in verhouding tot de grootte van de tabel. De O(nW) van het knapzakprobleem is evenredig met de waarde van de capaciteit W, dus het wordt onpraktisch als W heel groot is. Geheugen kan worden bespaard door alleen vast te leggen wat nodig is of alleen de vorige rij van de tabel te bewaren.