You are on page 1of 56

Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Curs Algoritmi Fundamentali


Programare Dinamică

Universitatea Transilvania din Braşov


Facultatea de Matematică şi Informatică

2019
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Contents

1 Programare Dinamică - Prezentare generală

2 Programare Dinamică - Discuţii şi probleme

3 Tehnica memoizării

4 Concluzii
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Programare Dinamică - Prezentare generală

se aplică în general problemelor de optimizare şi se


urmăreşte determinarea soluţiei optime;
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Programare Dinamică - Prezentare generală

se aplică în general problemelor de optimizare şi se


urmăreşte determinarea soluţiei optime;
rezolvă o problema prin descompunerea ei în
subprobleme;
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Programare Dinamică - Prezentare generală

se aplică în general problemelor de optimizare şi se


urmăreşte determinarea soluţiei optime;
rezolvă o problema prin descompunerea ei în
subprobleme;
subproblemele nu sunt independente, ci au în comun alte
subprobleme;
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Programare Dinamică - Prezentare generală

se aplică în general problemelor de optimizare şi se


urmăreşte determinarea soluţiei optime;
rezolvă o problema prin descompunerea ei în
subprobleme;
subproblemele nu sunt independente, ci au în comun alte
subprobleme;
pentru o problemă pot exista mai multe soluţii optime, care
au însă aceeaşi valoare optimă;
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Programare Dinamică - Prezentare generală

se aplică în general problemelor de optimizare şi se


urmăreşte determinarea soluţiei optime;
rezolvă o problema prin descompunerea ei în
subprobleme;
subproblemele nu sunt independente, ci au în comun alte
subprobleme;
pentru o problemă pot exista mai multe soluţii optime, care
au însă aceeaşi valoare optimă;
furnizează întotdeauna soluţie optimă;
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Programare Dinamică - Prezentare generală

se aplică în general problemelor de optimizare şi se


urmăreşte determinarea soluţiei optime;
rezolvă o problema prin descompunerea ei în
subprobleme;
subproblemele nu sunt independente, ci au în comun alte
subprobleme;
pentru o problemă pot exista mai multe soluţii optime, care
au însă aceeaşi valoare optimă;
furnizează întotdeauna soluţie optimă;
timp de lucru polinomial.
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Programare Dinamică - Principii de bază

1 evitarea calculării de mai multe ori a aceluiaşi subcaz, prin


memorarea rezultatelor intermediare;
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Programare Dinamică - Principii de bază

1 evitarea calculării de mai multe ori a aceluiaşi subcaz, prin


memorarea rezultatelor intermediare;
2 porneşte (de obicei) de la cele mai mici subcazuri.
Combinând soluţiile lor, se obţin soluţii pentru subcazuri
din ce în ce mai mari, până se ajunge, în final, la soluţia
cazului iniţial (bottom-up);
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Programare Dinamică - Principii de bază

1 evitarea calculării de mai multe ori a aceluiaşi subcaz, prin


memorarea rezultatelor intermediare;
2 porneşte (de obicei) de la cele mai mici subcazuri.
Combinând soluţiile lor, se obţin soluţii pentru subcazuri
din ce în ce mai mari, până se ajunge, în final, la soluţia
cazului iniţial (bottom-up);
3 într-o secvenţă optimă de decizii sau alegeri, fiecare
subsecvenţă trebuie să fie de asemenea optimă (principiul
optimizalităţii).
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Programare dinamică - Condiţii

problema de optimizare P având datele de intrare D poate


fi rezolvată prin rezolvarea aceleiaşi probleme P, dar cu
datele de intrare d, unde d < D;
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Programare dinamică - Condiţii

problema de optimizare P având datele de intrare D poate


fi rezolvată prin rezolvarea aceleiaşi probleme P, dar cu
datele de intrare d, unde d < D;
soluţia este rezultatul unei succesiuni de decizii;
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Programare dinamică - Condiţii

problema de optimizare P având datele de intrare D poate


fi rezolvată prin rezolvarea aceleiaşi probleme P, dar cu
datele de intrare d, unde d < D;
soluţia este rezultatul unei succesiuni de decizii;
se verifică principiul optimalităţii;
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Programare dinamică - Condiţii

problema de optimizare P având datele de intrare D poate


