给定以下函数:
int f(int n) {
if (n <= 1) {
return 1;
}
return f(n - 1) + f(n - 1);
}
我知道大O时间复杂度为O(2^N)
,因为每次调用函数都会调用两次。
我不理解的是为什么空间/内存复杂度为O(N)
?
给定以下函数:
int f(int n) {
if (n <= 1) {
return 1;
}
return f(n - 1) + f(n - 1);
}
我知道大O时间复杂度为O(2^N)
,因为每次调用函数都会调用两次。
我不理解的是为什么空间/内存复杂度为O(N)
?
T(n) = 2T(n-1)
。正如您正确指出的那样,时间复杂度为O(2^n)
,但让我们看看它与我们的递归树的关系。 C
/ \
/ \
T(n-1) T(n-1)
C
____/ \____
/ \
C C
/ \ / \
/ \ / \
T(n-2) T(n-2) T(n-2) T(n-2)
以下是我的思考:
这可以通过考虑不同的函数更好地解释
f(n) = f(n-1) + f(n-2)
f(0) =0, f(1)=1
这将导致以下计算f(4)的树形结构
f(4)
f(3) f(2)
f(2) f(1) f(1) f(0)
f(1) f(0)
系统可以使用重复存储堆栈来处理深度相等的所有节点(f(0), f(1), f(2), f(3)和f(4)的存储单元)。而运行时需要考虑每个节点上的所有操作(加法或返回语句)- 因此是节点中任何一个因素的因素。
f(4)
f(3) f(2) f(1) f(0)
这些调用都被添加到调用栈中并占用实际内存。 然而,仅仅因为你有n个调用总数并不意味着它需要O(n)的空间。 因此,这将需要O(n)的空间。