用于计算矩阵中每个元素的连接元素数的算法

时间:2015-04-21 09:23:36

标签: algorithm matrix

我正在寻找找到矩阵中连接(相邻)元素数量的方法。 我给出了一个2D对象数组,其中每个对象都可以设置一个标志。如果设置了标志,我需要计算设置了标志的邻居的数量。对于每个邻居,重复该过程。

查看图片以查看问题: visualization

我想这是一个相当普遍的问题。这是什么名字,所以我可以做自己的研究?

2 个答案:

答案 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数据结构?

基本上:

每当添加一个标志,或者你注意到一个元素有一个标志时,扫描该元素的邻居。只要在其中找到带有标志的元素,就可以将元素指向同一个父元素,从而将元素聚集在一起。直接或递归。

记住每个群集的元素数。