找到稀疏矩阵中元素周围的最大区域

时间:2016-03-24 11:53:32

标签: c algorithm matrix sparse-matrix

我有一个稀疏矩阵数组,我需要找到一个元素周围最高的空区域。区域应为矩形或方形。在该地区,不应出现任何其他因素。算法足以开发代码。有没有可用于实现此目的的算法?

3 个答案:

答案 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。然后计算所有矩形的尺寸(左上角,右上角,左下角,右下方。我已经在图中显示了这些矩形,颜色不同(红色,绿色,黄色和蓝色)。

Sparse Matrix

在找到所有矩形的尺寸后,我们可以通过以下方式找到最高空白区域(图中的阴影区域)的尺寸:

<强>长度:

敏((顶部 - 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轨道;如果应该很容易为经典的泛洪填充算法添加一些约束来实现这一点。