我有一个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次。对于更宽的子矩阵,使用第二种方法和矩阵是有效的,对于更高的第一种方法和矩阵。我可以以某种方式将此方法拆分为一个矩阵的方法吗?
所以我只是加入角落并减去另外两个?
答案 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)。