This shows you the differences between two versions of the page.
pa:laboratoare:laborator-01 [2021/03/08 16:49] radu.nichita [Turnurile din Hanoi] |
pa:laboratoare:laborator-01 [2022/03/21 23:11] (current) radu.nichita [Exerciții] |
||
---|---|---|---|
Line 1: | Line 1: | ||
====== Laborator 01: Divide et Impera ====== | ====== Laborator 01: Divide et Impera ====== | ||
- | 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: | + | |
- | * [[visanr95@gmail.com|Radu Vișan (2018)]] | + | |
- | * [[cristb@gmail.com|Cristian Banu (2018)]] | + | |
- | * [[neatudarius@gmail.com|Darius-Florentin Neațu (2018)]] | + | |
- | | + | |
===== Obiective laborator ===== | ===== Obiective laborator ===== | ||
Line 23: | Line 12: | ||
Toate exemplele de cod se găsesc pe pagina [[https://github.com/acs-pa/pa-lab/tree/main/demo/lab01|pa-lab::demo/lab01]]. | Toate exemplele de cod se găsesc pe pagina [[https://github.com/acs-pa/pa-lab/tree/main/demo/lab01|pa-lab::demo/lab01]]. | ||
- | Exemplele de cod apar incorporate ș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ă rugam să compilați **DOAR** codul de pe GitHub. Pentru raportarea problemelor, contactați unul dintre maintaineri. | * Vă rugam 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ă rugam să dați e-mail unuia dintre responsabili. | ||
Line 42: | Line 31: | ||
===== Prezentarea generală a problemei ===== | ===== Prezentarea generală a problemei ===== | ||
- | O descriere a tehnicii D&I: “Divide and Conquer algorithms break the problem into several sub-problems that are similar to the original problem but smaller in size, solve the sub-problems recursively, and then combine these solutions to create a solution to the original problem.” [7] | + | O descriere a tehnicii D&I: “Divide and Conquer algorithms break the problem into several sub-problems that are similar to the original problem but smaller in size, solve the sub-problems recursively, and then combine these solutions to create a solution to the original problem.” |
Deci un algoritm D&I **împarte problema** în mai multe subprobleme similare cu problema inițială şi de dimensiuni mai mici, **rezolvă subproblemele** recursiv şi apoi **combină soluțiile** obţinute pentru a obține soluția problemei inițiale. | Deci un algoritm D&I **împarte problema** în mai multe subprobleme similare cu problema inițială şi de dimensiuni mai mici, **rezolvă subproblemele** recursiv şi apoi **combină soluțiile** obţinute pentru a obține soluția problemei inițiale. | ||
Line 381: | Line 370: | ||
} | } | ||
} | } | ||
- | return res; | + | return (res != -1 && v[res] == x) ? res : -1; |
} | } | ||
Line 395: | Line 384: | ||
} | } | ||
} | } | ||
- | return res; | + | return (res != -1 && v[res] == x) ? res : -1; |
} | } | ||
Line 486: | Line 475: | ||
} | } | ||
} | } | ||
- | return res; | + | return (res != -1 && v[res] == x) ? res : -1; |
} | } | ||
Line 500: | Line 489: | ||
} | } | ||
} | } | ||
- | return res; | + | return (res != -1 && v[res] == x) ? res : -1; |
} | } | ||
Line 559: | Line 548: | ||
Atenție la înmulțire! Rezultatul **temporar** poate provoca un overflow. | Atenție la înmulțire! Rezultatul **temporar** poate provoca un overflow. | ||
- | Solutii: | + | |
+ | Soluții: | ||
* **C++**: $a * b$ => $1LL * a * b$ | * **C++**: $a * b$ => $1LL * a * b$ | ||
* **Java**: $a * b$ => $1L * a * b$ | * **Java**: $a * b$ => $1L * a * b$ | ||
Line 583: | Line 573: | ||
<note> | <note> | ||
- | Aceasta problema nu are schelet. | + | Aceasta problema nu are schelet, dar poate fi testată pe infoarena, la problema [[https://www.infoarena.ro/problema/inv | Inv]]. |
</note> | </note> | ||
Line 626: | Line 616: | ||
</spoiler> | </spoiler> | ||
+ | <spoiler Secventa descrescatoare> | ||
+ | Dându-se N numere întregi sub forma unei secvenţe de numere strict crescătoare, care se continuă cu o secvenţă de întregi strict descrescătoare, se doreşte determinarea punctului din întregul şir înaintea căruia toate elementele sunt strict crescătoare, şi dupa care, toate elementele sunt strict descrescătoare. Considerăm evident faptul că acest punct nu există dacă cele N numere sunt dispuse într-un şir fie doar strict crescător, fie doar strict descrescător. | ||
+ | </spoiler> | ||
- | <spoiler SSM> | + | <spoiler K closest points to origin> |
- | Puteți rezolva aceasta problema de [[https://ocw.cs.pub.ro/courses/pa/laboratoare/laborator-03#ssm | + | Puteți rezolva această problemă pe [[https://leetcode.com/problems/k-closest-points-to-origin/ | leetcode]] |
- | | aici]]. | + | |
- | + | ||
- | <note> | + | |
- | Pentru problema SSM vom studia o soluție potrivita in lab03. Puteți să încercați să o rezolvați cu Divide et Impera pentru a exersa cele învățate astăzi. | + | |
- | </note> | + | |
</spoiler> | </spoiler> | ||
- | <spoiler Secventa descrescatoare> | + | <spoiler Merge k Sorted Lists> |
- | Dându-se N numere întregi sub forma unei secvenţe de numere strict crescătoare, care se continuă cu o secvenţă de întregi strict descrescătoare, se doreşte determinarea punctului din întregul şir înaintea căruia toate elementele sunt strict crescătoare, şi dupa care, toate elementele sunt strict descrescătoare. Considerăm evident faptul că acest punct nu există dacă cele N numere sunt dispuse într-un şir fie doar strict crescător, fie doar strict descrescător. | + | Puteți rezolva această problemă pe [[https://leetcode.com/problems/merge-k-sorted-lists/ | leetcode]] |
</spoiler> | </spoiler> | ||
+ | ===== Referințe ===== | ||
+ | [0] Chapter **Divide-and-Conquer**, "Introduction to Algorithms", Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest and Clifford Stein | ||