我有一些图形数据,其中,节点之间的边缘是此形式:节点的有效分组,可以达到彼此
var edges = [
["A","B"], ["B","C"], ["B","D"], ["E","F"], ["E","G"]
];
什么是最有效的(运行时间)的方式来组的节点那可以达到对方?在我的情况:
[["A","B","C","D"],["E","F","G"]]
我要寻找一个在纯JavaScript的解决方案,或者可能使用d3.js,underscore.js或jQuery的。伪代码也蛮好:)
UPDATE:因为有人提出这是this question重复,我将解释什么,我用这个了。
我有一些二维点(可能少于500),我想分组彼此接近的点。首先我做delaunay triangulation我得到一个平面图,我加上euclidean distance作为权重的边缘和使用Kruskal's algorithm作出minimum spanning tree(MST)。我从MST中删除要长的所有边。现在我最终得到了一些我想要处理和查找集群的边(如上所述)。当我拥有这些簇时,我会使它们的凸包可视化。
所以它是一个无向图。边缘告诉我的唯一事情是,它连接的两个顶点将位于同一个群集中。
即使点数可能很低,运行时间也很重要,因为这将在每个鼠标移动时计算。
SOLUTION:感谢您的建议。为了完整起见,这里是我想出了解决方案:
// Make a cluster for each vertex
var clusters = _.map(vertices, function(node) { return [node]; });
while(edges.length > 0) {
var edge = edges.pop();
var vertexA = edge[0],
vertexB = edge[1];
var cA = _.filter(clusters, function(cluster) {
return _.contains(cluster, vertexA);
});
var cB = _.filter(clusters, function(cluster) {
return _.contains(cluster, vertexB);
});
if(_.union(_.difference(cA,cB) , _.difference(cB,cA)).length > 0) {
clusters = _.without(clusters, cA[0], cB[0]);
clusters.push(_.union(cA[0], cB[0]));
}
}
return clusters;
它不是重复的。我想查找所有可以互相访问的节点“群集”。 – swenedo 2013-03-15 08:35:55
看看http://en.wikipedia.org/wiki/Disjoint-set_data_structure – MBo 2013-03-15 10:24:05