fi rezolvată prin rezolvarea aceleiaşi probleme P, dar cu
datele de intrare d, unde d < D;
soluţia este rezultatul unei succesiuni de decizii;
se verifică principiul optimalităţii;
problema se poate descompune în subprobleme;
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Programare dinamică - Condiţii

problema de optimizare P având datele de intrare D poate


fi rezolvată prin rezolvarea aceleiaşi probleme P, dar cu
datele de intrare d, unde d < D;
soluţia este rezultatul unei succesiuni de decizii;
se verifică principiul optimalităţii;
problema se poate descompune în subprobleme;
se pot memora soluţiile subproblemlor pentru reutilizări
viitoare.
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Programare dinamică - Algoritm

1 descrierea structurii unei soluţii optime (identificarea


subproblemelor) (optim global => optim local);
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Programare dinamică - Algoritm

1 descrierea structurii unei soluţii optime (identificarea


subproblemelor) (optim global => optim local);
2 definirea unor relaţii de recurenţă pentru obţinerea valorii
unei soluţii optime din optime parţiale;
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Programare dinamică - Algoritm

1 descrierea structurii unei soluţii optime (identificarea


subproblemelor) (optim global => optim local);
2 definirea unor relaţii de recurenţă pentru obţinerea valorii
unei soluţii optime din optime parţiale;
3 calculul valorii unei soluţii optime într-o manieră
"bottom-up" (de jos in sus);
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Programare dinamică - Algoritm

1 descrierea structurii unei soluţii optime (identificarea


subproblemelor) (optim global => optim local);
2 definirea unor relaţii de recurenţă pentru obţinerea valorii
unei soluţii optime din optime parţiale;
3 calculul valorii unei soluţii optime într-o manieră
"bottom-up" (de jos in sus);
4 construirea unei soluţii optime din informaţia calculată.
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Problema triunghiului

Se consideră un triunghi de numere naturale format din n linii


(pe prima linie am un singur element, pe a doua două,...). Cu
elementele triunghiului se formează sume astfel:
pornesc cu elementul de pe prima linie

Problema care se pune este de a obţine cea mai mare sumă în


acest fel.
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Problema triunghiului

Se consideră un triunghi de numere naturale format din n linii


(pe prima linie am un singur element, pe a doua două,...). Cu
elementele triunghiului se formează sume astfel:
pornesc cu elementul de pe prima linie
la pasul k adaug elementul de pe linia k , care se află sub
elementul ales anterior (pe linia k − 1) sau elementul
plasat diagonal la dreapta sub elementul anterior (adică
dacă am ales a[k − 1][j] voi alege a[k ][j] sau a[k ][j + 1])
Problema care se pune este de a obţine cea mai mare sumă în
acest fel.
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Problema triunghiului

1
35
243
5163
s1 = 1 + 3 + 2 + 5 = 11
s2 = 1 + 3 + 2 + 1 = 7
s3 = 1 + 3 + 4 + 1 = 8
s4 = 1 + 3 + 4 + 6 = 14
s5 = 1 + 5 + 4 + 1 = 11
s6 = 1 + 5 + 4 + 6 = 16
s7 = 1 + 5 + 3 + 6 = 15
s8 = 1 + 5 + 3 + 3 = 12
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Problema triunghiului

1 S = (S(i, j), i = 0, n − 1, j = 0, n − 1). Pentru o soluţie


a(0, 0), a(1, j1 ), ..., a(i, ji ), ..., a(n − 1, jn−1 ) optimă, suma
S(i, ji ) trebuie să fie maximul posibil pornind de la a(i, ji )

sol(i, j) = 0, S(i, j) este maxim pentru alegerea lui a(i + 1, j)


sol(i, j) = 1, S(i, j) este maxim pentru alegerea lui
a(i + 1, j + 1).
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Problema triunghiului

1 S = (S(i, j), i = 0, n − 1, j = 0, n − 1). Pentru o soluţie


a(0, 0), a(1, j1 ), ..., a(i, ji ), ..., a(n − 1, jn−1 ) optimă, suma
S(i, ji ) trebuie să fie maximul posibil pornind de la a(i, ji )
2 Relaţia de recurenţă:
S(i, j) = a(i, j) + max{S(i + 1, j), S(i + 1, j + 1)}, i < n − 1
S(i, j) = a(i, j), i = n − 1, pentru i = 0, n − 1 şi 0 ≤ j ≤ i.

