Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 查找边界上包含相似单元格的最大子矩阵_Algorithm_Matrix - Fatal编程技术网

Algorithm 查找边界上包含相似单元格的最大子矩阵

Algorithm 查找边界上包含相似单元格的最大子矩阵,algorithm,matrix,Algorithm,Matrix,问题是,给定一个所有单元格都是黑色或白色的矩阵,找到所有边界单元格都是黑色(内部单元格不必是黑色)的最大大小的子矩阵 目前我最多只能想到一个O(N^4)解决方案。为此,我创建了两个辅助表,一个表在每行的右侧为每个单元格的连续黑色单元格计数,另一个表在该列中为每个单元格的连续黑色单元格计数。然后,我按如下方式做: for each row (i): for each cell (i,j): for each window (1..n-j): if auxrow[i,j

问题是,给定一个所有单元格都是黑色或白色的矩阵,找到所有边界单元格都是黑色(内部单元格不必是黑色)的最大大小的子矩阵

目前我最多只能想到一个
O(N^4)
解决方案。为此,我创建了两个辅助表,一个表在每行的右侧为每个单元格的连续黑色单元格计数,另一个表在该列中为每个单元格的连续黑色单元格计数。然后,我按如下方式做:

for each row (i):
   for each cell (i,j):
     for each window (1..n-j):
       if auxrow[i,j+window]-auxrow[i,j] == window:   #so, all cells in this window is black
         colsleft = auxcol[i,j]
         colsright = auxcol[i,j+window]
         botttom_row = min(colsleft,colsright)
         for bot in (row..row+mincol):
            if auxrow[bot][j+window]-auxrow[bot][j] == window:
              maxlen = ... #do whatever to save this sub-matrix as answer
如何改进此解决方案?我在上看到了一些有趣的讨论,特别是Rem的回答(
O(N^2*logn)
),以及Tomek建议的后续改进,但我无法理解这两种解决方案!有人能给出比我更好的解决方案,或者解释那些算法吗?

O(N^3)是可能的

对于每个单元格,计算顶部和右侧的连续黑色单元格(可以在O(N^2)时间内完成)

对于每一列(比如列i),您将得到一个由n个元素组成的数组,它维护正确的信息,比如R_i

现在给定数组R_i,我们计算n个其他数组(ω(n^3)空间),如下所示:

for each row (i):
   for each cell (i,j):
     for each window (1..n-j):
       if auxrow[i,j+window]-auxrow[i,j] == window:   #so, all cells in this window is black
         colsleft = auxcol[i,j]
         colsright = auxcol[i,j+window]
         botttom_row = min(colsleft,colsright)
         for bot in (row..row+mincol):
            if auxrow[bot][j+window]-auxrow[bot][j] == window:
              maxlen = ... #do whatever to save this sub-matrix as answer

对于每一个d,例如1,我认为它是不完全相同的。在这里,子矩阵中的所有单元都必须为零,这里只有边界元素应该为…这是因为它们解决了一个不同的问题,一个是平方矩阵。然后我想对这两种情况都有一个解决方案。我的算法是矩形的,但它也可以调整为正方形。为什么这个问题被标记为关闭?这里有没有什么怪人,他们的任务就是解决所有的问题?注:矩形的最大尺寸是不明确的,但上面的方法适用于面积或周长。我真的不明白你的算法。你能举个例子说明一下吗?@Cupidvogel:你不明白什么部分?这个解决方案适用于方形子矩阵还是矩形子矩阵?@Cupidvogel:矩形。我从来没提过正方形!我现在想知道,你读过完整的答案吗?不过我不怪你。不是一个典型的答案,但我相信它是有效的。。。