【问题标题】:Why is the time complexity of the below snippet O(n) while the space complexity is O(1)为什么下面代码片段的时间复杂度是 O(n) 而空间复杂度是 O(1)
【发布时间】:2020-02-03 11:44:18
【问题描述】:
下面给出的代码的空间复杂度为 O(1)。我知道它与调用堆栈有关,但我无法正确地可视化它。如果有人能让我更清楚地理解这一点,那就太好了。
int pairSumSequence(int n) {
int sum = 0;
for (int i = 0;i < n; i++) {
sum += pairSum(i, i + l);
}
return sum;
}
int pairSum(int a, int b) {
return a + b;
}
【问题讨论】:
标签:
time-complexity
space-complexity
【解决方案1】:
相对于n 的值,它需要多少空间?
唯一使用的变量是sum。
sum 相对于 n 没有变化,因此它是恒定的。
如果它是常数,那么它就是 O(1)
相对于n的值,它将执行多少条指令?
让我们先简化代码,然后逐行分析。
int pairSumSequence(int n) {
int sum = 0;
for (int i = 0; i < n; i++) {
sum += 2 * i + l;
}
return sum;
}
变量的声明和初始化需要恒定的时间,并且不会随着n 的值而改变。因此这条线是 O(1)。
int sum = 0;
类似地返回一个值需要恒定的时间,所以它也是 O(1)
return sum;
最后我们来分析一下for的内部:
sum += 2 * i + l;
这也是常数时间,因为它基本上是一次乘法和两次求和。再次O(1)。
但是这个 O(1) 它在 for 中被调用:
for (int i = 0; i < n; i++) {
sum += 2 * i + l;
}
这个 for 循环将准确执行 n 次。
因此这个函数的总复杂度是:
C = O(1) + n * O(1) + O(1) = O(n)
意味着这个函数将花费时间与n的值成比例。
【解决方案2】:
时间/空间复杂度O(1)表示一个常数复杂度,常数不一定是1,可以是任意数,但必须是常数,不依赖于n。例如,如果你总是有 1000 个变量(独立于 n),它仍然会给你 O(1)。有时甚至可能会发生常数与您的n 相比如此之大,以至于 O(n) 会比具有该常数的 O(1) 好得多。
现在,在您的情况下,您的时间复杂度为 O(n),因为您进入循环 n 次,并且每个循环具有恒定的时间复杂度,因此它线性取决于您的 n .但是,您的空间复杂度独立于n(您始终保留相同数量的变量)并且是恒定的,因此它将是 O(1)