【发布时间】:2019-01-05 16:29:11
【问题描述】:
我正在计算这段代码的时间复杂度,它打印从 0 到 n 的所有斐波那契数。根据我的计算,fib() 方法需要O(2^n),由于它被调用了i 的次数,所以它是O(n*2^n)。然而,这本书说它是O(2^n)。谁能解释一下为什么这里的时间复杂度会是O(2^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);
}
【问题讨论】:
-
@Am_I_Helpful 请在将其标记为重复之前仔细阅读该问题。您提供的链接中的内容不是我问题的答案。
-
在计算
fib(n)时,您已经得到了fib(n -1)到fib(1)的所有结果。所以计算fib(n)与计算所有这些具有相同的复杂性。但是您的allFib函数不同,因为它不会保存以前的fib(n-1)和fib(n-2)来计算fib(n)。所以allFib的时间复杂度为 O(n*2^n)。 -
@shaunshia 这就是我的答案,但书上说它是 O(n*2^n) 并且它不是任何书,它是 GL Mcdowell 的《Cracking the Coding Interview》。