Arrays 为什么子阵蛮力的最大和为O(n^2)?

Arrays 为什么子阵蛮力的最大和为O(n^2)?,arrays,algorithm,computer-science,Arrays,Algorithm,Computer Science,这是计算机科学中的著名问题 至少有两种解决方案: 蛮力,找到所有可能的子数组并找到最大值 通过数组的第一个过程时,使用的变量计算全局最大值 在一段视频中,作者提到了暴力方法是O(n^2),读到这段视频时,一个人认为它是O(n^2),另一个人认为它是O(n^3) 蛮力是O(n^2)还是O(n^3)?更重要的是,你能举例说明你对蛮力方法进行了什么分析,从而知道它是O(?)?这可以用O(N)完成,如下所示!!! 我错过什么了吗 int[] arr = {}; //elements; i

这是计算机科学中的著名问题

至少有两种解决方案:

  • 蛮力,找到所有可能的子数组并找到最大值
  • 通过数组的第一个过程时,使用的变量计算全局最大值
  • 在一段视频中,作者提到了暴力方法是
    O(n^2)
    ,读到这段视频时,一个人认为它是
    O(n^2)
    ,另一个人认为它是
    O(n^3)

    蛮力是O(n^2)还是O(n^3)?更重要的是,你能举例说明你对蛮力方法进行了什么分析,从而知道它是
    O(?)

    这可以用O(N)完成,如下所示!!! 我错过什么了吗

        int[] arr = {}; //elements;
        int max = 0, temp = 0;
        for (int i = 0; i < arr.length; i++) {
            temp = Math.max(arr[i], arr[i] + temp);
            max = Math.max(temp, max);
        }
        System.out.println(max); //result
    
    int[]arr={}//元素;
    int max=0,temp=0;
    对于(int i=0;i
    好吧,这取决于原力有多强大


    如果我们生成所有的
    (i,j):i这里有三个解决最大子阵和问题的方法
    solve1()
    在O(N)时间内运行,
    solve2()
    在O(N^2)时间内运行,
    solve3()
    在O(N^3)时间内运行。请注意,
    solve1()
    被称为卡丹算法

    O(N^2)和O(N^3)函数之间的区别在于,在O(N^2)函数中,每当
    end
    索引增加时,都会隐式计算总和,而在O(N^3)函数中,总和是通过
    start
    end
    之间的第三个显式循环计算的

    我还为所有三种方法添加了代码,以处理所有输入值均为负值的情况

    公共类最大子数组和{
    /**
    *求解O(N)时间内的最大子阵列和。
    */
    公共静态int solve1(int[]输入){
    整数和=输入[0];
    int bestSum=总和;
    for(int i=1;i
    输出为:

    Input: -2, -3,  4, -1, -2, -1, -5, -3
    solve1 result = 4
    solve2 result = 4
    solve3 result = 4
    
    Input: -2, -3, -4, -1, -2, -1, -5,  3
    solve1 result = 3
    solve2 result = 3
    solve3 result = 3
    
    Input: -2, -3, -4, -1, -2, -1, -5, -3
    solve1 result = -1
    solve2 result = -1
    solve3 result = -1
    
    Input: -2, -3,  4, -1, -2,  1,  5, -3
    solve1 result = 7
    solve2 result = 7
    solve3 result = 7
    

    这就是问题中提到的Kadane算法。非常感谢您描述这两种暴力解决方案!请你解释一下你是如何知道哪个是O(n^2)哪个是O(n^3)的好吗?@mbigras注意嵌套循环的数量作为一阶近似值。啊,我明白了,嵌套循环大约决定了复杂性。当教程的作者声称他的暴力方法是
    O(n^2)
    时,他是不是弄错了?它可以是任意的,因为它没有解释数组和是如何计算的。如果完成完整计算,则为
    n^3
    ,如果使用上一个总和,则为
    n^2
    ....
    for(int i = 0; i < n; i++) {
        int sum = 0;
        for (int j = i; j < n; j++) {
            sum += a[j];
            if (sum > max)
                max = sum;
        }
    }
    
    Input: -2, -3,  4, -1, -2, -1, -5, -3
    solve1 result = 4
    solve2 result = 4
    solve3 result = 4
    
    Input: -2, -3, -4, -1, -2, -1, -5,  3
    solve1 result = 3
    solve2 result = 3
    solve3 result = 3
    
    Input: -2, -3, -4, -1, -2, -1, -5, -3
    solve1 result = -1
    solve2 result = -1
    solve3 result = -1
    
    Input: -2, -3,  4, -1, -2,  1,  5, -3
    solve1 result = 7
    solve2 result = 7
    solve3 result = 7