求最大子矩阵算法
我有一个 N*N 矩阵(N=2 到 10000),其数字范围可能为 0 到 1000。 如何找到由相同数字组成的最大(矩形)子矩阵?
示例:
1 2 3 4 5
-- -- -- -- --
1 | 10 9 9 9 80
2 | 5 9 9 9 10
3 | 85 86 54 45 45
4 | 15 21 5 1 0
5 | 5 6 88 11 10
输出应该是子矩阵的面积,后跟其左上角元素的从 1 开始的坐标。例如,它会是 (6, 2, 1)
,因为有六个 9
位于第 2 列、第 1 行。
I have an N*N matrix (N=2 to 10000) of numbers that may range from 0 to 1000.
How can I find the largest (rectangular) submatrix that consists of the same number?
Example:
1 2 3 4 5
-- -- -- -- --
1 | 10 9 9 9 80
2 | 5 9 9 9 10
3 | 85 86 54 45 45
4 | 15 21 5 1 0
5 | 5 6 88 11 10
The output should be the area of the submatrix, followed by 1-based coordinates of its top left element. For the example, it would be (6, 2, 1)
because there are six 9
s situated at column 2, row 1.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这是一项正在进行的工作
我思考过这个问题,我想我可能有一个
O(w*h)
算法。这个想法是这样的:
(i,j)
计算从(i,j) 开始的
。将此值存储为j
列中具有相同值的最大单元格数)heights[i][j]
。高度>的子矩阵高度[i][j]
。因为高度>的子矩阵heights[i][j]
无法在此单元格上继续(i,j,heights[i][j])
定义的子矩阵,其中j
是我们可以拟合高度子矩阵的最远坐标:高度[i][j]
棘手的部分位于内部循环中。我使用类似于最大子窗口算法的算法来确保每个单元格的平均复杂度为
O(1)
。我将尝试提出一个证明,但同时这是代码。
This is a work in progress
I thought about this problem and I think I may have a
O(w*h)
algorithm.The idea goes like this:
(i,j)
compute the highest number of cells with the same value in the columnj
starting from(i,j)
. Store this values asheights[i][j]
.height > heights[i][j]
. Because the submatrix with height >heights[i][j]
cannot continue on this cell(i,j,heights[i][j])
wherej
is the farest coordinate where we can fit a submatrix of height:heights[i][j]
The tricky part is in the inner loop. I use something similar to the max subwindow algorithm to ensure it is
O(1)
on average for each cell.I will try to formulate a proof but in the meantime here is the code.
这是一个顺序行*列的解决方案,
它的工作原理是从
这是一个有效的 python 实现。抱歉,因为我不确定如何使语法突出显示工作
This is an order Rows*Columns Solution
It works by
Here is a working python implementation. Apologies since I'm not sure how to get the syntax highlighting working