This shows you the differences between two versions of the page.
sda-ab:cursuri:12 [2021/03/10 23:45] david.broscoteanu [2.3 Probleme tip rezolvate cu acest algoritm] |
sda-ab:cursuri:12 [2021/03/10 23:54] (current) david.broscoteanu [2.1 Prezentare generală] |
||
---|---|---|---|
Line 6: | Line 6: | ||
* Înțelegerea aplicabilității practice a programării dinamice în: | * Înțelegerea aplicabilității practice a programării dinamice în: | ||
* Genetică (sequence alignment) | * Genetică (sequence alignment) | ||
- | * Teoria grafurilor (algoritmul Floyd-Warshall) | + | * //Teoria grafurilor (algoritmul Floyd-Warshall)// |
* Limbaje formale și automate (algoritmul Cocke-Younger-Kasami,care analizează dacă și în ce fel un șir poate fi generat de o gramatică independentă de context) | * Limbaje formale și automate (algoritmul Cocke-Younger-Kasami,care analizează dacă și în ce fel un șir poate fi generat de o gramatică independentă de context) | ||
* Implementarea bazelor de date (algoritmul Selinger pentru optimizarea interogării relaționale) | * Implementarea bazelor de date (algoritmul Selinger pentru optimizarea interogării relaționale) | ||
Line 15: | Line 15: | ||
Programarea dinamică presupune rezolvarea unei probleme prin descompunea ei în subprobleme și rezolvarea acestora. Spre deosebire de divide et impera, subprogramele nu sunt disjuncte, ci se suprapun.\\ | Programarea dinamică presupune rezolvarea unei probleme prin descompunea ei în subprobleme și rezolvarea acestora. Spre deosebire de divide et impera, subprogramele nu sunt disjuncte, ci se suprapun.\\ | ||
\\ | \\ | ||
- | Pentru a evita recalcularea porțiunilor care se suprapun, rezolvarea se face pornind de la cele mai mici subprograme și folosindu-ne de rezultatul acestora calculăm subproblema imediat mai mare. Cele mai mici subprobleme sunt numite subprobleme unitare, acestea putând fi rezolvate într-o complexitate constantă, ex:cea mai mare secvență dintr-o mulțime de un singur element. | + | Pentru a evita recalcularea porțiunilor care se suprapun, rezolvarea se face pornind de la cele mai mici subprograme și folosindu-ne de rezultatul acestora calculăm subproblema imediat mai mare. Cele mai mici subprobleme sunt numite **subprobleme unitare**, acestea putând fi rezolvate într-o **complexitate constantă**, //ex:cea mai mare secvență dintr-o mulțime de un singur element//. |
Line 29: | Line 29: | ||
====2.3 Probleme tip rezolvate cu acest algoritm==== | ====2.3 Probleme tip rezolvate cu acest algoritm==== | ||
===2.3.1 Problema rucsacului=== | ===2.3.1 Problema rucsacului=== | ||
- | Soluția se construiește prin programare dinamică, D[i][j]=cel mai bun cost obținut pentru primele i obiecte, având greutatea maxim j.\\ | + | Soluția se construiește prin programare dinamică, **D[i][j]=cel mai bun cost obținut pentru primele i obiecte, având greutatea maxim j**.\\ |
Relația de recurență este următoarea: **D[i][j]=maxim(D[i-1][j],D[i-1][j-G[i]]+C[i])**,unde **G[i]=greutatea obiectului i**, iar **C[i]=costul obiectului**.\\ | Relația de recurență este următoarea: **D[i][j]=maxim(D[i-1][j],D[i-1][j-G[i]]+C[i])**,unde **G[i]=greutatea obiectului i**, iar **C[i]=costul obiectului**.\\ | ||
- | Ideea este următoarea: La soluția curentă ori nu adăugăm deloc obiectul i, și rămânem la costul pentru i-1 obiecte, ori adăugăm obiectul i, caz în care adăugăm costul lui la costul obținut pentru primele i-1 obiecte și greutate j-G[i].\\ | + | Ideea este următoarea: //La soluția curentă ori nu adăugăm deloc obiectul i, și rămânem la costul pentru i-1 obiecte, ori adăugăm obiectul i, caz în care adăugăm costul lui la costul obținut pentru primele i-1 obiecte și greutate j-G[i]//.\\ |
===2.3.2 Determinarea celui mai lung subșir crescător=== | ===2.3.2 Determinarea celui mai lung subșir crescător=== | ||
Line 51: | Line 51: | ||
Fie C<sub>n,k</sub> notat şi C(n, k) = combinări de n luate câte k. | Fie C<sub>n,k</sub> notat şi C(n, k) = combinări de n luate câte k. | ||
\\ | \\ | ||
- | Atunci C(n, k) = n! / ( k! (n-k)! ). | + | Atunci **C(n, k) = n! / ( k! (n-k)! )**. |
<note important> | <note important> | ||
Se poate deduce o formulă ce necesită o înmulţire şi o împărţire pentru calcularea unei combinări, deşi există o recurenţă mai bună. | Se poate deduce o formulă ce necesită o înmulţire şi o împărţire pentru calcularea unei combinări, deşi există o recurenţă mai bună. | ||
- | * C(n+1, k) = (n+1)! / (k! (n+1-k)! ) = ( (n+1) / (n+1-k) ) C(n, k); | + | * **C(n+1, k) = (n+1)! / (k! (n+1-k)! ) = ( (n+1) / (n+1-k) ) C(n, k)**; |
</note> | </note> | ||
- | Totodată, dacă definim polinoamele P(n) := (X + 1)<sup>n</sup> , atunci se pot rescrie P(n) = ∏ (C<sub>n,k</sub> X<sup>k</sup>), unde k = 0,1,2,...,n. | + | Totodată, dacă definim polinoamele P(n) := (X + 1)<sup>n</sup> , atunci se pot rescrie **P(n) = ∏ (C<sub>n,k</sub> X<sup>k</sup>)**, unde //k = 0,1,2,...,n//. |
\\ | \\ | ||
\\ | \\ |