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)。
答案 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)
。如果您正确地代表了图书的内容,则会出现同一问题中的两个错误。