pig中的图连通分量算法

knpiaxh1  于 2021-06-24  发布在  Pig
关注(0)|答案(2)|浏览(531)

我们四处寻找一个简单的算法,在一个直径有时很大(最大的组件有时可以达到1米)的图中找到连接的组件。
我们发现了很多非常复杂的mr算法:
http://codingwiththomas.blogspot.de/2011/04/graph-exploration-with-hadoop-mapreduce.html
http://blog.piccolboni.info/2010/07/map-reduce-algorithm-for-connected.html
http://chasebradford.wordpress.com/2010/10/23/mapreduce-implementation-for-union-find/
一个非常简单的算法有什么问题:
对于每个组件,生成flatten(nodes\u bag)作为node,node\u以\u最小的\u id作为comp\u id;
按节点分组
筛选具有多个comp\u id的节点,并构建“update big comp\u id to small comp\u id”表
将所有具有大comp\u id的节点更新为相应的新的小comp\u id,并将它们标记为脏节点
然后用这些脏节点继续下一次迭代。。。我们错过了什么?

i86rm4rw

i86rm4rw1#

你提出的算法不是二次的吗?tarjan的连通分量算法是线性的。

6psbrbz9

6psbrbz92#

好 啊。我们不能使用这个非常简单的算法的原因是它有一个bug=build“update big comp\u id to small comp\u id”阶段可能是递归的。e、 g,当上一次迭代有3个组件时:

A->{1,2}
B->{2,3}
C->{3,4}

group by和filter将为我们构建以下转换表:

A->B
B->C

在某些情况下,这会导致迭代次数呈线性(最大直径)=像这个小例子中那样的长链需要很长时间才能收敛。

相关问题