5. Dynamické programování

Podobné dokumenty
4. Rekurze. BI-EP1 Efektivní programování Martin Kačer

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Dynamické programování

BI-EP1 Efektivní programování 1

Rekurzivní algoritmy

Rekurze. Pavel Töpfer, 2017 Programování 1-8 1

Rozklad problému na podproblémy

Rozklad problému na podproblémy, rekurze

Struktura programu v době běhu

Rozklad problému na podproblémy, rekurze

5. přednáška - Rozklad problému na podproblémy

Rekurze. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Dynamické programování

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

1. Úvodní informace. BI-EP1 Efektivní programování Martin Kačer

8. Rekurze. doc. Ing. Jiří Vokřínek, Ph.D. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze

Binární soubory (datové, typované)

Návrh Designu: Radek Mařík

Základní datové struktury III: Stromy, haldy

Databáze, sítě a techniky programování X33DSP

Dynamické programování

Michal Krátký. Úvod do programování. Cíl kurzu. Podmínky získání zápočtu III/III

Úvod do programování 10. hodina

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Datové struktury 2: Rozptylovací tabulky

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Dynamické programování. Optimální binární vyhledávací strom

Prohledávání do šířky = algoritmus vlny

VYŠŠÍ ODBORNÁ ŠKOLA a STŘEDNÍ PRŮMYSLOVÁ ŠKOLA Mariánská 1100, Varnsdorf PROGRAMOVÁNÍ FUNKCE, REKURZE, CYKLY

BI-EP2 Efektivní programování 2

Dynamické programování UIN009 Efektivní algoritmy 1

R zné algoritmy mají r znou složitost

Algoritmizace. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

NEJKRATŠÍ CESTY I. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

IB111 Úvod do programování skrze Python

2013 Martin Kačer. BI-EP2 Efektivní programování 2

Zdůvodněte, proč funkce n lg(n) roste alespoň stejně rychle nebo rychleji než než funkce lg(n!). Symbolem lg značíme logaritmus o základu 2.

Dekompozice problému, rekurze

Stromy, haldy, prioritní fronty

Dynamické programování

3. úloha - problém batohu metodami branch & bound, dynamické programování, heuristika s testem

Správa paměti. doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 /

DobSort. Úvod do programování. DobSort Implementace 1/3. DobSort Implementace 2/3. DobSort - Příklad. DobSort Implementace 3/3

12. Globální metody MI-PAA

11. Přehled prog. jazyků

DYNAMICKÉ PROGRAMOVÁNÍ A PROBLÉM BATOHU

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Rekurze. Jan Hnilica Počítačové modelování 12

Úvod do informatiky. Miroslav Kolařík

6. Základy výpočetní geometrie

Obsah Techniky návrhu algoritmů Rekurze, algoritmy prohledávání s návratem, dynamické programování Rekurze... 5

Slepé prohledávání do šířky Algoritmus prohledávání do šířky Při tomto způsobu prohledávání máme jistotu, že vždy nalezneme koncový stav, musíme ale p

NP-ÚPLNÉ PROBLÉMY. Doc. RNDr. Josef Kolář, CSc. Katedra teoretické informatiky, FIT České vysoké učení technické v Praze

Cvičení z logiky II.

Rekurze a rychlé třídění

6. Tahy / Kostry / Nejkratší cesty

Programování: základní konstrukce, příklady, aplikace. IB111 Programování a algoritmizace

Vzdálenost uzlů v neorientovaném grafu

2. Mřížky / Záplavové vyplňování

KTE / ZPE Informační technologie

5 Rekurze a zásobník. Rekurzivní volání metody

Časová složitost algoritmů, řazení a vyhledávání

Kombinatorika, výpočty

Algoritmy výpočetní geometrie

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LL SYNTAKTICKÁ ANALÝZA DOKONČENÍ, IMPLEMENTACE.

Algoritmizace a programování

Martin Flusser. November 1, 2016

Funkce pokročilé možnosti. Úvod do programování 2 Tomáš Kühr

1. Dynamické programování

Základní datové struktury

Řešení: PŘENESVĚŽ (N, A, B, C) = přenes N disků z A na B pomocí C

10. Složitost a výkon

Časová a prostorová složitost algoritmů

Dynamické programování

Přednáška. Správa paměti II. Katedra počítačových systémů FIT, České vysoké učení technické v Praze Jan Trdlička, 2012

Dynamické datové struktury III.

Mělká a hluboká kopie

Spojová implementace lineárních datových struktur

Abstraktní datové typy

Aproximativní algoritmy UIN009 Efektivní algoritmy 1

Dynamické programování

Funkce, intuitivní chápání složitosti

Zpětnovazební učení Michaela Walterová Jednoocí slepým,

Rekurze. IB111 Úvod do programování skrze Python

Programování v C++ 1, 14. cvičení

NPRG030 Programování I 3/2 Z --- NPRG031 Programování II --- 2/2 Z, Zk

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

Algoritmy I, složitost

Vyhledávání v textu. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

