如何找到所有连续的子矩阵?

时间:2013-02-12 09:37:10

标签: algorithm matrix

我只是很难搞清楚这一点。我保证不是为了做作业。

给定一个任意大小的矩阵,如下所示(左(0,0)位于左上角):

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

我一直在试图弄清楚如何找到所有连续子矩阵的坐标。在这个例子中,我应该得到一个这样的列表:

[(2, 1), (3, 3)
 (1, 2), (3, 3)]

我很难弄清楚如何提出这样的清单。我知道算法不会有效(我猜O(n ^ 2)),这很好,因为我将要使用的矩阵不会那么大。

即使只是给我一个解决这个问题的线索,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

你可以拥有的最佳解决方案是O(N ^ 4),因为这是你可以拥有的最大答案大小(如果所有值都是1)。

要编写O(N ^ 4)解决方案,请执行以下操作 - 使用大小为O(N ^ 2)的辅助数组,并在其每个单元格中存储左上角的子矩阵中的数量( 0,0)和给定单元格的右下角。使用此数组,您可以计算矩阵(a,b)(左上角)中的1的数量 - > (c,d)(右下角)经常使用:

num_of_ones(a,b,c,d) = helper_matrix[c][d] + helper_matrix[a-1][b-1] -helper_matrix[a-1][d] -helper_matrix[c][b-1]

a-1b-1从数组中删除时,请注意这些情况。

使用上面检查每个子矩阵是否只填充了一个子矩阵(即其中的1的数量等于子矩阵的大小)。