我正在阅读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空间。非常感谢。
答案 0 :(得分:2)
这意味着此算法使用的空间量相对于输入大小是恒定的。
是的,pairSum被称为N次。然而,它占据了O(1)空间,因为正如书中所说,没有两个呼叫同时进行。
粗略地说,在循环的每次迭代中:
调用pairSum
。它使用恒定量的堆栈空间。
它返回。之后它不会占用任何堆栈空间。
因此,该算法在任何时候都只使用固定数量的空间(它不依赖n
)。