Documente Academic
Documente Profesional
Documente Cultură
if (m % 3)
return s + f(m - 3, a / 2);
else
return s + f(m / 3, a / 2);
}
Ce complexitate are algoritmul de mai sus ? Din moment ce nu mai apare
read, nu va mai conta pe cati biti sunt reprezentate valorile si ne vom referi la
ele ca atare. E important sa incepem prin a observa ca bucla for nu contribuie
semnificativ la complexitatea algoritmului. De ce ? Pai, numarul de pasi este
constant (300 mai precis), iar corpul buclei contine operatii ce se executa de
asemenea in timp constant. Astfel, putem spune ca toate instructiunile de pana
la al doilea if se executa in timp constant.
Urmatoarea observatie este ca parametrul a nu are nici el vreo influenta
asupra complexitatii; ea nu depinde decat de m, in functie de care se executa
apelurile recursive. Din moment ce, in afara recursivitatii, operatiile se executa
in (1), inseamna ca pentru a determina complexitatea algoritmului trebuie sa
vedem de cate ori se autoapeleaza functia in cel mai rau caz.
In cadrul celui de-al doilea if, prima ramura este mai costisitoare decat a
doua, deorece prima doar scade din valoarea lui m trei unitati, pe cand a doua
il reduce direct la o treime. Acestea fiind spuse, cel mai rau caz este acela in care
tot timpul ne incadram in prima dintre cele doua ramuri. Este posibil asa ceva ?
Raspunsul este da, pentru ca daca m mod 3 6= 0, atunci si (m 3) mod 3 6= 0.
Cu alte cuvinte, o data ce am intrat pe prima ramura a ultimei instructiuni if,
acolo vom ramane pentru toate apelurile recursive ce urmeaza. In acest caz,
formula recurentei poate fi scrisa ca T (m) = T (m 3) + 1. Daca o rezolvam,
obtinem complexitatea algoritmului ca fiind O(m).
O intrebare interesanta legata de acelasi algoritm este urmatoarea: ce se
intampla cu complexitatea algoritmului daca inlocuim linia
return s + f(m - 3, a / 2);
cu urmatoarea:
return s + f(m - 1, a / 2);
Cu alte cuvinte, se schimba complexitatea algoritmului in cazul in care avem
m 1 in loc de m 3 ? Raspunsul este da; complexitatea algoritmului devine
O(log m). De ce ? De data aceasta, pentru orice valoare ar avea m, dupa cel
mult doua apeluri recursive va deveni multiplu de 3, si se va intra pe ramura a
doua a ultimului if. In cel mai rau caz vom avea doua apeluri ale functiei care
il decrementeaza pe m, urmate de unul care il transforma in m
3 , si tot asa pana
cand ajungem in situatia in care m < 4. De cate ori se poate repeta secventa
descrisa anterior ? De cel mult log3 m ori, deci complexitatea algoritmului
devine O(log m).