这是使用DP方法找到最大连续子序列和的算法。该算法似乎很好,但有人提到它具有空间复杂度O(n)。为什么呢?
对我而言,这个算法似乎具有O(1)空间复杂度。 我想问的另一件事是,如果算法不使用任何类型的递归,它是否仍然可以拥有除常量空间复杂度之外的任何东西?
Create arrays S and T each of size n.
S[0] = A[0];
T[0] = 0;
max = S[0];
max_start = 0, max_end = 0;
For i going from 1 to n-1:
// We know that S[i] = max { S[i-1] + A[i], A[i] .
If ( S[i-1] > 0)
S[i] = S[i-1] + A[i];
T[i] = T[i-1];
Else
S[i] = A[i];
T[i] = i;
If ( S[i] > max)
max_start = T[i];
max_end = i;
max = S[i];
EndFor.
Output max_start and max_end
答案 0 :(得分:7)
第一行说明了一切:
创建大小为n的数组S和T.
大小为n的数组需要Θ(n)空间,因此您的算法会自动使用Ω(n)空间。查看算法的其余部分,您可以看到只使用了O(1)个其他变量,并且没有递归,因此使用的总空间为Θ(n)。
通常,算法的空间复杂度取决于所使用的局部变量的数量以及它们的大小。数组,映射,集合,树等占用与它们所持有的元素数量成比例的空间,因此如果您只使用了恒定数量的变量,如果它们最终存储多个,您仍然可以使用超过O(1)的空间元件。
希望这有帮助!