以下算法的时间复杂度是多少?

时间:2017-01-31 06:10:01

标签: algorithm matrix big-o

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));
                }
            }
        }
    }
}

allSubMatrices的时间复杂度是多少?我所指的那本书(Cracking the coding interview)提到了o(n ^ 4)。但这对我来说并不令人信服,因为所有循环都没有运行N次,它从1变为N.我觉得它应该是o(n ^ 2)。

3 个答案:

答案 0 :(得分:0)

我认为它甚至 O n ^ 5)。我没有确切的证据,只是一个例子。如果你只计算你得到的循环的步骤:

sum(1 <= l <= n){sum(1 <= i <= n - l){sum(1 <= j <= n - l){ j^2 }}}

三个总和描述了通过立方体切割(四边形)产生的三角形图形。这个数字的体积增长如 O n ^ 3),完整公式增长的平方和如 O n ^ 5)。

答案 1 :(得分:0)

如果n = width = height,那么它不能是O(n ^ 2),因为如果我们只接受allSubmatrices中的所有外部循环,它们将已经是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)。

答案 2 :(得分:0)

printSum(_, _, len)len^2

添加sum

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

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).

使用Wolfram Alpha来简化:

1/30 * n * (n + 1) * (n^3 + 4n^2 + 6n + 4)

那是O(n ^ 5)。

顺便提一下,问题中的代码存在问题。它看起来像支持非方形矩阵(实际上,示例矩阵是4x5)。但是,如果宽度小于高度,则代码无法正常运行,因为l的范围仅为1到a[0].length。正确的范围是1到max(a[0].length, a.length)。如果您正确地代表了图书的内容,则会出现同一问题中的两个错误。