Java 利用步数计算算法的复杂度

Java 利用步数计算算法的复杂度,java,algorithm,big-o,time-complexity,Java,Algorithm,Big O,Time Complexity,首先-是的,我在这里读了几篇文章,以及其他一些关于估计算法复杂性的地方 我读过,和其他人一样 我想试试我写的一个算法,它能找到最大的矩形,看看我是否能从我读到的东西中理解任何东西 public static long getLargestRectangle(long[] arr, int index, long max) { int count = 1; //1 step * 1 int i = index

首先-是的,我在这里读了几篇文章,以及其他一些关于估计算法复杂性的地方

我读过,和其他人一样

我想试试我写的一个算法,它能找到最大的矩形,看看我是否能从我读到的东西中理解任何东西

public static long getLargestRectangle(long[] arr, int index, long max) {
    int count = 1;      //1 step * 1                               
    int i = index - 1;   //1 step * 1
    int j = index + 1;  //1 step * 1

    if(index == arr.length-1) return max; //1 step * 2

    while(i > -1 && arr[index] <= arr[i]) { //1 step * (N+1)
        count++;                             //1 step * N
        i--;                                 //1 step * N
    }
    while(j <= arr.length-1 && arr[index] <= arr[j]) { //1 step * (N+1)
        count++;                                        //1 step * N
        j++;                                            //1 step * N
    }

    max = (max < (arr[index] * count) ? (arr[index] * count) : max); //1 step * 7

    return getLargestRectangle(arr, index + 1, max); //1 step * 1
}

    //total number of steps: 1 + 1 + 1 + (N + 1) + N + N + (N + 1) + N + N + 7 
    //=> 6N + 12 = O(N) ?   
如果这是错误的,我真的很感激你能更新你的答案,并告诉我

我离这儿远吗?我想了解一些情况

恐怕是这样:(

上面这不是一个步骤,而是该方法的递归调用。该方法将数组“收缩”1个元素,因此该步骤实际花费
T(n-1)
,其中
T(.)
是算法的时间复杂度。
结合你已经拥有的,你会得到

T(n) = T(n-1) + O(N) 
求解此递推公式将增加算法的复杂性


注:
T(n)=T(n-1)+O(n)
是一种合成糖,它实际上应该是
T(n)矩形在哪里?看起来你只是在比较longs@ControlAltDel在数组中,我存储不同的高度,并根据这些高度计算可以生成的最大矩形是什么。这是一个非常著名的问题,名为“直方图中的最大矩形区域”如果你在掌握如何解决这个问题上有困难,或者看不到关于常用方法复杂性的解释,我建议你在谷歌上搜索一下。您还应该学习如何进行基本的复杂性测试。只需对不同数组输入大小的算法计时,并绘制结果。您很快就会发现您的方法在复杂性方面不是线性的。@Synergist当有100.000个元素时,我的代码需要0,69秒。
return getLargestRectangle(arr, index + 1, max); //1 step * 1
T(n) = T(n-1) + O(N)