假设我有一个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的队列/堆栈。现在我想知道是否有算法可以解决这个问题并且需要更少的内存。
答案 0 :(得分:1)
如果内存如此重要,那么您可以使用以下方法:
另外,只保留一个矩阵长度为一行的数组,然后从上到下扫描矩阵行,每次处理当前行时,其中都有连续1的间隔,可以合并上面的不同部分他们,例如
1110001110011
1111001110011
0011111000011
如果仅考虑前两行,则有三个不同的部分,但第三行合并前两个。因此,您可以使用附加数组来保留不同的部分,直到最后一行,即最初它将填充0,当您刚开始扫描第3行矩阵时,该数组应该看起来像1111002220033,即每个数字显示细胞属于哪个部分。处理完第3行后,它们将合并,其他数组将变为0011111000033.因此,在扫描每一行后,某些部分会合并,并且某些部分会消失。每当零件消失时,您可以递增计数器以最终得到答案。
然而,这比BFS / DFS更棘手,更复杂,我认为在实践中你不需要使用它。