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)