Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在稀疏矩阵中寻找最稠密的n*n子矩阵_Algorithm_Matrix_Time Complexity_Sparse Matrix - Fatal编程技术网

Algorithm 在稀疏矩阵中寻找最稠密的n*n子矩阵

Algorithm 在稀疏矩阵中寻找最稠密的n*n子矩阵,algorithm,matrix,time-complexity,sparse-matrix,Algorithm,Matrix,Time Complexity,Sparse Matrix,我有一个边为2*n的稀疏平方矩阵 例如 我需要一种有效的方法来找到一个大小为n*n,最大数量为1s的子矩阵 我已经找到了各种各样的方法,但是没有比O(n^4)更快的方法。我还找到了更快的方法,不需要子矩阵必须是n*n 编辑: 子矩阵必须是连续的,基于你对O(n^4)时间算法的主张,我假设子矩阵必须是连续的,否则问题是NP难的(比检测双解更难)。对于O(n^2)时间算法,只需进行O(n^2)时间预处理,即可实现形式为“给定a,b,c,d,计算sum{i=a}^b sum{j=c}^dx[i,j]”

我有一个边为2*n的稀疏平方矩阵

例如

我需要一种有效的方法来找到一个大小为n*n,最大数量为1s的子矩阵

我已经找到了各种各样的方法,但是没有比O(n^4)更快的方法。我还找到了更快的方法,不需要子矩阵必须是n*n

编辑:
子矩阵必须是连续的,

基于你对O(n^4)时间算法的主张,我假设子矩阵必须是连续的,否则问题是NP难的(比检测双解更难)。对于O(n^2)时间算法,只需进行O(n^2)时间预处理,即可实现形式为“给定
a,b,c,d
,计算
sum{i=a}^b sum{j=c}^dx[i,j]
”的O(1)时间查询

给定数组
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}^dx[i,j]
。要计算
sum{i=a}^b sum{j=c}^dx[i,j]
,请使用包含排除:
Y[c,d]-Y[a-1,d]-Y[c,b-1]+Y[a-1,b-1]
,这似乎不够。对于nxn子矩阵,仍然有((2n)C(n))^2种选择。您已经描述了如何在给定O(n^2)个预处理的情况下,在O(1)个时间内计算每个人的分数,但是仍然有很多选择要列举。这种“整体图像”方法仅适用于矩阵在空间上排列(如在图像中)的情况。但是在这里,“子矩阵”通常被定义为由任何可能不连续的行子集和列子集选择的元素。@TimothyShields我假设子矩阵必须是连续的,因为asker声明了一个O(n^4)算法和非邻接变量是NP难的,可以从biclique中进行简化。不过,陈述这个假设可能是个好主意,因为asker的O(n^4)声明可能是错误的。
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