- 论坛徽章:
- 0
|
有个O(n^3)的算法:
枚举起始行和终止行,枚举个数一共有C(4,2)=6个。
A[0]就是原数组从起始行到终止行的第0列数组之和,那么A[0]一共有6个可能值,复杂度共O(n^2)
A[0,1]=3 第1行到第2行
A[0,2]=4 第1行到第3行
A[0,3]=1 第1行到第4行
A[0,4]=3 第2行到第3行
A[0,5]=0 第2行到第4行
A[0,6]=2 第3行到第4行
然后求出A[1]到A[5]。至此复杂度是O(n^3).
然后对于每个起始行和终止行的情况,求A的线型最大,也就是A[0,1],A[1,1],A[2,1],A[3,1],A[4,1],A[5,1]作为一个数组求一次线性最大,得到从第一行到第二行的子矩阵的最大子子矩阵元素和。
共求了N次线型最大,共花费O(n^2).
二者相加,因此最终的复杂度是O(n^3)。
之所以不用O(n^4)相当于算法本身保存了一部分运算的结果了。
我觉得计算的过程还可以优化一下,例如,如果我们知道了[1,2][2,3][3,4]这几个起始/终止行的组合,就能得到[1,3],[1,4],[2,4]这几个和,少了一些运算。但是我不可能这样能否就从O(n^3)降到了O(n^2)或者O(n^2 lgn)
那么,可不可能比O(n^3)更小呢? |
|