我有一个包含各种数据点的2D数组。参见图1。 我需要将其分成4个象限,使得每个象限内的所有点的总和最小化。每个象限的最小尺寸是4x4,它可以更大但不能更小,并且它不一定必须是正方形。例如,最佳象限可以具有5×3的大小。
我需要找到最佳索引x和y,这将导致象限内的最小总和。
我看到了重量分配问题。我可以在我的2D数组中添加所有值,并得到总和,S。现在我需要或多或少地平均分配4个象限的和S.我知道我已经提到每个象限的总和必须尽可能小,但它更像是平衡的最小值。
答案 0 :(得分:3)
您可以使用Summed Area Table有效地对每个象限中的值求和。这是一个与矩阵具有相同尺寸的矩阵,其中table[i][j]
是原始矩阵中从行0到i和列0到j的所有元素的总和。
您可以像这样计算(伪代码):
for i = 0 to rows
row_sum = 0
for j = 0 to columns
row_sum += matrix[i][j]
table[i][j] = row_sum
if i > 0
table[i][j] += table[i-1][j]
上面的代码在每一行中保持一个运行总和,并将它添加到同一列上一行的表条目中。
然后,您可以使用此表计算给定拆分的每个象限的值。假设你想在第i行之后水平分割成象限,在第j列之后垂直分割,象限是这样的:
a | b
--+--
c | d
您可以像这样计算象限和:
a = table[i][j]
b = table[i][columns-1] - a
c = table[rows-1][j] - a
d = table[rows-1][columns-1] - (a + b + c)
因此,您可以迭代矩阵并使用4个表查找和一些简单的加法和减法计算每个可能的分割位置的象限总和。跟踪最佳(根据您的标准,例如最小象限和最大值之间的最小差异)以及您的答案。
它是矩阵中元素数量的O(n)。