Differences

This shows you the differences between two versions of the page.

Link to this comparison view

sda-ab:laboratoare:13 [2021/03/11 00:10]
david.broscoteanu [3.1 Descriere]
sda-ab:laboratoare:13 [2021/03/11 12:50] (current)
david.broscoteanu
Line 1: Line 1:
 ===== Laboratorul 12: Programare dinamica si divide et impera ===== ===== Laboratorul 12: Programare dinamica si divide et impera =====
 +\\
 =====1 Obiectivele laboratorului===== =====1 Obiectivele laboratorului=====
   * Înțelegerea noțiunilor de bază legate de programarea dinamică   * Înțelegerea noțiunilor de bază legate de programarea dinamică
   * Însușirea abilităților de implementare a algoritmilor bazați pe programarea dinamică   * Însușirea abilităților de implementare a algoritmilor bazați pe programarea dinamică
   * Î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//.
 \\ \\
 \\ \\
Line 69: Line 69:
 //coef(P, k) = coef(X P, k+1)//, pentru orice polinom P şi pentru orice număr natural k. //coef(P, k) = coef(X P, k+1)//, pentru orice polinom P şi pentru orice număr natural k.
  
-Putem deduce o legătură între coeficienţii polinoamelor de tipul P(n) dacă scriem P(n + 1) = (X + 1) P(n) = X P(n) + P(n).+Putem deduce o legătură între coeficienţii polinoamelor de tipul P(n) dacă scriem ​**P(n + 1) = (X + 1) P(n) = X P(n) + P(n)**.
  
 <note tip> <note tip>
Line 75: Line 75:
   * coef(**P(n + 1), k**) = coef( X P(n), k) + coef(P(n), k) = **coef(P(n),​ k-1) + coef(P(n), k)**, pentru orice număr natural (k-1).   * coef(**P(n + 1), k**) = coef( X P(n), k) + coef(P(n), k) = **coef(P(n),​ k-1) + coef(P(n), k)**, pentru orice număr natural (k-1).
  
-Dar coef(P(n), k) = C(n, k), deci am obţinut o recurenţă ce foloseşte doar o adunare.+Dar **coef(P(n), k) = C(n, k)**, deci am obţinut o recurenţă ce foloseşte doar o adunare.
 </​note>​ </​note>​
  
 ==== Exerciții ==== ==== Exerciții ====
  
-  - Construiți o funcție care calculează f(n), unde f = șirul lui Fibonacci;​ +  - Construiți o funcție care calculează ​//f(n)//, unde **f = șirul lui Fibonacci**
-  - Construiți o funcție care calculează f(n, k), unde f = combinări de n luate câte k; +  - Construiți o funcție care calculează ​//f(n, k)//, unde **f = combinări de n luate câte k**
-  - implementați problema rucsacului;​ +  - implementați ​**problema rucsacului**
-  - Construiți o funcție care indică ordinea operațiilor la înmulțirea a N matrici pentru a minimiza numărul de înmulțiri între 2 numere; +  - Construiți o funcție care indică ordinea operațiilor la //înmulțirea a N matrici pentru a minimiza numărul de înmulțiri între 2 numere//
-  - construiți o funcție care calculează f(n) = 5<​sup>​n</​sup>​ % k, unde k este o valoare fixată de la începutul programului;​ +  - construiți o funcție care calculează ​//f(n) = 5<​sup>​n</​sup>​ % k//, unde k este o valoare fixată de la începutul programului;​ 
-  - Se dă un vector cu N elemente (v = [v1 v2 ... vn]) ce poate fi secționat în piese după următoarele reguli: ​a) inițial, tot vectorul reprezintă o piesă; ​b) o piesă poate reprezenta doar o bucată continuă (nu sare peste vreun element) din vectorul inițial; ​c) secționarea unei piese duce la înlocuirea piesei respective cu 2 piese mai mici, fără a se pierde niciun element din vector; ​d) valoarea unei piese este val = (lungimea piesei) x (suma elementelor din piesă). Găsiți secțiunile ce maximizează suma valorilor pieselor.+  - Se dă un vector cu N elemente ​//(v = [v1 v2 ... vn])// ce poate fi secționat în piese după următoarele reguli: ​ 
 +     ​- ​inițial, tot vectorul reprezintă o piesă; 
 +     ​- ​o piesă poate reprezenta doar o bucată continuă (nu sare peste vreun element) din vectorul inițial; 
 +     ​- ​secționarea unei piese duce la înlocuirea piesei respective cu 2 piese mai mici, fără a se pierde niciun element din vector; 
 +     ​- ​valoarea unei piese este val = (lungimea piesei) x (suma elementelor din piesă). Găsiți secțiunile ce maximizează suma valorilor pieselor. 
  
 =====3 Paradigma Divide et impera ===== =====3 Paradigma Divide et impera =====
