如果我有一个类似网格的图形和一组节点,如[A,B,J,K]。
Grid Graph:
A B C D
E F G H
I J K L
Note: diagonals not considered neighbours
检查这些节点是否都相邻且形成群集的最佳方法是什么?
在上面的示例中,[A,B]是相邻的,[J,K]是相邻的,但作为一个整体,该集合不形成集群。如果'F'被添加到集合中以形成[A,B,F,J,K],那么我会认为它是一个集群。
更新:我已经有一个函数检查两个节点是否相邻boolean isAdjacent(节点a,节点b)。只需要对其进行扩展即可检查群集。
答案 0 :(得分:2)
让原始图表为G = (V,E)
和SET
所需的节点集(SET <= V
)
创建图G' = (V',E')
,其中V' = SET
和E' = { (u,v) | (u,v) is in E and u,v is in SET }
如果图表G'
已连接,则您拥有所有元素的集群。
最大聚类是G'
中的最大连通分量。
找到最大连通分量可以用flood fill。
之类的东西来完成(注意,首先使用带有限制的洪水填充,可以调整G'
的图形创建,而无需实际构建它。)
伪代码,使用BFS查找群集:
int maximalCluster(E,SET): //SET is the set of desired nodes, E is the edges in G.
roots <- new map<node,interger>
for each node n in SET:
//run a BFS for each root,
//and count the total number of elements reachable from it
queue <- { n }
roots.put(n,1)
while (queue is not empty):
curr <- queue.takeFirst()
for each edge (curr,u) in E:
if (u is in SET):
SET.delete(u)
queue.add(u)
roots.put(roots.get(n) + 1)
return max { roots.get(v) | for each v in roots.keys }
虽然上面的伪代码不生成G'
,但它只通过检查其节点在SET中的边来模拟它。