Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
aa:lab:10 [2023/09/21 21:32]
dmihai
aa:lab:10 [2025/01/23 14:10] (current)
dmihai
Line 1: Line 1:
-====== ​Loop invariants ​======+====== ​Recurențe ​====== 
 +/* 
 +<note important>​ 
 +Solutii:
  
- <​note important>​Solutii: ​https://​drive.google.com/​file/​d/​1KHhXOXUinJw2KbYnKqUGtr-dmRuAsbox/view?usp=sharing ​</​note> ​ +https://​drive.google.com/​file/​d/​11tR3YphFS73OF8QGvtorjf_dkRHPmo1y/view?usp=drivesdk 
 +</​note>​ 
 +*/
  
-1. Pentru următorii algoritmi, demonstrați corectitudinea,​ alegând corect precondiția,​ postcondiția și invariantul și demonstrând cele patru proprietăți (initialization,​ maintenance,​ postcondition,​ termination).+<note important>​ 
 +Teorema Master se poate aplica pe recurente de forma:
  
-<code c+  * $ T(n) = a * T(\frac n b) + f(n); a \ge 1; b 1 $ 
-// găsește indexul celui mai mic element din arr + 
-int find_min(int *arr, int n) +In functie de $ f(n) $ apar urmatoarele cazuri: 
-+  - $ f(n) = \Theta(n^c) ; c < \log_ba $                                  $ \Rightarrow T(n) = \Theta(n^{\log_ba}) $  
-        int min_idx ​= 0; +  - $ f(n) \Theta(n^c * \log^kn); k \geq 0; \log_ba $       ​        $ \Rightarrow T(n) = \Theta(n^{\log_ba}*\log^{k+1}n) $ 
-        int i 1; +  - $ f(n) = \Theta(n^c)c > \log_ba $                                   $ \Rightarrow T(n) = \Theta(f(n)) $    
-        while (i < n) { +</​note> ​
-                ​if ​(arr[i] < arr[min_idx]) +
-                        min_idx ​i;+
  
-                i++; 
-        } 
  
-        ​return ​min_idx;+1. Folosiți Teorema Master pentru a rezolva următoarele recurențe:​ 
 + 
 +   * $ T_1(n) = 4T_1(n/4) + 1$ 
 +<hidden Exemplu de cod cu aceasta recurenta>​ 
 +<code c> 
 +// O metoda destul de ineficienta de calcul al sumei elementelor unui vector 
 +int sum(int arr[], int lo, int hi) { 
 +    if(lo == hi) 
 +        ​return ​arr[lo]; 
 +    int x = (hi - lo) / 4; 
 +    return ​ sum(arr, lo, lo + x) +   
 +            sum(arr, lo + x + 1, lo + 2 * x) +  
 +            sum(arr, lo + 2 * x + 1, lo + 3 * x) +   
 +            sum(arr, lo + 3 * x + 1, hi);
 } }
 </​code>​ </​code>​
 +</​hidden>​
 +   * $ T_2(n) = 4T_2(n/2) + n^2$
 +   * $ T_3(n) = 8T_3(n/2) + 2n^4$
 +
 +2. Fie următorul algoritm de căutare a unei valori ''​v''​ într-un array sortat ''​arr'':​
  
 <code c> <code c>
-// calculate the sum of all positive integers up to and including n +int search(int arr[], int lo, int hi, int v)
-int integer_sum(int n)+
 { {
-        ​int 0+    ​int mid (lo + hi) / 2  
-        int sum 0; +    if (arr[mid] ​== v) 
-        ​while (i < n{ +        ​return mid; 
-                i+++    if (lo == hi
-                sum += i+        ​return -1
-        }+    if (arr[mid] > v) 
 +        return search(arr, lo, mid, v); 
 +    else 
 +        ​return search(arr, mid, hi, v); 
 +}
  
-        return sum; 
-} 
 </​code>​ </​code>​
  
-<​code ​c+  * Determinați relația de recurență a algoritmului de utare prezentat. 
-// calculează b la puterea e +  * Demonstrați recurența utilizând Teorema Master. 
-int pow(int b, int e) +  * Demonstrați recurența utilizând Metoda Arborilor. 
-+  Demonstrați recurența utilizând Metoda Substituției.
-        int x = b; +
-        int y = e; +
-        int r = 1; +
-        while (y > 0) { +
-                if (y % 2 == 1) +
-                        r = r x;+
  
-                y = y / 2; +3. Folosiți cele 3 metode (metoda arborilor, metoda substituției,​ teorema master) pentru a rezolva recurențele:​
-                x = x * x; +
-        }+
  
-        return r; +   * $ T_a(n) = 2T_a(n-1) + 1$ 
-}+   * $ T_b(n) = T_b(n-1) + 1$ 
 +   * $ T_c(n) = 2T_c(n/2) + \log(n)$ 
 +   * $ T_d(n) = T_d(n/9) + T_d(8n/9) + n$ 
 +   * $ T_e(n) = T_e(2n/3) + 1$ 
 +   * $ T_{Strassen}(n) = 7T_{Strassen}(n/​2) + n^2 $\\ 
 +Aceasta recurenta descrie [[https://​en.wikipedia.org/​wiki/​Strassen_algorithm| Algoritmul Strassen]] 
 +   * $ T_{Karatsuba}(n) = 3T_{Karatsuba}(n/​2) + 1 $\\ 
 +Aceasta recurenta descrie [[https://​en.wikipedia.org/​wiki/​Karatsuba_algorithm| Algoritmul Karatsuba]] 
 +   * $ T_{Quicksort}(n) = T_{Quicksort}(n-1) + O(n) $\\ 
 +Aceasta recurenta descrie [[https://​en.wikipedia.org/​wiki/​Quicksort| Algoritmul Quicksort]]
  
 +4. Rezolvați următoarea recurență folosind metoda substituției:​ $math[T(n) = 2 T(\frac{n}{2}) + 1].
  
-</​code>​+5. Rezolvați următoarea recurență folosind metoda arborilor: $math[T(n) = T(] $math[n \over 4] $math[) + T(] $math[3n \over 4] $math[) + n].
  
-<code c> 
-// inserează valoarea x în array-ul sortat arr (arr are un extra "​slot"​ alocat la final) 
-void insert(int *arr, int n, int x) 
-{ 
-        int i = n; 
-        while (i > 0 && arr[i - 1] > x) { 
-                arr[i] = arr[i - 1]; 
-                i--; 
-        } 
-        arr[i] = x; 
-} 
-</​code>​ 
  
 +<​note>​
 +Soluțiile acestui laborator se găsesc [[https://​ocw.cs.pub.ro/​ppcarte/​doku.php?​id=aa:​lab:​sol:​10|aici]]
 +</​note>​