最大尺寸方形子矩阵,全1

时间:2013-07-22 14:02:08

标签: c algorithm matrix

给定一个二进制矩阵,我找到了所有1 s的最大尺寸方形子矩阵。

例如,考虑以下二进制矩阵:

   0  1  1  0  1 
   1  1  0  1  0 
   0  1  1  1  0
   1  1  1  1  0
   1  1  1  1  1
   0  0  0  0  0

具有所有设置位的最大平方子矩阵是

1  1  1
1  1  1
1  1  1

我在网上搜索了解决方案,并找到了构建辅助矩阵的关系:

 If M[i][j] is 1 then
            S[i][j] = min(S[i][j-1], S[i-1][j], S[i-1][j-1]) + 1
         Else /*If M[i][j] is 0*/
            S[i][j] = 0
  1. 其中M[][]是原始矩阵,s[][]是辅助矩阵?
  2. 这种关系意味着什么?
  3. 它是如何有用的。

3 个答案:

答案 0 :(得分:10)

这是一个经典的动态编程问题。你还没有提到整个算法如下:

要构建辅助数组,我们必须执行以下操作:

  1. 首先将第一行和第一列原样从M [] []复制到S [] []

  2. 对于你提到的其余条目,请执行以下操作:

     If M[i][j] is 1 then
        S[i][j] = min(S[i][j-1], S[i-1][j], S[i-1][j-1]) + 1
     Else /*If M[i][j] is 0*/
        S[i][j] = 0
    
  3. 在S [] []中找到最大条目,并用它来构造最大尺寸的方形子矩阵

  4. 这种关系意味着什么?

    要找到最大平方,我们需要在不同方向上找到1的最小延伸,并在其中加1以形成当前情况下的平方长度。

    对于你的案例,[] []将是:

       0  1  1  0  1
       1  1  0  1  0
       0  1  1  1  0
       1  1  2  2  0
       1  2  2  3  1
       0  0  0  0  0
    

    如果我们只采用最小值S[i][j-1], S[i-1][j],则需要考虑左右方向。但是,我们还需要确保透视方块的左上角有1个。 根据定义,S [i-1] [j-1]包含位于i-1,j-1的最大平方,其左上角是我们可以获得的向上和向左的上限。所以,我们也需要考虑这一点。

    希望这有帮助!

答案 1 :(得分:2)

您可以在线性时间内完成此操作。

声明:我可以在线性时间内构建一个数据结构,让我可以在恒定的时间内检查任意矩形是否已满1。

证明:部分金额;将S[i][j]作为(i, j)左上方1的总数。在(a,b)上方和左侧(c,d)提供的(a,b)(c,d)之间的矩形中的数量为S[c][d] + S[a][b] - S[a][d] - S[b][c]

现在它是对阵列的简单扫描:

size = 1;
For i = 0 to m-size {
  For j = 0 to n-size {
    If S[i+size][j+size] - S[i][j+size] - S[i+size][j] + S[i][j] == size*size {
      size++; j--; continue;
    }
  }
}

最后,size比最大的1平方正大。

答案 2 :(得分:-1)

你可以构建一个额外的递归函数,它将当前行和col作为参数,并从中查找任意大小的正方形。

从你的其他功能,aftter额外的功能返回一个值,你必须进行2次调用: 一个来自(row,col + 1),另一个来自(row + 1,col)。

这是一种回溯用法,我们会检查所有选项。