Obecnie studiuję struktury danych na uniwersytecie i natknąłem się na pytanie o złożoność rekursji.Złożoność w algorytmie rekursji
Biorąc pod uwagę ten kod:
Unsigned func (unsigned n)
{
if (n ==0) return 1;
if(n==1) return 2;
\\do somthing(in O(1))
return func(n-1) + func(n-1);
}
wiem co kod robi. Wiem, że w obecnej formie złożoność czasu wynosi O (2^n).
Moje pytanie brzmi jednak: czy złożoność czasu zmieni się, jeśli zamiast ostatniego wywołania zwrotnego kodu napiszę: return 2*func(n-1)
?
Wiem, że jeśli chodzi o złożoność pamięci, mówimy o znacznej redukcji przestrzeni zajmowanej przez rekurencję, ale jeśli chodzi o złożoność czasu, czy nastąpi jakakolwiek zmiana?
Zrobiłem matematykę używając funkcji rekursywnej i doszedłem do zrozumienia, że nie będzie zmian w złożoności czasu, czy mam rację?
Tak więc miałem rację, że rekurencyjne wywołanie func (n-1) + func (n-1) działa przy złożoności O (2^n)? jak to się stało, że na mojej formule rekurencji, kiedy piszę ją na papierze i obliczam, dostaję, że oba mają złożoność w tym samym czasie? – Tom
@Tom - tak, działa w złożoności O (2^n) ... o swojej formule - używasz go źle lub masz niewłaściwą formułę. Opublikuj tę formułę na swoje pytanie i być może możemy powiedzieć Ci, co jest nie tak. – libik
Moja formuła to: T (n) = 2T (n-1), natomiast T (0) = 1, T (1) = 2. Użyłem "metody księgowania" i dotarłem do ogólnej funkcji: T (n) = 2^i * T (ni). po ustawieniu moich warunków zatrzymania, takich jak i = n-1 lub i = n-2, osiągnąłem złożoność T (n) = 2^(n-1) * T (1) = (2^n)/2 - ------> O (2^n). taki sam wynik dla drugiego warunku zatrzymania. co robię źle, ponieważ otrzymałem tę samą formułę dla obu rodzajów kodu. – Tom