如何在0-1矩阵中找到至少K 1的最小子矩形

时间:2012-07-24 12:23:50

标签: algorithm

我遇到了一个给出NxM 0-1矩阵和数K(< = NxM)的atoridinary问题,我必须找到该0-1矩阵的最小子矩形区域,其内部至少有K 1个子矩形。此外,它的面积(两个尺寸的乘积)应该最小化。

例如:
00000
01010
00100
01010
00000
K = 3

所以我可以找到一个最小区域6的子矩形,里面包含3个1 10个
01
10

请注意,我所指的目标子矩形应包含原始0-1矩阵的连续行数和列数。

3 个答案:

答案 0 :(得分:3)

Compute cumulative sum of rows R[i,j] and columns C[i,j].
For top-left corner (i,j) of each possible sub-rectangle:
   Starting from a single-row sub-rectangle (n=i),
   Search the last possible column for this sub-rectangle (m).
   While m>=j:
     While there are more than 'k' "ones" in this sub-rectangle:
       If this is the smallest sub-rectangle so far, remember it.
       Remove column (--m).
       This decreases the number of "ones" by C[m+1,n]-C[m+1,j-1].
     Add next row (++n).
     This increases the number of "ones" by R[m,n]-R[i-1,n].

时间复杂度为O(NM(N + M))。

可以通过将线性搜索更改为二进制搜索(以更快地处理瘦子矩形)来优化两个嵌套循环。

也可以(在向子矩形添加行/列之后)减少O(1)时间列/行的数量,使得该子矩形的面积不大比最好的子矩形区域。

这两种优化都需要计算O(1)中的任何子矩形权重。为了使其成为可能,预先计算子矩形[1..i,1..j](X [i,j])的所有元素的累积和。然后任何子矩形[i..m,j..n]的权重计算为X[m,n]-X[i-1,n]-X[m,j-1]+X[i-1,j-1]


Compute cumulative sum of columns C[i,j].
For any starting row (k) of possible sub-rectangle:
  For any ending row (l) of possible sub-rectangle:
    Starting column (m = 1).
    Ending column (n = 1).
    While n is not out-of-bounds
      While there are less than 'k' "ones" in sub-rectangle [k..l,m..n]:
        Add column (++n).
        This increases the number of "ones" by C[l,n]-C[k-1,n].
      If this is the smallest sub-rectangle so far, remember it.
      Remove column (++m).
      This decreases the number of "ones" by C[l,m-1]-C[k-1,m-1].

时间复杂度为O(N 2 M)。

当在其中处理的所有子矩形都是单列子矩形(太多行)或者在其内部处理的子矩形中没有包含足够的“1”时,可以终止循环'l'。没有足够的行。)

答案 1 :(得分:0)

问题是NP-hard,因为clique decision problem可以减少到它。所以没有比尝试所有可能的子矩阵的强力方法更有效的算法(除非P = NP)。

集团决策问题可以通过以下方式解决您的问题:

  • 让矩阵成为图的邻接矩阵。
  • 设置K = L ^ 2,其中L是我们要寻找的集团的大小。
  • 在此输入上解决您的问题。该图包含一个L-clique iff,您的问题的解决方案是仅包含一个的LxL子矩阵(可以在多项式时间内检查)。

答案 2 :(得分:0)

离开我的头顶,你可以列出矩阵中所有坐标对的坐标对(?),找到其中每个K-组合的(最小的)包含子矩形*,然后选择其中最小的。

*由K组合中最小和最大的行和列索引定义。