Náplň. v Jednoduché příklady na práci s poli v C - Vlastnosti třídění - Způsoby (algoritmy) třídění

Programování v Pythonu

Binární vyhledávací stromy pokročilé partie

Dynamické programování

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

Stromy. Strom: souvislý graf bez kružnic využití: počítačová grafika seznam objektů efektivní vyhledávání výpočetní stromy rozhodovací stromy

Seminář z IVT Algoritmizace. Slovanské gymnázium Olomouc Tomáš Kühr

Content Aware Image Resizing

Rekurze. IB111 Úvod do programování

8) Jaké jsou důvody pro použití víceprůchodového překladače Dříve hlavně kvůli úspoře paměti, dnes spíše z důvodu optimalizace

Transkript:

5. Dynamické programování BI-EP1 Efektivní programování 1 ZS 2011/2012 Ing. Martin Kačer, Ph.D. 2010-11 Martin Kačer Katedra teoretické informatiky Fakulta informačních technologií České vysoké učení technické v Praze Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti

Dynamické programování Řešení problému redukcí na menší Omezení opakování výpočtu (rozdíl oproti rekurzi) Často zásadní vliv na složitost! lineární/kvadratický vs. exponenciální tj. použitelný vs. nepoužitelný Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 2

Příklad Fibonacciho čísla 1, 1, 2, 3, 5, 8, 13, 21, 34, F(1) = F(2) = 1 pro N>2: F(N) = F(N-2) + F(N-1) Rekurzivní řešení se nabízí Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 3

Fibonacciho čísla rekurze F(1) = F(2) = 1 pro N>2: F(N) = F(N-2) + F(N-1) int fib(int n) { if (n <= 2) return 1; return fib(n-2) + fib(n-1); } Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 4

Strom rekurzivního volání fib(6) fib(4) fib(5) fib(2) fib(3) fib(3) fib(4) fib(1) fib(2) fib(1) fib(2) fib(2) fib(3) fib(1) fib(2) Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 5

Jak zamezit opakování? Pamatovat si, co už bylo spočítáno 1 2 3 4 5 6 7 8 9 10 Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 6

Jak zamezit opakování? Pamatovat si, co už bylo spočítáno 1 2 3 4 5 6 7 8 9 10 1 Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 7

Jak zamezit opakování? Pamatovat si, co už bylo spočítáno 1 2 3 4 5 6 7 8 9 10 1 1 Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 8

Jak zamezit opakování? Pamatovat si, co už bylo spočítáno 1 2 3 4 5 6 7 8 9 10 1 1 2 Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 9

Jak zamezit opakování? Pamatovat si, co už bylo spočítáno 1 2 3 4 5 6 7 8 9 10 1 1 2 Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 10

Jak zamezit opakování? Pamatovat si, co už bylo spočítáno 1 2 3 4 5 6 7 8 9 10 1 1 2 3 Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 11

Jak zamezit opakování? Pamatovat si, co už bylo spočítáno 1 2 3 4 5 6 7 8 9 10 1 1 2 3 Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 12

Jak zamezit opakování? Pamatovat si, co už bylo spočítáno 1 2 3 4 5 6 7 8 9 10 1 1 2 3 5 Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 13

Jak zamezit opakování? Pamatovat si, co už bylo spočítáno 1 2 3 4 5 6 7 8 9 10 1 1 2 3 5 Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 14

Jak zamezit opakování? Pamatovat si, co už bylo spočítáno 1 2 3 4 5 6 7 8 9 10 1 1 2 3 5 8 Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 15

Fibonacciho čísla kód int fib(int n) { if (result[n] > 0) return result[n]; if (n <= 2) return result[n] = 1; return result[n] = fib(n-2) + fib(n-1); } Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 16

Přístup shora Kód velmi podobný rekurzi Pamatujeme si již spočítané Nulování pole Test, zda existuje hodnota Lze použít asociativní tabulku (Map) Často nejjednodušší na představu Může být neefektivní Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 17

Přístup zdola Z menších instancí generujeme větší 1 2 3 4 5 6 7 8 9 10 1 1 Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 18

Přístup zdola Z menších instanci generujeme větší 1 2 3 4 5 6 7 8 9 10 1 1 2 Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 19

Přístup zdola Z menších instanci generujeme větší 1 2 3 4 5 6 7 8 9 10 1 1 2 3 Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 20

Přístup zdola Z menších instanci generujeme větší 1 2 3 4 5 6 7 8 9 10 1 1 2 3 5 Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 21

Přístup zdola Z menších instanci generujeme větší 1 2 3 4 5 6 7 8 9 10 1 1 2 3 5 8 Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 22

Fibonacciho čísla kód II int fib(int n) { result[1] = result[2] = 1; for (int i = 3; i <= n; ++i) result[i] = result[i-1] + result[i-2]; return result[n]; } Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 23

Snížení spotřeby paměti Postupně zapomínáme, co není potřeba 1 2 3 1 1 Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 24

Snížení spotřeby paměti Postupně zapomínáme, co není potřeba 1 2 3 1 1 2 Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 25

