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); }
Î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: