This shows you the differences between two versions of the page.
|
pa:laboratoare:laborator-04 [2021/03/15 11:18] miruna_elena.banu [Referințe] |
pa:laboratoare:laborator-04 [2024/04/16 17:38] (current) radu.nichita |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Laborator 4: Programare Dinamică (continuare) ====== | + | ====== Laborator 04: Programare Dinamică (2/2) ====== |
| - | 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: | + | |
| - | * [[neatudarius@gmail.com|Darius-Fforentin Neațu (2018)]] | + | |
| - | * [[visanr95@gmail.com|Radu Vișan (2018)]] | + | |
| - | * [[cristb@gmail.com|Cristian Banu (2018)]] | + | |
| - | * [[razvan.ch95@gmail.com|Răzvan Chițu (2018)]] | + | |
| ===== Obiective laborator ===== | ===== Obiective laborator ===== | ||
| Line 102: | Line 88: | ||
| * explicație: $X =(BC)$ generează $3 * 4 * 5 = 60$ înmulțiri, $(AX)$ generează $2 * 3 * 5 = 30$ de înmulțiri | * explicație: $X =(BC)$ generează $3 * 4 * 5 = 60$ înmulțiri, $(AX)$ generează $2 * 3 * 5 = 30$ de înmulțiri | ||
| - | Rezultatul optim se obține pentru cea de a treia parantezare: $(AB)C$. | + | Rezultatul optim se obține pentru prima parantezare: $(AB)C$. |
| </spoiler> | </spoiler> | ||
| Line 165: | Line 151: | ||
| == Numire recurență === | == Numire recurență === | ||
| $dp[i][j]$ = **numărul minim de înmulțiri scalare** cu care se poate obține produsul $M_i * M_{i+1} * ... *{M_j}$ | $dp[i][j]$ = **numărul minim de înmulțiri scalare** cu care se poate obține produsul $M_i * M_{i+1} * ... *{M_j}$ | ||
| + | |||
| + | Răspunsul la problemă este **dp[1][n]** . | ||
| == Găsire recurență == | == Găsire recurență == | ||
| Line 186: | Line 174: | ||
| <spoiler Implementare C++> | <spoiler Implementare C++> | ||
| <code cpp> | <code cpp> | ||
| - | // kInf este valoarea maximă - "infinitul" nostru | + | // INF este valoarea maximă - "infinitul" nostru |
| - | const unsigned long long kInf = std::numeric_limits<unsigned long long>::max(); | + | const auto INF = std::numeric_limits<unsigned long long>::max(); |
| // T = O(n ^ 3) | // T = O(n ^ 3) | ||
| Line 194: | Line 182: | ||
| // dp[i][j] = numărul MINIM înmulțiri scalare cu codare, poate fi calculat produsul | // dp[i][j] = numărul MINIM înmulțiri scalare cu codare, poate fi calculat produsul | ||
| // matriceal M_i * M_i+1 * ... * M_j | // matriceal M_i * M_i+1 * ... * M_j | ||
| - | vector<vector<unsigned long long>> dp(n + 1, vector<unsigned long long> (n + 1, kInf)); | + | vector<vector<unsigned long long>> dp(n + 1, vector<unsigned long long> (n + 1, INF)); |
| // Cazul de bază 1: nu am ce înmulți | // Cazul de bază 1: nu am ce înmulți | ||
| Line 242: | Line 230: | ||
| <note> | <note> | ||
| - | **ATENȚIE!** La PA, în general, vom folosi convenția $ expresie \ \% \ kMod $, care va fi detaliată în capitolul următor din acest laborator. | + | **ATENȚIE!** La PA, în general, vom folosi convenția $ expresie \ \% \ MOD $, care va fi detaliată în capitolul următor din acest laborator. |
| </note> | </note> | ||
| Line 519: | Line 507: | ||
| * o înmulțire de matrice patrătică de dimensiune KMAX are $KMAX^3$ operații | * o înmulțire de matrice patrătică de dimensiune KMAX are $KMAX^3$ operații | ||
| * această metodă este eficientă când $KMAX << n$ (KMAX este mult mai mic decât n) | * această metodă este eficientă când $KMAX << n$ (KMAX este mult mai mic decât n) | ||
| - | * ** complexitatea spațială **: $S = O(KMAX^3)$ | + | * ** complexitatea spațială **: $S = O(KMAX^2)$ |
| - | * explicație | + | **Observație!** În ultimele calcule nu am șters constanta KMAX, întrucât apare la puterea a 2-a! $KMAX = 1000$ implică $KMAX^2 = 10^6$, valoare care nu mai poate fi ignorată în practică ($KMAX^2$ poate fi comparabil cu n). |
| - | * este nevoie să stocăm câteva matrice | + | |
| - | **Observație!** În ultimele calcule nu am șters constanta KMAX, întrucât apare la puterea a 3-a! $KMAX = 100$ implică $KMAX^3 = 10^6$, valoare care nu mai poate fi ignorată în practică ($KMAX^3$ poate fi comparabil cu n). | + | |
| === Gardurile lui Gigel (optimizare) === | === Gardurile lui Gigel (optimizare) === | ||
| Line 531: | Line 517: | ||
| == Exponențiere rapidă == | == Exponențiere rapidă == | ||
| * $ k = 4 $ | * $ k = 4 $ | ||
| - | * $S_4 = (dp[1], dp[2], dp[3], dp[4]) = (1, 1, 1, 4)$ | + | * $S_4 = (dp[1], dp[2], dp[3], dp[4]) = (1, 1, 1, 2)$ |
| * $S_i = (dp[i-3], dp[i-2], dp[i-1], dp[i])$ | * $S_i = (dp[i-3], dp[i-2], dp[i-1], dp[i])$ | ||
| * Răspunsul se află efectuând operația $S_n = S_4 * C^{n - 4}$, unde C are următorul conținut: | * Răspunsul se află efectuând operația $S_n = S_4 * C^{n - 4}$, unde C are următorul conținut: | ||
| Line 629: | Line 615: | ||
| <spoiler Comparație solutii (studiu de caz pentru curioși)> | <spoiler Comparație solutii (studiu de caz pentru curioși)> | ||
| - | În arhiva ** demo-lab04.zip ** găsiți o sursă completă în care se realizează: | + | Pe git găsiți o sursă completă în care se realizează: |
| * o verificare a faptului că cele 2 implementări (** gardurile_lui_Gigel** și **garduri_rapide**) produc aceleași rezultate | * o verificare a faptului că cele 2 implementări (** gardurile_lui_Gigel** și **garduri_rapide**) produc aceleași rezultate | ||
| * un benchmark în care cele 2 implementări sunt comparate | * un benchmark în care cele 2 implementări sunt comparate | ||
| - | * pe sistem uzual (laptop) s-au obținut următoarele rezulate: | + | * pe un sistem uzual (laptop) s-au obținut următoarele rezulate: |
| <code bash> | <code bash> | ||
| test case: varianta simplă | test case: varianta simplă | ||