调用堆栈中的空间复杂性

时间:2016-11-11 10:29:14

标签: algorithm

我正在阅读Cracking the Coding Interview,在本书的Big O部分,我们提出了这段代码:

int pairSumSequence(int n){

    int sum = 0;
    for(int i = 0; i < n; i++){
        sum += pairSum(i, i + 1);
    }
    return sum;
}

int pairSum(int a, int b) {
    return a + b;
}

现在,我知道时间复杂度为O(n),因为随着int n的大小增加,执行时间明显增加。但是这本书继续说明:

  

&#34; ...但是,这些呼叫[引用pairSum的呼叫]在呼叫中不会同时存在   堆栈,所以你只需要O(1)空间。&#34;

这是我不明白的部分。为什么这个算法的空间复杂度为O(1)?作者究竟是什么意思?在我最初的分析中,我假设因为pairSum()被调用了N次,这些调用将被背对背地添加到调用堆栈中,因此会占用调用堆栈中的N空间。非常感谢。

1 个答案:

答案 0 :(得分:2)

这意味着此算法使用的空间量相对于输入大小是恒定的。

是的,pairSum被称为N次。然而,它占据了O(1)空间,因为正如书中所说,没有两个呼叫同时进行。

粗略地说,在循环的每次迭代中:

  1. 调用pairSum。它使用恒定量的堆栈空间。

  2. 它返回。之后它不会占用任何堆栈空间。

  3. 因此,该算法在任何时候都只使用固定数量的空间(它不依赖n)。