我有一个包含顶点和它们连接到的其他顶点的数据集。该数据集表示无向图。我想要确定的是数据集中存在的谨慎断开连接图的数量。
例如,下面的数据(顶点,连接顶点数组)将代表两个谨慎的断开连接图:
123,[567,345]
345,[123,567,789]
567,[123,345]
789,[345]
321,[987]
987,[321]
在如此小的数据集上,我很容易想到让我得到答案的方法,但是当我将其扩展到具有数亿个顶点的数据集时,我不确定我有什么这非常有效。我倾向于做一些可以在Hadoop上运行的东西,但直接编写MapReduce工作的天气或使用像Giraph或Faunus这样的东西我很乐意得到一些建议。
感谢。
答案 0 :(得分:1)
正如巴赫在评论中所说,这个问题,识别连通组件,通常是通过普通的广度优先搜索来解决的。 Skiena给出了如下基本算法:
connected_components( graph *g ){
int c, i; /* component number and counter */
initialize_search( g );
c = 0;
for( i = 1; i <= g->num_vertices; i++ ){
if( discovered[i] == FALSE ){
c += 1;
printf( "component %d: ", c );
bfs( g, i ); // breadth first search
printf( "\n" );
}
}
}