找到矩阵中任何矩形之和的最快方法

时间:2014-02-28 13:06:05

标签: algorithm math matrix

我有一个m×n矩阵,希望能够计算任意矩形子矩阵的和。对于给定的矩阵,这将发生几次。我应该使用什么数据结构?

例如,我想在矩阵中找到矩形的总和

1   2   3   4
5   6   7   8
9   10  11  12
13  14  15  16

总和是68。

我要做的是逐行累积:

1   2   3   4
6   8   10  12
15  18  21  24
28  32  36  40

然后,如果我想找到矩阵的总和,我只是积累 28,32,36,40 = 136 。只有四次操作而不是15次。 如果我想找到第二和第三行的总和,我只需积累 15,18,21,24 并减去 1,2,3,4。 = 6 + 8 + 10 + 12 + 15 + 18 + 21 + 24 = 68 。 但在这种情况下,我可以使用另一个矩阵,按列累积这个矩阵:

1   3   6   10
5   11  18  26
9   19  30  42
13  27  42  58

在这种情况下,我只是总结 26 42 = 68 。只有2次操作而不是8次。对于更宽的子矩阵,使用第二种方法和矩阵是有效的,对于更高的第一种方法和矩阵。我可以以某种方式将此方法拆分为一个矩阵的方法吗?

所以我只是加入角落并减去另外两个?

2 个答案:

答案 0 :(得分:9)

你的方法几乎就在那里。解决方案是使用求和区域表(又称积分图像):

关键的想法是你通过矩阵进行一次遍历并累积,使得“求和面积表中任意点(x,y)的值只是上面和左边的所有像素的总和(x ,y),包容性。“。

然后,您可以使用四次查找以恒定时间计算任何矩形内的总和。

答案 1 :(得分:0)

为什么不能使用For循环添加它们?

int total = 0;
for(int i = startRow; i = endRow; i++)
{
    for(int j = startColumn; j = endColumn; j++)
    {
        total += array[i][j];
    }
}

你的子阵列(“矩形”)从startRow到endRow(width)和startColumn到endColumn(height)。