我有一个稀疏矩阵数组,我需要找到一个元素周围最高的空区域。区域应为矩形或方形。在该地区,不应出现任何其他因素。算法足以开发代码。有没有可用于实现此目的的算法?
答案 0 :(得分:1)
由于您没有提到解决方案效率的要求,因此这是一种蛮力方法。
Let M denote the matrix
Let n be the number of rows
Let m be the number of columns
Let maxRowSize be 0, initially
Let maxColSize be 0, initially
Let maxRowStart be 0, initially
Let maxColStart be 0, initially
for top from 0 to n:
for left from 0 to m:
numNonEmptyElements = 0
if M[top][left] is non-empty:
numNonEmptyElements = 1
for bottom from i to n:
if M[bottom][left] is non-empty AND numNonEmptyElements == 1:
break
for right from 0 to m:
if M[bottom][right] is non-empty:
numNonEmptyElements += 1
if numNonEmptyElements > 1:
break
if (right - left + 1) * (bottom - top + 1) > maxRowSize * maxColSize:
maxRowSize = bottom - top + 1
maxColSize = right - left + 1
maxRowStart = top
maxColStart = left
return any of the maxRowSize, maxColSize, maxRowStart, maxColStart you need
从循环中可以看出,伪代码的时间复杂度为 O(N 2 M 2 ),N和M是矩阵的行和列大小,效率非常低。
答案 1 :(得分:1)
这是一个解决这个问题的算法。首先你必须计算所有四个方向上可能的最大矩形的大小:左上角,右上角,左下角,右下角。参见图中的所有矩形用不同的颜色表示。
例如,我们要计算索引(3,4)
,即下面矩阵中的5
。然后计算所有矩形的尺寸(左上角,右上角,左下角,右下方。我已经在图中显示了这些矩形,颜色不同(红色,绿色,黄色和蓝色)。
在找到所有矩形的尺寸后,我们可以通过以下方式找到最高空白区域(图中的阴影区域)的尺寸:
<强>长度:强>
敏((顶部 - Left_Length +顶right_Length),(底Left_Length +底right_Length));
<强>宽度:强>
敏((顶部 - Left_Breadth +顶right_Breadth),(底Left_Breadth +底right_Breadth));
答案 2 :(得分:1)
对于修改后的flood-fill算法来说,这看起来非常好。
考虑NxM矩阵和元素的位置(i,j); 0℃; = I
getLargestArea(i,j)
a0 = floodFill_markArea(i+1,j)
a1 = floodFill_markArea(i-1,j)
a2 = floodFill_markArea(i,j+1)
a3 = floodFill_markArea(i,j-1)
return max(a0,a1,a2,a3)
对于floodFill_markArea
,它从一个角落开始并填充一个表面区域的矩形区域keping轨道;如果应该很容易为经典的泛洪填充算法添加一些约束来实现这一点。