sol(i, j) = 0, S(i, j) este maxim pentru alegerea lui a(i + 1, j)


sol(i, j) = 1, S(i, j) este maxim pentru alegerea lui
a(i + 1, j + 1).
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Problema triunghiului

1 S = (S(i, j), i = 0, n − 1, j = 0, n − 1). Pentru o soluţie


a(0, 0), a(1, j1 ), ..., a(i, ji ), ..., a(n − 1, jn−1 ) optimă, suma
S(i, ji ) trebuie să fie maximul posibil pornind de la a(i, ji )
2 Relaţia de recurenţă:
S(i, j) = a(i, j) + max{S(i + 1, j), S(i + 1, j + 1)}, i < n − 1
S(i, j) = a(i, j), i = n − 1, pentru i = 0, n − 1 şi 0 ≤ j ≤ i.
3 Valoarea soluţiei optime va fi S(0, 0).
sol(i, j) = 0, S(i, j) este maxim pentru alegerea lui a(i + 1, j)
sol(i, j) = 1, S(i, j) este maxim pentru alegerea lui
a(i + 1, j + 1).
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Problema celui mai lung subşir crescător

Având un vector de elemente v , să se determine cel mai lung


subşir crescător.
v = {6, 2, 3, 1, 8, 9, 7, 8, 10}
O soluţie optimă: 2, 3, 8, 9, 10
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Problema celui mai lung subşir crescător

1 presupunem că cel mai lung subşir crescător care îl


conţine pe v (p): v (i1 ), v (i2 ), ..., v (p), ..., v (ik ). Atunci cel
mai lung subşir crescător care începe de la poziţia p este
v (p), ..., v (ik ).

s = (s(i), i = 0, n − 1), s(i) va fi acel j pentru care se obţine


maximul din expresia de mai sus şi i în cazul în care L(i) = 1.
Se alege acel i pentru care L(i) este maxim iar soluţia se
construieşte cu ajutorul vectorului s.
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Problema celui mai lung subşir crescător

1 presupunem că cel mai lung subşir crescător care îl


conţine pe v (p): v (i1 ), v (i2 ), ..., v (p), ..., v (ik ). Atunci cel
mai lung subşir crescător care începe de la poziţia p este
v (p), ..., v (ik ).
2 L = (L(i), i = 0, n − 1), pentru fiecare elemente v (i) avem
L(i) = lungimea celui lung subşir crescător care începe de
la pozi¸tia i.
L(i) = 1, i = n − 1
L(i) = 1 + max{L(j), j > i, v (j) ≥ v (i), i < n − 1}

s = (s(i), i = 0, n − 1), s(i) va fi acel j pentru care se obţine


maximul din expresia de mai sus şi i în cazul în care L(i) = 1.
Se alege acel i pentru care L(i) este maxim iar soluţia se
construieşte cu ajutorul vectorului s.
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Problema celui mai lung subşir crescător

1presupunem că cel mai lung subşir crescător care îl


conţine pe v (p): v (i1 ), v (i2 ), ..., v (p), ..., v (ik ). Atunci cel
mai lung subşir crescător care începe de la poziţia p este
v (p), ..., v (ik ).
2 L = (L(i), i = 0, n − 1), pentru fiecare elemente v (i) avem
L(i) = lungimea celui lung subşir crescător care începe de
la pozi¸tia i.
L(i) = 1, i = n − 1
L(i) = 1 + max{L(j), j > i, v (j) ≥ v (i), i < n − 1}
3 valoarea maximă (a soluţiei optime) se obţine pentru
max(L(i), i = 0, n − 1).
s = (s(i), i = 0, n − 1), s(i) va fi acel j pentru care se obţine
maximul din expresia de mai sus şi i în cazul în care L(i) = 1.
Se alege acel i pentru care L(i) este maxim iar soluţia se
construieşte cu ajutorul vectorului s.
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Problema celui mai lung subşir crescător

