【问题标题】:Finding the most dense n*n sub matrix in a sparse matrix在稀疏矩阵中找到最密集的 n*n 子矩阵
【发布时间】:2014-10-13 18:33:10
【问题描述】:

我有一个边长为 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。

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

【问题讨论】:

    标签: algorithm matrix time-complexity sparse-matrix


    【解决方案1】:

    根据您对 O(n^4) 时间算法的主张,我假设子矩阵必须是连续的,否则问题是 NP-hard(它比检测 biclique 更难)。对于 O(n^2) 时间的算法,只需进行 O(n^2) 时间的预处理,即可启用“给定 a, b, c, d,计算 sum_{i=a}^b sum_{j=c}^d X[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}^d X[i,j]。要计算 sum_{i=a}^b sum_{j=c}^d X[i,j],请使用包含-排除:Y[c,d] - Y[a-1,d] - Y[c,b-1] + Y[a-1,b-1]

    【讨论】:

    • 这似乎还不够。 nxn 子矩阵仍有 ((2n)C(n))^2 选择。您已经描述了如何在 O(1) 时间内评估每个分数的分数,给定 O(n^2) 预处理,但仍有很多选择要枚举。这种“整体图像”方法仅适用于矩阵在空间上排列(如在图像中)的情况。但在这里,“子矩阵”通常定义为由任何可能不连续的行子集和列子集选择的元素。
    • @TimothyShields 我假设子矩阵必须是连续的,因为提问者声称使用 O(n^4) 算法,并且通过 biclique 减少非连续变体是 NP-hard。
    • 尽管陈述这个假设可能是个好主意,因为提问者的 O(n^4) 声明可能是错误的。
    猜你喜欢
    • 2016-06-25
    • 2021-02-23
    • 2014-03-06
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    相关资源
    最近更新 更多