Algorithm 以下算法的时间复杂度是多少? class所有子矩阵{ INTA[][]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20}, { 21, 22, 23, 24, 25 } }; 所有子矩阵(){ } 整数打印和(整数r,整数c,整数len){ 整数和=0; 对于(int i=r;i

Algorithm 以下算法的时间复杂度是多少? class所有子矩阵{ INTA[][]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20}, { 21, 22, 23, 24, 25 } }; 所有子矩阵(){ } 整数打印和(整数r,整数c,整数len){ 整数和=0; 对于(int i=r;i,algorithm,matrix,big-o,Algorithm,Matrix,Big O,我认为它是偶数O(n^5)。我没有确切的证明,只有一个图解。如果你只计算循环的步数,你会得到: class AllSubMatrices { int a[][] = { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 10 }, { 11, 12, 13, 14, 15 }, { 16, 17, 18, 19, 20 }, { 21, 22, 23, 24, 25 } }; AllSubMatrices() { }

我认为它是偶数O(n^5)。我没有确切的证明,只有一个图解。如果你只计算循环的步数,你会得到:

class AllSubMatrices {

    int a[][] = { { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 10 }, { 11, 12, 13, 14, 15 }, { 16, 17, 18, 19, 20 },
            { 21, 22, 23, 24, 25 } };

    AllSubMatrices() {
    }

    int printSum(int r, int c, int len) {

        int sum = 0;

        for (int i = r; i < (r + len); i++) {
            for (int j = c; j < (c + len); j++) {
                sum = sum + a[i][j];
            }
        }

        return sum;
    }

    public void allSubMatrices() {
        for (int l = 1; l <= a[0].length; l++) {
            for (int i = 0; i <= (a[0].length - l); i++) {
                for (int j = 0; j <= (a.length - l); j++) {
                    System.out.println(printSum(i, j, l));
                }
            }
        }
    }
}

sum(1如果这里n=width=height,那么它不可能是O(n^2),因为如果我们只取所有子矩阵中的所有外部循环,它们将是O(n^3)printSum中的两个内部循环更有趣,它们基本上是l^2运算,其中l是从1到n计数的外部循环的变量。如果我们只计算一个外部循环加上printSum调用,运算的数量将是n个数的所有平方的总和,即n^3/3+n^2/2+n/6,即O(n^3)。如果我们再添加两个循环,它将是O(n^5)。

printSum(,,len)
sum添加
len^2

然后,假设数组的宽度和高度相同,并调用数组的宽度/高度
n
,则总体复杂度为:

sum(1 <= l <= n){sum(1 <= i <= n - l){sum(1 <= j <= n - l){ j^2 }}}
使用以简化提供:

sum(sum(sum(l^2 for j=0..n-l) for i=0..n-l) for l=1..n).
= sum((n-l+1)^2 * l^2 for l=1..n).
这是O(n^5)


顺便说一句,问题中的代码有一个问题。它看起来是为了支持非方矩阵而编写的(事实上,示例矩阵是4x5)。但是如果宽度小于高度,则代码无法正常工作,因为
l
的范围仅为1到
a[0].length
。正确的范围是1到
max(a[0]。length,a.length)
。如果正确表示书中的内容,这是同一问题中的两个错误。

它打印多少个数字?n的值是多少?宽度=高度=n?
1/30 * n * (n + 1) * (n^3 + 4n^2 + 6n + 4)