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

Posted

技术标签:

【中文标题】如何找到所有连续的子矩阵?【英文标题】:How can I find all contiguous submatrices? 【发布时间】:2013-02-12 09:37:10 【问题描述】:

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

给定一个任意大小的矩阵,如下所示((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)),这很好,因为我将使用的矩阵不会那么大。

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

【问题讨论】:

那么 (2, 2), (3, 3) 呢?你不算那些? 不,我想我应该指定它只有在它还不是更大的子矩阵的一部分时才会被计算在内。 【参考方案1】:

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

要编写 O(N^4) 解决方案,请执行以下操作 - 使用大小为 O(N^2) 的辅助数组,并在其每个单元格中将左上角在 ( 0,0) 和给定单元格的右下角。有了这个数组,您可以不断地使用:

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 掉出数组的情况。

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

【讨论】:

以上是关于如何找到所有连续的子矩阵?的主要内容,如果未能解决你的问题,请参考以下文章

谷歌面试:在给定的整数数组中找到所有连续的子序列,其总和在给定范围内。我们能比 O(n^2) 做得更好吗?

获取java中矩阵中连续出现k次的所有数字

codeforces_C. Maximum Subrectangle

最大子矩阵和

所有可能的子列表方案

使用最少的矩形覆盖折线,同时保持其连续性