我有一个稀疏的方阵,边2 * n。
例如。
1,0,0,1,0,1
0,1,1,1,0,1
1,0,0,0,1,1
0,0,1,1,0,0
1,1,1,0,0,0
0,0,0,1,1,0
我需要一种有效的方法来找到一个大小为n * n且最大量为1的子矩阵。
我找到了各种方法,但没有比O(n ^ 4)更快的方法。我还发现了更快的方法,而不要求子矩阵需要为n * n。
编辑: 子矩阵必须是连续的,
答案 0 :(得分:3)
根据您对O(n ^ 4)时间算法的主张,我假设子矩阵必须是连续的,否则问题是NP难的(它比检测更难)一个混合)。对于O(n ^ 2)时间算法,只需进行O(n ^ 2)时间预处理即可实现形式的O(1)时查询"给定a, b, c, d
,计算{ {1}}"
给定数组sum_{i=a}^b sum_{j=c}^d X[i,j]
,按如下方式计算数组X[1..m,1..n]
。
Y[0..m,0..n]
现在,initialize Y to the zero array
for i from 1 to m
for j from 1 to n
Y[i,j] = Y[i-1,j] + X[i,j]
end
end
for i from 1 to m
for j from 1 to n
Y[i,j] = Y[i,j-1] + Y[i,j]
end
end
。要计算Y[c,d] = sum_{i=1}^c sum_{j=1}^d X[i,j]
,请使用包含 - 排除:sum_{i=a}^b sum_{j=c}^d X[i,j]
。