如何计算矩阵的子矩阵

时间:2015-03-15 08:36:38

标签: algorithm submatrix

我正在为一家名为Code Nation的公司进行测试,并且遇到了这个问题,要求我计算一个数字k出现在子矩阵M [n] [n]中的次数。现在有一个例子说输入就像这样。

5
1 2 3 2 5
36

M[i][j]a[i]*a[j]计算 在计算上我可以计算出来。

1,2,3,2,5
2,4,6,4,10
3,6,9,6,15
2,4,6,4,10
5,10,15,10,25

现在我必须计算36在M的子矩阵中出现的次数。

答案是5。

我无法理解如何计算这个子矩阵。如何表现呢? 我有一个天真的方法导致了许多矩阵,我认为没有一个是正确的。

其中一个是Submatrix [i] [j]

1 2 3  2  5
3 9 18 24 39
6 18 36 60 99
15 33 69 129 228
33 66 129 258 486

这是通过将0,0之前的所有数字添加到i,j

而形成的

在这36次没出现5次所以我知道这是不正确的。如果你可以使用一些伪代码备份它,那将是锦上添花。

感谢帮助

[编辑]:推荐关注link 1 link 2

1 个答案:

答案 0 :(得分:1)

我的猜测是你必须计算M的总和等于36的子矩阵。

这是Matlab代码:

a=[1,2,3,2,5];
n=length(a);
M=a'*a;
count = 0;
for a0 = 1:n
    for b0 = 1:n
        for a1 = a0:n
            for b1 = b0:n
                A = M(a0:a1,b0:b1);
                if (sum(A(:))==36)
                    count = count + 1;
                end
            end
        end
    end
end
count

打印出5。

所以你正确计算M,但是你必须考虑M的每个子矩阵,例如,M是

1,2,3,2,5
2,4,6,4,10
3,6,9,6,15
2,4,6,4,10
5,10,15,10,25

所以一个可能的子矩阵是

1,2,3
2,4,6
3,6,9

如果你把所有这些加起来,那么总和等于36。

answer on cstheory为此提供O(n ^ 3)算法。