为什么这个算法的空间复杂度为O(n)?

时间:2013-11-07 07:05:27

标签: algorithm big-o space-complexity

这是使用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

1 个答案:

答案 0 :(得分:7)

第一行说明了一切:

  

创建大小为n的数组S和T.

大小为n的数组需要Θ(n)空间,因此您的算法会自动使用Ω(n)空间。查看算法的其余部分,您可以看到只使用了O(1)个其他变量,并且没有递归,因此使用的总空间为Θ(n)。

通常,算法的空间复杂度取决于所使用的局部变量的数量以及它们的大小。数组,映射,集合,树等占用与它们所持有的元素数量成比例的空间,因此如果您只使用了恒定数量的变量,如果它们最终存储多个,您仍然可以使用超过O(1)的空间元件。

希望这有帮助!