我正在寻找找到矩阵中连接(相邻)元素数量的方法。 我给出了一个2D对象数组,其中每个对象都可以设置一个标志。如果设置了标志,我需要计算设置了标志的邻居的数量。对于每个邻居,重复该过程。
查看图片以查看问题:
我想这是一个相当普遍的问题。这是什么名字,所以我可以做自己的研究?
答案 0 :(得分:6)
可以使用 flood fill 来完成,这是DFS的变体。这假设您的矩阵实际上是一个图形,其中每个单元格是一个节点,并且在两个相邻单元格之间存在边缘。
可能的伪代码可能是:
DFS(v,visited):
if v is not set:
return []
else:
nodes = [v]
for each neighbor u of v:
if u is not in visited:
visited.add(u)
nodes.addAll(DFS(u,visited))
return nodes
如果从某个点v
开始,它将返回包含与v
(包括v
本身)相关的所有节点的列表,您可以轻松地将其“值”设置为size(nodes)
。
以下伪代码将标记所有节点的大小为“cluster”:
markAll(V): //V is the set of all cells in the matrix
visited = [] //a hash set is probably best here
while (V is not empty):
choose random v from V
visited.add(v)
nodes = DFS(v,visited)
for each u in nodes:
value(u) = size(nodes)
V = V \ nodes //set substraction
这种方法的复杂性将是O(|V|) = O(n*m)
- 矩阵的大小是线性的(n * m)
答案 1 :(得分:5)
如何使用Disjoint set or union-find数据结构?
基本上:
每当添加一个标志,或者你注意到一个元素有一个标志时,扫描该元素的邻居。只要在其中找到带有标志的元素,就可以将元素指向同一个父元素,从而将元素聚集在一起。直接或递归。
记住每个群集的元素数。