Differences

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

Link to this comparison view

pa:laboratoare:laborator-02 [2021/03/08 22:00]
mara_ioana.nicolae [Rucsac]
pa:laboratoare:laborator-02 [2022/03/01 23:42] (current)
darius.neatu [Laborator 02 : Greedy]
Line 1: Line 1:
 ====== Laborator 02 : Greedy====== ====== Laborator 02 : Greedy======
-Responsabili:​ 
-  * [[neatudarius@gmail.com|Darius-Florentin Neațu (2017-2021)]] 
-  * [[radunichita99@gmail.com | Radu Nichita (2021)]] 
-  * [[cristianolaru99@gmail.com | Cristian Olaru (2021)]] 
-  * [[mirunaelena.banu@gmail.com ​ | Miruna-Elena Banu (2021)]] 
-  * [[maraioana9967@gmail.com | Mara-Ioana Nicolae (2021)]] 
-  * [[stefanpopa2209@gmail.com | Ștefan Popa (2018-2020)]] 
  
-Autori: 
-  * [[rotarualexandruandrei94@gmail.com| Alex Rotaru (2018)]] 
-  * [[neatudarius@gmail.com|Darius-Florentin Neațu (2018)]] 
-  * [[visanr95@gmail.com|Radu Vișan (2018)]] 
-  * [[cristb@gmail.com|Cristian Banu (2018)]] 
-  ​ 
 ===== Obiective laborator ===== ===== Obiective laborator =====
   *Înțelegerea noțiunilor de bază legate de tehnica greedy    *Înțelegerea noțiunilor de bază legate de tehnica greedy