Line 121: Line 126:
 Singura operație case se poate efectua este de selecta un disc ce se află în vârful unei tije si plasarea lui în vârful altei tije,astfel încât să nu fie așezat deasupra unui disc de dimensiune mai mică decât a sa.\\  Singura operație case se poate efectua este de selecta un disc ce se află în vârful unei tije si plasarea lui în vârful altei tije,astfel încât să nu fie așezat deasupra unui disc de dimensiune mai mică decât a sa.\\ 
 Să se găsească un algoritm prin ca\re se mută toate discurile pe tija B.\\  Să se găsească un algoritm prin ca\re se mută toate discurile pe tija B.\\ 
-{{:​laboratoare:​hanoi1.jpg?​300|#​poza cu tijele#}} + 
-{{ :​laboratoare:​hanoi2.jpg?​300|}}+{{:sda-ab:​laboratoare:​hanoi1.jpg?​300|#​poza cu tijele#}} 
 +{{:sda-ab:​laboratoare:​hanoi2.jpg?​300|}}
  
 <note tip> <note tip>
Line 170: Line 176:
   * Altfel daca //f(m) * f(b) > 0//,​soluția se află în prima jumătate a intervalului și ii atribuim lui β valoarea lui m.   * Altfel daca //f(m) * f(b) > 0//,​soluția se află în prima jumătate a intervalului și ii atribuim lui β valoarea lui m.
   * Acest procedeu se aplică în mod repetat până când lungimea intervalului scade cu 2*ε(β - α < 2*ε)\\ ​   * Acest procedeu se aplică în mod repetat până când lungimea intervalului scade cu 2*ε(β - α < 2*ε)\\ ​
- +{{ sda-ab:​laboratoare:​bisectie.jpg?​400|#​poza funcție#​}} 
-{{ :​laboratoare:​bisectie.jpg?​400 |#poza funcție#​}} +\\
 ===3.4.4 Fractali=== ===3.4.4 Fractali===
 Fractalii de tip Divide-et-Impera sunt construiți,​ după cum sugerează numele, prin //​spargerea//​ componentei principale în mai multe părți și aplicarea //​spargerii//​ asupra componentelor mai //mici// rezultate, până când se ajunge la cazul (componenta) de bază. La aceasta se ajunge efectuând un număr de apeluri ale funcției recursive egal cu numărul introdus.\\ ​ Fractalii de tip Divide-et-Impera sunt construiți,​ după cum sugerează numele, prin //​spargerea//​ componentei principale în mai multe părți și aplicarea //​spargerii//​ asupra componentelor mai //mici// rezultate, până când se ajunge la cazul (componenta) de bază. La aceasta se ajunge efectuând un număr de apeluri ale funcției recursive egal cu numărul introdus.\\ ​
 Fractalii generați prin metode Divide-et-Impera au la bază un model simplu, pe baza căruia se adaugă (în cazul arborilor și al triunghiului lui Sierpinski) sau se înlocuiesc (în cazul fractalilor Koch) segmente, după o regulă bine definită, așa cum se poate observa:​\\ ​ Fractalii generați prin metode Divide-et-Impera au la bază un model simplu, pe baza căruia se adaugă (în cazul arborilor și al triunghiului lui Sierpinski) sau se înlocuiesc (în cazul fractalilor Koch) segmente, după o regulă bine definită, așa cum se poate observa:​\\ ​
-{{ :​laboratoare:​fractali1.jpg?​400 |# poza fractali arbore#}}+{{ :sda-ab:​laboratoare:​fractali1.jpg?​400 |# poza fractali arbore#}}
  
 Se calculează coordonatele punctului de sfârșit al liniei ce trebuie reprezentată,​ în funcție de lungimea acesteia și de unghiul sub care va fi desenată.\\ ​ Se calculează coordonatele punctului de sfârșit al liniei ce trebuie reprezentată,​ în funcție de lungimea acesteia și de unghiul sub care va fi desenată.\\ ​
Line 185: Line 190:
 La fractalul de tip Koch triunghiular,​ coordonatele care ne interesează se află la prima treime, a doua treime și jumatatea segmentului. La fiecare dintre acestea, unghiul de desenare se modifică cu 60°,​-120°,​ respectiv 60°. \\  La fractalul de tip Koch triunghiular,​ coordonatele care ne interesează se află la prima treime, a doua treime și jumatatea segmentului. La fiecare dintre acestea, unghiul de desenare se modifică cu 60°,​-120°,​ respectiv 60°. \\ 
  
-{{ :​laboratoare:​fractali2.jpg?​400 |#poza fractali Koch triunghiular#​}}+{{ :sda-ab:​laboratoare:​fractali2.jpg?​400 |#poza fractali Koch triunghiular#​}}
  
 Ca și în cazul arborelui,​fractalul **Sierpinski** este construit prin adăugarea de linii la imaginea generată până în acel moment, până când nivelul devine mai mic decât n.\\  Ca și în cazul arborelui,​fractalul **Sierpinski** este construit prin adăugarea de linii la imaginea generată până în acel moment, până când nivelul devine mai mic decât n.\\ 
 Se pornește de la un triunghi în care au fost desenate liniile mijlocii și se desenează liniile mijlocii ale triunghiurilor mai mici marginale formate. \\  Se pornește de la un triunghi în care au fost desenate liniile mijlocii și se desenează liniile mijlocii ale triunghiurilor mai mici marginale formate. \\ 
-{{ :​laboratoare:​fractali3.jpg?​400 |# poza fractali sierpinski#​}}+{{ :sda-ab:​laboratoare:​fractali3.jpg?​400 |# poza fractali sierpinski#​}}
  
 **Aplicații practice!** \\  **Aplicații practice!** \\ 
Line 197: Line 202:
   * Tehnica copiază imaginea originală în 2 seturi: ranguri și domenii, apoi computer-ul face legătura fiecărui rang cu un domeniu și produce o trasformare de la domeniu la rang:​\\ ​   * Tehnica copiază imaginea originală în 2 seturi: ranguri și domenii, apoi computer-ul face legătura fiecărui rang cu un domeniu și produce o trasformare de la domeniu la rang:​\\ ​
  
-{{ :​laboratoare:​fractali4.png?​400 |# poza compresia de data#}}+{{ :sda-ab:​laboratoare:​fractali4.png?​400 |# poza compresia de data#}}
  
 ===3.4.5 Parser top-down=== ===3.4.5 Parser top-down===
Line 208: Line 213:
   * **Gestiunea structurilor de date**   * **Gestiunea structurilor de date**
   * **Tratarea erorilor**\\ ​   * **Tratarea erorilor**\\ ​
-\\ {{ :​laboratoare:​parser2.jpg?​600 |# poza etapele procesului de compilare#}}+ 
 +{{:sda-ab:​laboratoare:​parser2.jpg?​600|}}
  
 Vom trata problema analizei sintactice care are două obiective principale: Vom trata problema analizei sintactice care are două obiective principale:
sda-ab/laboratoare/13.1615414206.txt.gz · Last modified: 2021/03/11 00:10 by david.broscoteanu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0