v = {6, 2, 3, 1, 8, 9, 7, 8, 10}
v (8) = 10, L(8) = 1, s(8) = 8
v (7) = 8, L(7) = 1 + max{L(8)} = 2, s(7) = 8
v (6) = 7, L(6) = 1 + max{L(7), L(8)} = 3, s(6) = 7
v (5) = 9, L(5) = 1 + max{L(8)} = 2, s(5) = 8
v (4) = 8, L(4) = 1 + max{L(5), L(7), L(8)} = 3, s(4) = 5
v (3) = 1, L(3) = 1 + max{L(j), 4 ≤ j ≤ 8} = 4, s(3) = 4
v (2) = 3, L(2) = 1 + max{L(j), 4 ≤ j ≤ 8} = 4, s(2) = 4
v (1) = 2, L(1) = 1 + max{L(2), L(4), L(5), L(6), L(7), L(8)} =
5, s(1) = 2
v (0) = 6, L(0) = 1 + max{L(j), 4 ≤ j ≤ 8} = 4, s(0) = 4
Valoarea soluţiei optime este 5 = lungimea celui mai lung subşir
crescător. O soluţie optimă: 2, 3, 8, 9, 10
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Problema înmulţirii matricelor

Având un şir de matrice A1 , A2 , ..., An care trebuie înmulţite, în


ce ordine efectuăm înmulţirile astfel încât să avem un număr
minim de operaţii?
(Obs) Având matricele A1 şi A2 cu dimensiunile nxm respectiv
mxp, numărul de înmulţiri efectuate este: n ∗ m ∗ p.
Fie A1 , A2 , A3 cu dimensiunile: 10x100, 100x5, 5x50:
(A1 ∗ (A2 ∗ A3 )): (100*5*50)+(10*100*50)=25000+50000 =
75000
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Problema înmulţirii matricelor

Având un şir de matrice A1 , A2 , ..., An care trebuie înmulţite, în


ce ordine efectuăm înmulţirile astfel încât să avem un număr
minim de operaţii?
(Obs) Având matricele A1 şi A2 cu dimensiunile nxm respectiv
mxp, numărul de înmulţiri efectuate este: n ∗ m ∗ p.
Fie A1 , A2 , A3 cu dimensiunile: 10x100, 100x5, 5x50:
(A1 ∗ (A2 ∗ A3 )): (100*5*50)+(10*100*50)=25000+50000 =
75000
((A1 ∗ A2) ∗ A3)): (10*100*5)+(10*5*50)= 5000+2500=
7500
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Problema înmulţirii matricelor - Programare Dinamică

(A1 xA2 x...xAk )x(Ak +1 x...xAn ), subproblemele nu sunt


independente;
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Problema înmulţirii matricelor - Programare Dinamică

(A1 xA2 x...xAk )x(Ak +1 x...xAn ), subproblemele nu sunt


independente;
M[i][j], numărul minim de înmulţiri elementare necesare
pentru a calcula produsul Ai xAi+1 x...xAj , 1 ≤ i ≤ j ≤ n;
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Problema înmulţirii matricelor - Programare Dinamică

(A1 xA2 x...xAk )x(Ak +1 x...xAn ), subproblemele nu sunt


independente;
M[i][j], numărul minim de înmulţiri elementare necesare
pentru a calcula produsul Ai xAi+1 x...xAj , 1 ≤ i ≤ j ≤ n;
M[i][i] = 0, i ∈ {1, 2, ..., n}
M[i][j] = min{M[i][k ]+M[k +1][j]+d[i]∗d[k +1]∗d[j+1]}, i ≤
k ≤ j, i < j
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Problema înmulţirii matricelor - Programare Dinamică

(A1 xA2 x...xAk )x(Ak +1 x...xAn ), subproblemele nu sunt


independente;
M[i][j], numărul minim de înmulţiri elementare necesare
pentru a calcula produsul Ai xAi+1 x...xAj , 1 ≤ i ≤ j ≤ n;
M[i][i] = 0, i ∈ {1, 2, ..., n}
M[i][j] = min{M[i][k ]+M[k +1][j]+d[i]∗d[k +1]∗d[j+1]}, i ≤
k ≤ j, i < j
vom rezolva relaţia de recurenţă în mod bottom-up.
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Alte probleme clasice rezolvabile cu programare dinamică

Algoritmul Floyd-Warshall
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Alte probleme clasice rezolvabile cu programare dinamică

Algoritmul Floyd-Warshall
Subşir comun maximal
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Alte probleme clasice rezolvabile cu programare dinamică

Algoritmul Floyd-Warshall
Subşir comun maximal
Problema sumei în dreptunghi
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Alte probleme clasice rezolvabile cu programare dinamică

