Recurențe

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.

int binary_search(int *arr, int start, int end, int x) {
    if (start > end)
        return -1;
 
    int m = (start + end) / 2;
    if (arr[m] == x) 
        return m;
 
    if (x < arr[m]) {
        return binary_search(arr, start, m - 1, x);
    } else {
        return binary_search(arr, m + 1, end, x);
    }
}
// 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);
}

Teorema Master

Fie o formulă de recurență de forma
$ T(n) = a\ T\left(\frac n b\right) + f(n), \hspace{1em} a \geq 1, b > 1 $
și fie $ d = \log_b a $.
Î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) = \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)) $

În particular, ultima condiție de la ultima regulă este automat satisfacută dacă $ f(n) = \Theta(n^c) $

2. Folosiți Teorema Master pentru a rezolva următoarele recurențe: