我有一个1024x1024阵列,二进制值0或1,由噪声算法生成1s总是成组聚集。 可视化它,就像一个0s的平面,岛屿为1s。
我想将1个岛中的任何一个岛提取到一个新的列表中(我碰巧使用的是C#,但任何容器都可以)。如果一个岛屿的3x3邻居没有与另一个岛屿重叠,则该岛屿被认为是独立的。
听起来这可能是一个常见问题,但我不知道要搜索的任何候选算法的名称。
我现在通过检查触摸的每个点及其邻居来做暴力。
有更快的方法吗?
由于
答案 0 :(得分:1)
Flood-Fill每个“1”获得它所属的“岛屿”。重复所有1。复杂性与矩阵的大小呈线性关系。
高效的伪代码可以是:
1. set <- new Set
2. for each cell (i,j) in matrix, if matrix[i][j] == 1:
2.1. set.add(i,j)
3. while set is not empty:
3.1. island <- floodFill(i,j) // start flood fill from i,j
3.2. set.removeAll(island) //remove already found 1's
3.3. yield island