Algoritmul Floyd-Warshall
Subşir comun maximal
Problema sumei în dreptunghi
Problema rucsacului - varianta discretă
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Alte probleme clasice rezolvabile cu programare dinamică

Algoritmul Floyd-Warshall
Subşir comun maximal
Problema sumei în dreptunghi
Problema rucsacului - varianta discretă
Problema plata unei sume date
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Tehnica memoizării

optimizează performanţa algoritmilor recursivi;


Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Tehnica memoizării

optimizează performanţa algoritmilor recursivi;


implică rescrierea unor algoritmi recursivi astfel încât cum
sunt găsite soluţii pentru probleme, ele sunt stocate într-un
şir;
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Tehnica memoizării

optimizează performanţa algoritmilor recursivi;


implică rescrierea unor algoritmi recursivi astfel încât cum
sunt găsite soluţii pentru probleme, ele sunt stocate într-un
şir;
apelurile recursive pot căuta valorile în şir, fără a recalcula;
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Tehnica memoizării

optimizează performanţa algoritmilor recursivi;


implică rescrierea unor algoritmi recursivi astfel încât cum
sunt găsite soluţii pentru probleme, ele sunt stocate într-un
şir;
apelurile recursive pot căuta valorile în şir, fără a recalcula;
memoizarea optimizează performanţa deoarece nu
permite recalcularea unor rezultate deja calculate;
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Tehnica memoizării

optimizează performanţa algoritmilor recursivi;


implică rescrierea unor algoritmi recursivi astfel încât cum
sunt găsite soluţii pentru probleme, ele sunt stocate într-un
şir;
apelurile recursive pot căuta valorile în şir, fără a recalcula;
memoizarea optimizează performanţa deoarece nu
permite recalcularea unor rezultate deja calculate;
se combină abordarea descendentă (top down) cu cea
ascendentă (bottom up).
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Tehnica memoizării

Şirul lui Fibonacci: 0,1,1,2,3,5,8,13,21,34,55,89,...


Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Tehnica memoizării

Şirul lui Fibonacci: 0,1,1,2,3,5,8,13,21,34,55,89,...


Să se determine al n-lea număr al şirului lui Fibonacci.
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Tehnica memoizării

Şirul lui Fibonacci: 0,1,1,2,3,5,8,13,21,34,55,89,...


Să se determine al n-lea număr al şirului lui Fibonacci.
Calculul recursiv
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Tehnica memoizării

Şirul lui Fibonacci: 0,1,1,2,3,5,8,13,21,34,55,89,...


Să se determine al n-lea număr al şirului lui Fibonacci.
Calculul recursiv
Calcul cu memoizare - valorile termenilor din şir sunt
memorate în tablou - se utilizează spaţiu adiţional -
eficienţă de timp
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Tehnica memoizării

Şirul lui Fibonacci: 0,1,1,2,3,5,8,13,21,34,55,89,...


Să se determine al n-lea număr al şirului lui Fibonacci.
Calculul recursiv
Calcul cu memoizare - valorile termenilor din şir sunt
memorate în tablou - se utilizează spaţiu adiţional -
eficienţă de timp
Eficienţă - dpdv timp de execuţie şi memorie utilizată
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Programare Dinamică - Avantaje şi dezavantaje

Avantaje:
timp salvat şi spaţiu salvat, nu se recalculează valorile
calculate deja;

Dezavantaje:
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Programare Dinamică - Avantaje şi dezavantaje

Avantaje:
timp salvat şi spaţiu salvat, nu se recalculează valorile
calculate deja;
oferă întotdeauna soluţie optimă.
Dezavantaje:
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Programare Dinamică - Avantaje şi dezavantaje

Avantaje:
timp salvat şi spaţiu salvat, nu se recalculează valorile
calculate deja;
oferă întotdeauna soluţie optimă.
Dezavantaje:
lipsa unor "reţete de rezolvare" generalizate;
Programare Dinamică - Prezentare generală Programare Dinamică - Discuţii şi probleme Tehnica memoizării Concluzii

Programare Dinamică - Avantaje şi dezavantaje

Avantaje:
timp salvat şi spaţiu salvat, nu se recalculează valorile
calculate deja;
oferă întotdeauna soluţie optimă.
Dezavantaje:
lipsa unor "reţete de rezolvare" generalizate;
de obicei, problemele rezolvabile cu PD sunt de o
complexitate ridicată.

You might also like