这段代码的空间复杂性是多少?

时间:2016-12-31 21:24:00

标签: c algorithm

int f(int n)
{ 
    if (n <= 1)
    { 
         return 1;
    } 
    return f(n - 1) + f(n - 1);
} 

我知道时间复杂度为O(2^n),我理解为什么。

但我不明白为什么空间复杂度为O(n)。 我被告知这是因为在任何给定时间只有n个节点,但它对我没有意义。

3 个答案:

答案 0 :(得分:13)

因为第二个f(n-1)在第一个n完成之前无法运行(反之亦然 - 无论哪种方式都相同)。第一个调用将递归n次,然后所有这些将返回,这样将推送总共n个堆栈帧。然后第二个电话会做同样的事情。

因此,在递归中它永远不会超过[[["I eat rice","I ate rice","I am eating rice"] .... ]] 级别,这是空间复杂性的唯一贡献者。

答案 1 :(得分:6)

空间复杂度是O(n),因为递归的一侧到达叶子,然后返回,直到根,类似于递归的另一侧发生,并且在每个中间步骤中,递归中使用的空间不能是大于递归树深度的O.

答案 2 :(得分:5)

绘制指数时间复杂度树,来自树根的任何叶子的路径长度将是线性的。 此线性路径是算法的空间复杂度。该算法将遍历每个路径以解决问题,但在任何时候,存储在堆栈中的最大递归调用数将是线性的。例如:f(3)

         3 
       /   \ 
     2      2 
    / \    / \ 
   1   1  1   1

从根到叶的最大长度为O(n)。因此,空间复杂度也是O(n)