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:6 [2025/11/06 20:36]
stefan.sterea
aa:lab:6 [2025/11/11 08:02] (current)
stefan.sterea
Line 1: Line 1:
 ====== Recurențe ====== ====== Recurențe ======
  
-1. Identificați formula de recurență pentru numărul de pași elementari ​ai următoarelor programe ​și calculați complexitatea algoritmilor folosind metoda arborilor și metoda substituției.+1. Identificați formula de recurență pentru numărul de pași elementari ​pentru functiile binary_search si successor de mai jos și calculați complexitatea algoritmilor folosind metoda arborilor și metoda substituției.
  
 <code C> <code C>
Line 13: Line 13:
  
     if (x < arr[m]) {     if (x < arr[m]) {
-        return binary_search(arr,​ start, m, x);+        return binary_search(arr,​ start, m - 1, x);
     } else {     } else {
-        return binary_search(arr,​ m, end, x);+        return binary_search(arr,​ m + 1, end, x);
     }     }
 +}
 +</​code>​
 +<code C>
 +// Fie urmatoarea structura de date (van Emde Boas tree) care retine un set de 
 +// numere intregi din intervalul [0, u-1], unde u este de forma 2^(2^k)
 +typedef struct vEB {
 +    int u, sqrt_u; // u si √u pentru intervalul [0, u-1]
 +    struct vEB **clusters; // √u sub-intervale de dimensiune √u
 +    struct vEB *summary; // retine daca sub-intervalele sunt vide
 +    int min, max; // minimul si maximul din interval
 +} vEB;
 +
 +int low(vEB *V, int x) { return x % V->​sqrt_u;​ }   // indicele lui x in cadrul sub-intervalului
 +int high(vEB *V, int x) { return x / V->​sqrt_u;​ }  // indicele sub-intervalului din care face parte x
 +int index(vEB *V, int hi, int lo) { return hi * V->​sqrt_u + lo; } 
 +
 +int successor(vEB *V, int x) {
 +    if (V->u == 2)
 +        return (x == 0 && V->max == 1) ? 1 : -1;
 +    int i = high(V, x);
 +    int j = low(V, x);
 +    if (j < V->​clusters[i]->​max) {
 +        j = successor(V->​clusters[i],​ j);
 +    } else {
 +        i = successor(V->​summary,​ i);
 +        j = V->​clusters[i]->​min;​
 +    }
 +    return index(V, i, j);
 } }
 </​code>​ </​code>​
  
-2. Teorema Master:+=== Teorema Master ​===
 <​note>​ <​note>​
 Fie o formulă de recurență de forma \\ Fie o formulă de recurență de forma \\
-$ T(n) = a\ T\left(\frac n b\right) + f(n), \hspace{1em} a \geq 1, b \ge 1 $ \\+$ T(n) = a\ T\left(\frac n b\right) + f(n), \hspace{1em} a \geq 1, b 1 $ \\
 și fie $ d = \log_b a $. \\ și fie $ d = \log_b a $. \\
 În funcție de $ f $ avem următoarele cazuri: În funcție de $ f $ avem următoarele cazuri:
   * $ f(n) = {\rm O}\left(n^c\right),​\ c < d \hspace{1em} \Rightarrow \hspace{1em} T(n) = \Theta\left(n^d\right)$   * $ f(n) = {\rm O}\left(n^c\right),​\ c < d \hspace{1em} \Rightarrow \hspace{1em} T(n) = \Theta\left(n^d\right)$
   * $ f(n) = \Theta\left(n^d \log^k n\right),\ k \geq 0 \hspace{1em} \Rightarrow \hspace{1em} T(n) = \Theta\left(n^d \log^{k+1} n\right) $   * $ f(n) = \Theta\left(n^d \log^k n\right),\ k \geq 0 \hspace{1em} \Rightarrow \hspace{1em} T(n) = \Theta\left(n^d \log^{k+1} n\right) $
-  * $ f(n) = \Omega\left(n^c\right),​\ c > d\ \text{ și }\ \exists(k < 1)(N \geq 0): \forall (n \geq N): af\left(\frac n b\right) \leq kf(n) \hspace{1em} \Rightarrow \hspace{1em} T(n) = \Theta(f(n)) $+  * $ f(n) = \Omega\left(n^c\right),​\ c > d\ \text{ și }\\ \exists(k < 1)(N \geq 0): \forall (n \geq N): af\left(\frac n b\right) \leq kf(n) \hspace{1em} \Rightarrow \hspace{1em} T(n) = \Theta(f(n)) $
 În particular, ultima condiție de la ultima regulă este automat satisfacută dacă $ f(n) = \Theta(n^c) $ În particular, ultima condiție de la ultima regulă este automat satisfacută dacă $ f(n) = \Theta(n^c) $
 </​note>​ </​note>​
  
-Folosiți Teorema Master pentru a rezolva următoarele recurențe:+2. Folosiți Teorema Master pentru a rezolva următoarele recurențe:
   * $ T(n) = 4 T(n/4) + 1 $   * $ T(n) = 4 T(n/4) + 1 $
   * $ T(n) = 4 T(n/2) + n^2 $   * $ T(n) = 4 T(n/2) + n^2 $
-  * $ T(n) = \frac{T(2n/3)}{27} + n^3 \log^2 n + n^2 $+  * $ T(n) = \frac{27 T(2n/3)}{8} + n^3 \log^2 n + n^2 $
   * $ T(n) = 8 T(n/2) + 2n^4 $   * $ T(n) = 8 T(n/2) + 2n^4 $
   * $ T(n) = 16 T(n/4) + n^3 \sqrt{n} $   * $ T(n) = 16 T(n/4) + n^3 \sqrt{n} $