如何在内存较少的矩阵中找到连续区域?

时间:2013-03-21 15:33:32

标签: algorithm memory graph language-agnostic matrix

假设我有一个0和1的矩阵。现在我想计算矩阵中只包含1的所有连续区域。

allocate a new matrix "visited" to track visited elements
COUNT = 0
for each element E in the matrix
  if E == 1 and E is not visited
    COUNT = COUNT + 1
    run BFS/DFS to visit all not-visited matrix elements connected to E
return COUNT

如果矩阵是N×N,那么我们需要额外的N×N“访问”矩阵以及BFS / DFS的队列/堆栈。现在我想知道是否有算法可以解决这个问题并且需要更少的内存。

1 个答案:

答案 0 :(得分:1)

如果内存如此重要,那么您可以使用以下方法:

另外,只保留一个矩阵长度为一行的数组,然后从上到下扫描矩阵行,每次处理当前行时,其中都有连续1的间隔,可以合并上面的不同部分他们,例如

1110001110011
1111001110011
0011111000011

如果仅考虑前两行,则有三个不同的部分,但第三行合并前两个。因此,您可以使用附加数组来保留不同的部分,直到最后一行,即最初它将填充0,当您刚开始扫描第3行矩阵时,该数组应该看起来像1111002220033,即每个数字显示细胞属于哪个部分。处理完第3行后,它们将合并,其他数组将变为0011111000033.因此,在扫描每一行后,某些部分会合并,并且某些部分会消失。每当零件消失时,您可以递增计数器以最终得到答案。

然而,这比BFS / DFS更棘手,更复杂,我认为在实践中你不需要使用它。