【发布时间】:2019-04-07 21:46:38
【问题描述】:
同样的问题在这里被问到: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)。
【问题讨论】:
-
简单地说,如果你有 n 个 O(2^n) 步骤但你没有,你的 O(n × 2^n) 公式将是正确的那。你有 n 个步骤,好吧,但只有最后一个是 O(2^n)。最后一个是 O(2^(n-1)),前一个是 O(2^(n-2)),等等。它们都比最后一个小得多,所以它们都可以删除(在 O() 内),而 O(2^n) 仍然是增长最快的项。
标签: algorithm recursion time-complexity