Line 22: Line 9:
 Toate exemplele de cod se găsesc pe pagina [[https://​github.com/​acs-pa/​pa-lab/​tree/​main/​demo/​lab02|pa-lab::​demo/​lab02]]. Toate exemplele de cod se găsesc pe pagina [[https://​github.com/​acs-pa/​pa-lab/​tree/​main/​demo/​lab02|pa-lab::​demo/​lab02]].
  
-Exemplele de cod apar încorporate și în textul laboratorului pentru a facilita parcurgerea cursivă a acestuia. ATENȚIE! Varianta actualizată a acestor exemple se găsește întotdeauna pe GitHub.+Exemplele de cod apar încorporate și în textul laboratorului pentru a facilita parcurgerea cursivă a acestuia. ​**ATENȚIE!** Varianta actualizată a acestor exemple se găsește întotdeauna pe GitHub.
 </​note>​ </​note>​
  
   * Toate bucățile de cod prezentate în partea introductivă a laboratorului (înainte de exerciții) au fost testate. Cu toate acestea, este posibil ca din cauza mai multor factori (formatare, caractere invizibile puse de browser etc.) un simplu copy-paste să nu fie de ajuns pentru a compila codul.   * Toate bucățile de cod prezentate în partea introductivă a laboratorului (înainte de exerciții) au fost testate. Cu toate acestea, este posibil ca din cauza mai multor factori (formatare, caractere invizibile puse de browser etc.) un simplu copy-paste să nu fie de ajuns pentru a compila codul.
   * Vă rugăm să compilați **DOAR** codul de pe GitHub. Pentru raportarea problemelor,​ contactați unul dintre maintaineri. ​   * Vă rugăm să compilați **DOAR** codul de pe GitHub. Pentru raportarea problemelor,​ contactați unul dintre maintaineri. ​
-  * Pentru orice problemă legată de conținutul acestei pagini, vă rugam să dați e-mail unuia dintre responsabili.+  * Pentru orice problemă legată de conținutul acestei pagini, vă rugăm ​să dați e-mail unuia dintre responsabili.
  
 ===== Importanță – aplicații practice ===== ===== Importanță – aplicații practice =====
-În general tehnicile de tip greedy sau programare dinamică (lab04) sunt folosite pentru rezolvarea problemelor de optimizare. Acestea pot adresa probleme în sine sau pot fi subprobleme dintr-un algoritm mai mare. De exemplu, algoritmul Dijkstra pentru determinarea drumului minim pe un graf alege la fiecare pas un nod nou urmărind algoritmul greedy.+În general tehnicile de tip greedy sau programare dinamică (următoarele laboratoare) sunt folosite pentru rezolvarea problemelor de optimizare. Acestea pot adresa probleme în sine sau pot fi subprobleme dintr-un algoritm mai mare. De exemplu, algoritmul Dijkstra pentru determinarea drumului minim pe un graf alege la fiecare pas un nod nou urmărind algoritmul greedy.
  
 Există însă probleme care ne pot induce în eroare. Astfel, există probleme în care urmărind criteriul greedy nu ajungem la soluția optimă. Este foarte important să identificăm cazurile când se poate aplica greedy și cazurile când este nevoie de altceva. Alteori această soluție neoptimă este o aproximare suficientă pentru ce avem nevoie. Problemele NP-complete necesita multă putere de calcul pentru a găsi optimul absolut. Pentru a optimiza aceste calcule mulți algoritmi folosesc decizii greedy și găsesc un optim foarte aproape de cel absolut. Există însă probleme care ne pot induce în eroare. Astfel, există probleme în care urmărind criteriul greedy nu ajungem la soluția optimă. Este foarte important să identificăm cazurile când se poate aplica greedy și cazurile când este nevoie de altceva. Alteori această soluție neoptimă este o aproximare suficientă pentru ce avem nevoie. Problemele NP-complete necesita multă putere de calcul pentru a găsi optimul absolut. Pentru a optimiza aceste calcule mulți algoritmi folosesc decizii greedy și găsesc un optim foarte aproape de cel absolut.
Line 37: Line 24:
  
 “greedy” = “lacom”. Algoritmii de tip greedy vor să construiască într-un mod cât mai rapid soluția unei probleme. Ei se caracterizează prin luarea unor decizii rapide care duc la găsirea unei potențiale soluții a problemei. Nu întotdeauna asemenea decizii rapide duc la o soluție optimă; astfel ne vom concentra atenția pe identificarea acelor anumite tipuri de probleme pentru care se pot obține soluții optime. “greedy” = “lacom”. Algoritmii de tip greedy vor să construiască într-un mod cât mai rapid soluția unei probleme. Ei se caracterizează prin luarea unor decizii rapide care duc la găsirea unei potențiale soluții a problemei. Nu întotdeauna asemenea decizii rapide duc la o soluție optimă; astfel ne vom concentra atenția pe identificarea acelor anumite tipuri de probleme pentru care se pot obține soluții optime.
-În general există mai multe soluții posibile ale problemei. Dintre acestea se pot selecta doar anumite soluții optime, conform unor anumite criterii. Algoritmii greedy se numără printre cei mai direcți algoritmi posibili. Ideea de bază este simplă: având o problema ​de optimizare, de calcul al unui cost minim sau maxim, se va alege la fiecare pas decizia cea mai favorabilă,​ fără a evalua global eficiența soluţiei. Scopul este de a găsi una dintre acestea sau dacă nu este posibil, atunci o soluție cât mai apropiată, conform criteriului optimal impus.+În general există mai multe soluții posibile ale problemei. Dintre acestea se pot selecta doar anumite soluții optime, conform unor anumite criterii. Algoritmii greedy se numără printre cei mai direcți algoritmi posibili. Ideea de bază este simplă: având o problemă ​de optimizare, de calcul al unui cost minim sau maxim, se va alege la fiecare pas decizia cea mai favorabilă,​ fără a evalua global eficiența soluţiei. Scopul este de a găsi una dintre acestea sau dacă nu este posibil, atunci o soluție cât mai apropiată, conform criteriului optimal impus.
  
 Trebuie înțeles faptul că rezultatul obținut este optim doar dacă un optim local conduce la un optim global. În cazul în care deciziile de la un pas influențează lista de decizii de la pasul următor, este posibilă obținerea unei valori neoptimale. În astfel de cazuri, pentru găsirea unui optim absolut se ajunge la soluții supra-polinomiale. De aceea, dacă se optează pentru o astfel de soluție, algoritmul trebuie însoțit de o demonstrație de corectitudine. Trebuie înțeles faptul că rezultatul obținut este optim doar dacă un optim local conduce la un optim global. În cazul în care deciziile de la un pas influențează lista de decizii de la pasul următor, este posibilă obținerea unei valori neoptimale. În astfel de cazuri, pentru găsirea unui optim absolut se ajunge la soluții supra-polinomiale. De aceea, dacă se optează pentru o astfel de soluție, algoritmul trebuie însoțit de o demonstrație de corectitudine.
Line 261: Line 248:
   * ** complexitate spațială **: depinde de algoritmul de sortare folosit.   * ** complexitate spațială **: depinde de algoritmul de sortare folosit.
  
 +
 +Problema se poate testa pe leetcode: [[https://​leetcode.com/​problems/​minimum-number-of-arrows-to-burst-balloons/​|Minimum Number of Arrows to Burst Balloons]] (altă poveste).
  
 ===== Concluzii şi observații ===== ===== Concluzii şi observații =====
Line 309: Line 298:
 Output: 180 Output: 180
 Explicație:​ Explicație:​
-Sortăm obiectele după raportul valoare / profit si avem în ordine: {30, 120}, {20, 60}, {50, 100}+Sortăm obiectele după raportul valoare / profit si avem în ordine: {30, 120}, {20, 60}, {50, 100}.
 Introducem obiecte până când umplem sacul => intră primele 2 obiecte. Calculăm profitul 120 + 60 = 180 Introducem obiecte până când umplem sacul => intră primele 2 obiecte. Calculăm profitul 120 + 60 = 180
 </​spoiler>​ </​spoiler>​
  
  
-==== Distante ​==== +==== Distanțe ​==== 
-Consideram ​localitati ​$A$ si $B$ aflate la distanta ​$D$. Intre cele 2 localitati ​avem un numar de $n$ benzinarii, date prin distanta fata de localitatea $A$. Masina ​cu care se efectueaza ​deplasarea ​intre cele 2 localitati ​poate parcurge maxim $m$ kilometri ​avand rezervorul plin la inceput. Se doreste ​parcurgerea drumului cu un numar minim de opriri la benzinarii ​pentru realimentare (dupa fiecare oprire la o benzinariemasina pleaca ​cu rezervorul plin).+Considerăm ​localități ​$A$ și $B$ aflate la distanța ​$D$. Între ​cele 2 localități ​avem un număr ​de $n$ benzinării, date prin distanța față ​de localitatea $A$. Mașina ​cu care se efectuează ​deplasarea ​între ​cele 2 localități ​poate parcurge maxim $m$ kilometri ​având ​rezervorul plin la început. Se dorește ​parcurgerea drumului cu un număr ​minim de opriri la benzinării ​pentru realimentare (după fiecare oprire la o benzinăriemașina pleacă ​cu rezervorul plin).
  
-Distantele catre benzinarii ​se reprezinta ​printr-o ​lista de forma $0 < d1 < d2 < ... < dn$, unde $di$ ($1 <= i <= n$) reprezinta distanta ​de la $A$ la benzinaria ​$i$. Pentru simplitate, se considera ca localitatea $A$ se afla la $0$, iar $dn = D$ (localitatea $B$ se afla in acelasi ​loc cu ultima ​benzinarie).+Distanțele către benzinării ​se reprezintă ​printr-o ​listă ​de forma $0 < d1 < d2 < ... < dn$, unde $di$ ($1 <= i <= n$) reprezintă distanța ​de la $A$ la benzinăria ​$i$. Pentru simplitate, se consideră că localitatea $A$ se află la $0$, iar $dn = D$ (localitatea $B$ se află in același ​loc cu ultima ​benzinărie).
  
-Se garanteaza ca exista ​o planificare ​valida ​a opririlor astfel ​incat sa se poata ajunge la localitatea $B$.+Se garantează că există ​o planificare ​validă ​a opririlor astfel ​încât să se poată ​ajunge la localitatea $B$.
  
 <​hidden>​ <​hidden>​
Line 333: Line 322:
  
  
-Raspunsul ​este $3$, efectuand ​3 opriri la a 2-a, a 3-a, respectiv a 4-a benzinarie.+Răspunsul ​este $3$, efectuând ​3 opriri la a 2-a, a 3-a, respectiv a 4-a benzinărie.
 </​spoiler>​ </​spoiler>​
  
Line 340: Line 329:
 ==== Teme la ACS ==== ==== Teme la ACS ====
  
-Pe parcursul unui semestru, un student are de rezolvat $n$ teme (nimic nou pana aici...). Se cunosc enunțurile tuturor celor $n$ teme de la **începutul semestrului**. ​+Pe parcursul unui semestru, un student are de rezolvat $n$ teme (nimic nou până ​aici...). Se cunosc enunțurile tuturor celor $n$ teme de la **începutul semestrului**. ​
  
-Timpul de rezolvare pentru oricare dintre teme este de **o săptămână** și **nu** se poate lucra la mai multe teme în același timp. Pentru fiecare ​tema se cunoaște un termen ​limita ​$d[i]$ (exprimat în săptămâni - deadline pentru tema $i$) și un punctaj $p[i]$. ​+Timpul de rezolvare pentru oricare dintre teme este de **o săptămână** și **nu** se poate lucra la mai multe teme în același timp. Pentru fiecare ​temă se cunoaște un termen ​limită ​$d[i]$ (exprimat în săptămâni - deadline pentru tema $i$) și un punctaj $p[i]$. ​
  
 Nicio fracțiune din punctaj nu se mai poate obține după expirarea termenului limită. ​ Nicio fracțiune din punctaj nu se mai poate obține după expirarea termenului limită. ​
Line 348: Line 337:
 Task-uri: Task-uri:
   * Să se definească o planificare de realizare a temelor, în așa fel încât punctajul obținut să fie **maxim**.   * Să se definească o planificare de realizare a temelor, în așa fel încât punctajul obținut să fie **maxim**.
-  * Care este complexitatea ​solutiei ​(timp + spatiu)? De ce?+  * Care este complexitatea ​soluției ​(timp + spațiu)? De ce?
  
  
Line 358: Line 347:
 Output: ​ $1 + 4 + 5 + 5 + 8 = 23$ Output: ​ $1 + 4 + 5 + 5 + 8 = 23$
  
-Explicatie: Putem face toate temele deoarece ​pana ajungem la deadline-urile lor avem suficiente ​unitati ​de timp.+Explicație: Putem face toate temele deoarece ​până ​ajungem la deadline-urile lor avem suficiente ​unități ​de timp.
 </​spoiler>​ </​spoiler>​
  
Line 368: Line 357:
 Output: $5 + 6 + 9 + 10 + 2 + 4 + 6 = 42$ Output: $5 + 6 + 9 + 10 + 2 + 4 + 6 = 42$
  
-ExplicatiePana in deadline 3 avem la dispozitie ​unitati ​de timp si 4 teme. Deci sortam dupa punctaj ​si le includem pe cele mai valoroase: 5, 6 ,9. Pana la deadline 9 avem la dispoztie ​unitati ​de timp si 4 teme. Le includem pe toate.+ExplicațiePână în deadline 3 avem la dispoziție ​unități ​de timp și 4 teme. Deci sortăm după punctaj ​și le includem pe cele mai valoroase: 5, 6, 9. Până ​la deadline 9 avem la dispoziție ​unități ​de timp și 4 teme. Le includem pe toate.
 </​spoiler>​ </​spoiler>​
  
Line 375: Line 364:
  
 ==== BONUS  ==== ==== BONUS  ====
-Rezolvati ​problema [[http://​codeforces.com/​problemset/​problem/​779/​C | Dishonest Sellers]].+Rezolvați ​problema [[http://​codeforces.com/​problemset/​problem/​779/​C | Dishonest Sellers]].
  
 Hint: [[http://​codeforces.com/​blog/​entry/​50724 | aici ]]. Hint: [[http://​codeforces.com/​blog/​entry/​50724 | aici ]].
Line 382: Line 371:
 <spoiler MaxSum> <spoiler MaxSum>
  
-Incercati ​problema [[https://​www.hackerrank.com/​contests/​test-practic-pa-2017-v1-plumbus/​challenges/​1-1-usoare | MaxSum ]] de la test PA 2017.+Incercați ​problema [[https://​www.hackerrank.com/​contests/​test-practic-pa-2017-v1-plumbus/​challenges/​1-1-usoare | MaxSum ]] de la test PA 2017.
  
 </​spoiler>​ </​spoiler>​
  
 <spoiler MyPoints>​ <spoiler MyPoints>​
-Problema 1 de la tema PA 2017. Puteti descarca enuntul si checkerul de [[https://​ocw.cs.pub.ro/​courses/​_media/​pa/​teme/​pa2017_tema1.zip|aici]].+Problema 1 de la tema PA 2017. Puteți descărca enunțul și checkerul de [[https://​ocw.cs.pub.ro/​courses/​_media/​pa/​teme/​pa2017_tema1.zip|aici]].
 </​spoiler>​ </​spoiler>​
  
  
 <spoiler Stropitorile lui Gigel> <spoiler Stropitorile lui Gigel>
-Problema 3 de la tema PA 2017. Puteti descarca enuntul si checkerul de [[https://​ocw.cs.pub.ro/​courses/​_media/​pa/​teme/​pa2017_tema1.zip|aici]].+Problema 3 de la tema PA 2017. Puteți descărca enunțul și checkerul de [[https://​ocw.cs.pub.ro/​courses/​_media/​pa/​teme/​pa2017_tema1.zip|aici]].
 </​spoiler>​ </​spoiler>​
-===== Referințe ===== 
  
-[0Capitolul **Greedy Algorithms** din **Introductions to Algorithms** de către T. H. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein+<spoiler Two City Scheduling>​ 
 +Puteți rezolva această problemă pe [[https://​leetcode.com/​problems/​two-city-scheduling/​ | leetcode]
 +</​spoiler>​
  
-[1] [[http://​en.wikipedia.org/​wiki/​Greedy_algorithm]]+===== Referințe =====
  
-[2[[http://​ww3.algorithmdesign.net/​handouts/​Greedy.pdf]]+[0Chapter **Greedy Algorithms**,​ “Introduction to Algorithms”,​ Thomas HCormen, Charles ELeiserson, Ronald LRivest and Clifford Stein
  
pa/laboratoare/laborator-02.1615233636.txt.gz · Last modified: 2021/03/08 22:00 by mara_ioana.nicolae
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