给定一个2维正整数数组,求和最大的HxW子矩形。矩形的总和是该矩形中所有元素的总和。
输入:具有正元素的二维数组NxN子矩形的HxW大小
输出:HxW大小的子矩阵,其元素的总和最大。
我已经使用蛮力方法解决了这个问题,但是,我现在正在寻找一个具有更好复杂性的更好的解决方案(我的蛮力法的复杂性是O(n6))。
首先创建矩阵的累积和:O(n2)
Matrix
2 4 5 6
2 3 1 4
2 0 2 1
Cumulative sum
2 6 11 17
4 11 17 27
6 13 21 32
cumulative_sum(i,j)
是子矩阵(0:i,0:j)<-code>中所有元素的总和。您可以使用以下逻辑计算累积和矩阵:
cumulative_sum(i,j) = cumulative_sum(i-1,j) + cumulative_sum(i,j-1) - cumulative_sum(i-1,j-1) + matrix(i,j)
使用累积和矩阵,您可以计算 O(1) 中每个子矩阵的总和:
calculating sum of submatrix (r1 ... r2 , c1 ... c2)
sum_sub = cumulative_sum(r2,c2) - cumulative_sum(r1-1,c2) - cumulative_sum(r2,c1-1) + cumulative_sum(r1-1,c1-1)
然后使用两个循环,您可以将HW矩形的左上角放在矩阵的每个点上,并计算该矩形的和。
for r1=0->n_rows
for c1=0->n_cols
r2 = r1 + height - 1
c2 = c1 + width - 1
if valid(r1,c1,r2,c2) // doesn't exceed the original matrix
sum_sub = ... // formula mentioned above
best = max(sum_sub, best)
return best
此方法在 O(N2) 中。
下面是python实现:
from copy import deepcopy
def findMaxSubmatrix(matrix, height, width):
nrows = len(matrix)
ncols = len(matrix[0])
cumulative_sum = deepcopy(matrix)
for r in range(nrows):
for c in range(ncols):
if r == 0 and c == 0:
cumulative_sum[r][c] = matrix[r][c]
elif r == 0:
cumulative_sum[r][c] = cumulative_sum[r][c-1] + matrix[r][c]
elif c == 0:
cumulative_sum[r][c] = cumulative_sum[r-1][c] + matrix[r][c]
else:
cumulative_sum[r][c] = cumulative_sum[r-1][c] + cumulative_sum[r][c-1] - cumulative_sum[r-1][c-1] + matrix[r][c]
best = 0
best_pos = None
for r1 in range(nrows):
for c1 in range(ncols):
r2 = r1 + height - 1
c2 = c1 + width - 1
if r2 >= nrows or c2 >= ncols:
continue
if r1 == 0 and c1 == 0:
sub_sum = cumulative_sum[r2][c2]
elif r1 == 0:
sub_sum = cumulative_sum[r2][c2] - cumulative_sum[r2][c1-1]
elif c1 == 0:
sub_sum = cumulative_sum[r2][c2] - cumulative_sum[r1-1][c2]
else:
sub_sum = cumulative_sum[r2][c2] - cumulative_sum[r1-1][c2] - cumulative_sum[r2][c1-1] + cumulative_sum[r1-1][c1-1]
if best < sub_sum:
best_pos = r1,c1
best = sub_sum
print "maximum sum is:", best
print "top left corner on:", best_pos
matrix = [ [2,4,5,6],
[2,3,1,4],
[2,0,2,1] ]
findMaxSubmatrix(matrix,2,2)
输出
maximum sum is: 16
top left corner on: (0, 2)
我有一个大的NxN位数组,有K个1(其他都是0)。所有非零点的坐标都是已知的——换句话说,这个n×n数组可以表示为K对数组,每个数组包含一个非零点的x和y坐标。 给定一个HxW大小的子矩阵,我需要将其放在我的原始NxN数组上,使其覆盖大多数非零点。 输入:子矩阵的高度H和宽度W 输出:HxW子数组的x和y协弦,其内部有最多的协弦 之前也回答过类似的问题:2D矩阵中尺寸为HxW的最大子阵列,但在我的
我有一个数据集,它有4列/属性和150行。我想用最小最大规范化来规范化这个数据。到目前为止,我的代码是: 这里,和返回全局最小值和最大值。因此,这段代码实际上对2D矩阵中的所有值应用最小-最大规范化,以便全局最小值为0,全局最大值为1。 然而,我想对每一列分别执行相同的操作。具体来说,2D矩阵的每一列都应该独立于其他列进行最小-最大规格化。 我尝试使用只是使用和,但得到的错误说矩阵维度必须一致。
我实现了c程序,可以找到矩阵的元素:行的最大元素,同时列的最小元素,或行的-min元素,同时列的最大元素。例如,我们有数据。包含以下内容的txt文件: 4 7 8 9 10 6 5 4 11 5 0 1 12 4 2 7 13- 其中4是n-矩阵大小(4x4),7和10是这些数字。 下面是代码: 问题:我想知道我的代码是不是“脏”代码?因为我总是渴望让一切变得如此困难,只要有可能让它变得容易。是否
问题内容: 我正在自学一些Java,并且坚持创建2D数组,该数组使用随机值对其进行初始化,然后创建该数组的转置。 示例输出为: 原始矩阵 转置矩阵 ^应该是最终输出。代码的一些帮助将不胜感激! 如果行或列的数量超出指定范围,我想编写代码以生成错误消息。以及是否从命令行读取矩阵元素而不是随机生成它们。 问题答案: 这是返回转置矩阵的int [] []的简单方法… 比起打印二维矩阵,您可以使用如下方法
我用直方图解决方案编写了这段代码,但用户将输入其矩阵,而不是在代码上输入矩阵。现在看看我做错了什么,除了柱状图的数学之外,一切似乎都正常。我做错了什么? 用户将输入行和列,然后一个接一个地输入矩阵中的每个值。然后代码将显示矩阵并计算所有1的最大大小矩形二进制子矩阵。
我正在寻找一个有效的解决方案,从矩阵中选择不重叠的值,而不考虑成本的最小化。匈牙利算法通过选择一个代价最小的组合来解决指派问题。然而,我想要一个最大值的最小化。 匈牙利人会选择 总成本=1+2+5=8 但是,最大值为5。 我希望将组合选择为 所以我想要的输出是:4,3,2 而不是成本最小化。我想选择一个最小最大数量的组合。