Snížení spotřeby paměti Postupně zapomínáme, co není potřeba 2 3 4 1 2 Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 26

Snížení spotřeby paměti Postupně zapomínáme, co není potřeba 2 3 4 1 2 3 Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 27

Snížení spotřeby paměti Postupně zapomínáme, co není potřeba 3 4 5 2 3 Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 28

Snížení spotřeby paměti Postupně zapomínáme, co není potřeba 3 4 5 2 3 5 Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 29

Fibonacciho čísla kód III int fib(int n) { int res = 1, prev = 1; for (int i = 3; i <= n; ++i) { int nxt = res + prev; prev = res; res = nxt; } return res; } Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 30

Obecné schéma D.P. Vždy přítomno: Řešení problému pomocí menší instance Pamatování výsledků Obvykle jde: Postup zdola, tj. od nejmenších instancí Odstranění rekurze Často navíc: Zapomínání => menší spotřeba paměti Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 31

Kde jsme již viděli D.P.? Vybraná neklesající posloupnost Přidávání čísel po jednom Tj. řešení odvodím z řešení menší instance (o číslo kratší posloupnost) O(n. log n) Triangle: Maximální trojúhelníková oblast Z menších trojúhelníků skládám větší O(n) Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 32

Společná podposloupnost Najděte nejdelší společnou podposloupnost (i nesouvislou) řetězců a b r a k a d a b r a b a r u n k a Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 33

Společná podposloupnost Najděte nejdelší společnou podposloupnost (i nesouvislou) řetězců a b r a k a d a b ra b a r unka Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 34

Společná podposloupnost Ono to ale vůbec nemusí být jednoduché Například: a b r a k a d a b r a a b r a k a d a b r a d o b r y k r a m a b r a k Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 35

Společná podposloupnost Ono to ale vůbec nemusí být jednoduché Například: a b r a k a d a b r a a b r a k a d a b r a d o b r y k r a m a b r a k Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 36

Rekurzivní řešení Pomohlo by, kdybychom uměli řešení pro jakékoli kratší řetězce? Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 37

Rekurzivní řešení Pomohlo by, kdybychom uměli řešení pro jakékoli kratší řetězce? xxxxxxxxxxxx A xxxxxxxxxxxxxxx A Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 38

Rekurzivní řešení Pomohlo by, kdybychom uměli řešení pro jakékoli kratší řetězce? xxxxxxxxxxxx B xxxxxxxxxxxxxxx C Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 39

Podposloupnost rekurzivně char[] s1, s2; int commonlen (int m1, int m2) { if (m1 == 0 m2 == 0) return 0; if (s1[m1-1] == s2[m2-1]) return 1 + commonlen(m1-1, m2-1); return Math.max( commonlen(m1, m2-1), commonlen(m1-1, m2)); } Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 40

Podposloupnost dynamicky m2 0 1 2 3 4 5 6 7 8 9 10 11 m1 a b r a k a d a b r a 0 1 d 2 o 3 b 4 r 5 y 6 k 7 r 8 a 9 m Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 41

Podposloupnost dynamicky m2 0 1 2 3 4 5 6 7 8 9 10 11 m1 a b r a k a d a b r a 0 1 d 2 o 3 b 4 r 5 y 6 k 7 r 8 a 9 m +1 Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 42

Podposloupnost dynamicky m2 0 1 2 3 4 5 6 7 8 9 10 11 m1 a b r a k a d a b r a 0 1 d 2 o 3 b 4 r 5 y 6 k 7 r 8 a 9 m max Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 43

Podposloupnost dynamicky int best[][] = new int[len1+1][len2+1]; int commonlen (char[] s1, char[] s2) { for (int i = 0; i <= len1; ++i) best[i][0] = 0; for (int i = 0; i <= len2; ++i) best[0][i] = 0; for (int i = 1; i <= len1; ++i) for (int j = 1; j <= len2; ++j) best[i][j] = (s1[i-1] == s2[j-1])? 1 + best[i-1][j-1] } : Math.max(best[i-1][j], best[i][j-1]); return best[len1][len2]; Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 44

Hry obecně Tahové hry často vedou na rekurzi Vysoká operační složitost int getbestresult(state s, Player move) { if (isgameover(s)) return endresult(s); for (State m : getallmoves(s)) { int x = reverseresult( getbestresult(m, other(move))); if (x > best) best = x; } return best; Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 45

Hry obecně Tahové hry často vedou na rekurzi Vysoká operační složitost Pokud se stavy spojují, lze použít dynamické programování Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 46

Typické příklady D.P. Posloupnosti Rozdělování Vyhledávání Porovnávání Kombinování prvků Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 47

Jak poznat D.P. obecně? Rozložení na menší (pod)problém(y) Optimální podstruktura (Bellmanův princip optimality) Část optimálního řešení je opět optimální Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 48

Dyn. programování souhrn Problémy s rekurzivní povahou Optimální podstruktura Princip podobný jako u rekurze Pamatujeme si výsledky Zásadní rozdíl v časové složitosti!!! Martin Kačer, BI-EP1, ZS 2011 5. Dynamické programování 49