Я пытаюсь найти сложность ряда Фибоначчи с использованием дерева рекурсии и пришел к выводу, что высота дерева = O (n)
худший случай, стоимость каждого уровня = cn
, следовательно, сложность = n * n = n ^ 2
Почему это O (2 ^ n)
?
Дерево рекурсии для fib (n) будет выглядеть примерно так:
n
/ \
n-1 n-2 --------- maximum 2^1 additions
/ \ / \
n-2 n-3 n-3 n-4 -------- maximum 2^2 additions
/ \
n-3 n-4 -------- maximum 2^3 additions
........
-------- maximum 2^(n-1) additions
t (n) = t (n-1) + t (n-2), которые могут быть решены с помощью древовидного метода:
t(n-1) + t(n-2) 2^1=2
| |
t(n-2)+t(n-3) t(n-3)+t(n-4) 2^2=4
. . 2^3=8
. . .
. . .
аналогично для последнего уровня. , 2 ^ n
это сделает общую временную сложность => 2 + 4 + 8 + ..... 2 ^ n после решения вышеупомянутого gp мы получим временную сложность как O (2 ^ n)
Сложность ряда Фибоначчи составляет O (F (k)), где F (k) - это k-е число Фибоначчи. Это можно доказать по индукции. Это тривиально для обоснованного случая. И предположим, что для всех k < = n сложность вычисления F (k) равна c * F (k) + o (F (k)), тогда для k = n + 1 сложность вычисления F (n + 1). ) это c * F (n) + o (F (n)) + c * F (n-1) + o (F (n-1)) = c * (F (n) + F (n-1) ) + o (F (n)) + o (F (n-1)) = O (F (n + 1)).
Сложность O (2 ^ n) вычисления числа Фибоначчи применима только к рекурсивному подходу. С небольшим дополнительным пространством вы можете добиться гораздо лучшей производительности с помощью O (n).
public static int fibonacci(int n) throws Exception {
if (n < 0)
throws new Exception("Can't be a negative integer")
if (n <= 1)
return n;
int s = 0, s1 = 0, s2 = 1;
for(int i= 2; i<=n; i++) {
s = s1 + s2;
s1 = s2;
s2 = s;
}
return s;
}