问题描述
|
这个问题对于检测有向图中的循环有很好的答案。不幸的是,制作它的Map Reduce版本似乎并不容易。
具体来说,我对从有向图删除循环的Map Reduce算法感兴趣。
我已经使用广度优先搜索(BFS)算法进行了评估,但是我看到的一个问题是,可能同时删除两个不同的边以切断一个周期。这种情况的影响是太多的边缘可能被删除。重要的是要去除循环,同时最大程度地减少去除的边数。
具有可用证明的解决方案是首选!
谢谢。
解决方法
您需要一个迭代映射简化来实现此算法。请参阅http://www.iterativemapreduce.org/,以围绕迭代地图精简为中心的地图精简框架。或通过http://www.johnandcailin.com/blog/cailin/breadth-first-graph-search-using-iterative-map-reduce-algorithm获取有关如何使用Hadoop通过图进行广度优先搜索的有效示例使用迭代映射减少。
,好吧,如果您想删除所有循环,那么您将得到一棵树。因此,无论使用哪种算法,都将删除| E |。 -(n -1)个边缘。 (当然是正确的)
但是,问题是边缘的删除是否会导致图形断开。为此,您将需要对边缘进行排序(例如按字典顺序)。然后,您应始终删除循环中的最大边缘。 [我猜对正确性的证明是非常直接的:只需使用Kruskal算法并发现它们将是相同的! ]
任何生成树算法都可以为您解决问题。根据要优化的内容(时间或消息复杂度或任何其他性能指标),您会找到不同的算法。 BFS是最好的时间。对于c> 0,没有算法可以解决少于c(logn + m)条消息的问题。
我喜欢将DAG使用的一种算法称为YO-YO。该算法的描述可以在以下网站找到:http://www.site.uottawa.ca/~flocchin/CSI4509/8-yoyo11_fr.pdf