在这里有人问过同样的问题:Time complexity for all Fibonacci numbers from 0 to n,但我不明白所提供的答案。
以下代码打印从0到n的所有斐波那契数。时间的复杂度是多少?
void allFib(int n){
for(int i = 0 ; i < n ; i++){
System.out.println(i + ": " + fib(i));
}
}
int fib(int n ){
if(n <= 0) return 0;
else if (n == 1) return 1;
return fib(n-1) + fib(n-2);
}
我不明白为什么时间复杂度是O(2 ^ n)而不是O(n * 2 ^ n)。据说:
fib(1)采取2 ^ 1步
...
fib(n)需要2 ^ n步
我不知道这是怎么回事,因为fib(1)根据else语句立即返回1,因此应该采取1步。即使这句话是正确的,我仍然不明白时间复杂度如何仅为O(2 ^ n)。
答案 0 :(得分:1)
对于书面程序,如果fib(n)
的时间复杂度为T1(n)
,则程序的总时间复杂度为T(n) = sum_{i=0}^{n-1} T1(i)
。现在尝试计算T1(i)
。根据{{1}}函数的定义,fib
和T1(i) = T1(i-1) + T2(i-2) + 2
(一个比较)和T1(0) = 1
(两个比较)。
根据先前的著名分析,我们知道T1(1) = 2
。因此,T1(i) = Theta(2^i)