gpt4 book ai didi

algorithm - 二维矩阵中大小为 HxW 的最大子数组

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:30:33 29 4
gpt4 key购买 nike

给定一个二维正整数数组,找到大小为 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) 中所有元素的总和。您可以使用以下逻辑计算累积和矩阵:

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)

Inclusion-Exclusion

然后使用两个循环,您可以将 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)

关于algorithm - 二维矩阵中大小为 HxW 的最大子数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39937212/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com