【发布时间】:2019-08-13 17:42:23
【问题描述】:
为什么在for循环中调用递归函数会导致O(2^N)的时间复杂度而不是O(N 2^N)下面这段代码。基于CTCI一书。
void allFib(int n){
for (int i = 0; i < n; i++) {
System.out.println(i + ": "+ fib(i));
}
}
int fib(n){
if (n <= 0) return 0;
else if (n == 1) return 1;
return fib(n - 1) + fib(n -2);
}
【问题讨论】:
-
因为只取了最大的部分。同样的原因,两次遍历数组会给出
O(n)复杂性而不是O(2n)复杂性。 2 被丢弃。 -
@MichaelBianconi - 然后使用您的逻辑(完全按照说明)O(n Log n) 呢?
-
@MichaelBianconi 这是不正确的。在大 O 表示法中,您删除所有常量,但 O(2^n) 和 O(n * 2^n) 存在差异。您不能忽略非常数乘数。
-
@MarkRotteveel 哈哈,这不是因为 n 大,而是因为 2^0+2^1+...+2^(n-1) 小于 2^n。非常量因素无论大小都不应被忽略
-
@MarkRotteveel
n术语在O(n logn)中支配log n。我们不会删除log n术语,我们也不应该将其删除