用于处理列表的所有连续子序列的朴素代码的算法复杂度:n ^ 2或n ^ 3?

Set*_*eno 29 java algorithm big-o time-complexity

我正在研究测试并发现了这个问题:

我无法确定复杂性,我认为它是O(n 2)或O(n 3)而我倾向于O(n 3).
有人能告诉我它是什么以及为什么?

我认为它是O(n 2)是因为在j循环中,j = i它给出了一个三角形的形状,然后k循环从i + 1j,我认为是三角形的另一半.

public static int what(int[] arr)
{
    int m = arr[0];
    for (int i=0; i<arr.length; i++)
    {
        for (int j=i; j<arr.length;j++)
        {
            int s = arr[i];
            for (int k=i+1; k<=j; k++)
             s += arr[k];
            if (s > m)
             m = s;
        }
    }
    return m;
}
Run Code Online (Sandbox Code Playgroud)

如果你能告诉我它的作用吗?

我想它返回正整数的加法或数组中的最大整数.
但对于像{99, -3, 0, 1}它这样的数组返回99,我认为这是因为它是错误的.如果不是我不知道它做了什么:

{99, 1} => returns 100
{-1, -2, -3} => return -1
{-1, 5, -2} => returns 5
{99, -3, 0, 1} => returns 99 ???
Run Code Online (Sandbox Code Playgroud)

Moh*_*ssi 49

您可以使用Sigma Notation有条不紊地处理增长复杂性的顺序:

在此输入图像描述

  • +1,这就是为什么我很遗憾许多大学放弃了CS学位的工程数学要求...... (15认同)
  • 我成了一名EE + CS专业.所以我不得不经历所有高级数学,我的CS专家都不得不触摸......虽然我没有保留那么多的数学,但我很高兴我还是在某个时候学到了它.至少我知道什么时候需要它. (2认同)
  • 我已经仔细检查了倒数到倒数第二行(此时"O(n ^ 3)"已经被清楚地识别出来了)我也确认没有错误!值得注意的是,在相关的`n ^ 3`项前面的常数因子是'1/12`,而不是典型的`1/2`用于形成每个的'O(n ^ 2)`算法可能从序列中成对并对该对进行计算.也就是说,OP问题中的第三个总和 - 从"i"到"j" - 将常数因子加上"1/6",暗示这个子序列平均为"1/6"长度序列. (2认同)

Sil*_*cea 15

你有3个声明.对于大型n,很明显是O(n^3).ijO(n)各自k是短一点点,但仍O(n).

该算法返回连续项的最大总和.这就是为什么最后一个它返回99,即使你有0和1,你也有-3将你的总和降到最大97.

PS:三角形意味着 1 + 2 + ... + n = n(n+1) / 2 = O(n^2)

  • 不,9是正确的.它将选择5,3,-2,2和1.它不必从头开始. (4认同)

Kha*_*d.K 9

码:

for (int i=0; i<arr.length; i++) // Loop A
{
    for (int j=i; j<arr.length;j++) // Loop B
    {
        for (int k=i+1; k<=j; k++) // Loop C
        {
            // ..
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Big-O的渐近分析:

Loop A: Time = 1 + 1 + 1 + .. 1 (n times) = n

Loop B+C: Time = 1 + 2 + 3 + .. + m = m(m+1)/2

Time = SUM { m(m+1)/2 | m in (n,0] }

Time < n * (n(n+1)/2) = 1/2 n^2 * (n+1) = 1/2 n^3 + 1/2 n^2

Time ~ O(n^3)
Run Code Online (Sandbox Code Playgroud)

  • 这不是真的正确.B + C不是n(n + 1)/ 2,因为j以i开头.如果不计算结果,我认为n(n-1)/ 2更准确.当然,就大哦来说,这是无关紧要的. (2认同)