我有大约70k个节点和250k边缘,并且图形不一定是连接的。显然,使用有效的算法至关重要。你推荐什么?
作为旁注,我很欣赏有关如何在多台机器之间划分任务的建议 - 这种问题是否可能实现?
由于
答案 0 :(得分:4)
MapReduce是一个很好的分布式算法,虽然可能有点过于强大。如果您对此感兴趣,请查看this lecture或此blog post获取灵感。 (事实上,当我学习MapReduce时,这是第一个例子。)
对于250k边缘和70k,似乎图形相对稀疏,Dijkstra's algorithm在O( E + V log V )
中为每个节点运行,O( VE + V^2 log V )
的完整运行时间(所有源)。这应该足够快,但通常的警告适用于Dijkstra's。 (负边缘。)
如果问题涉及负权重,您也可以查看Johnson's algorithm,但不能查看负数周期。具体来说,它也可以分布,因为它需要重新加权的图形并从每个节点运行Dijkstra的算法。
答案 1 :(得分:4)
您可以使用Floyd-Warshall algorithm。它解决了这个问题。
复杂度为O(V ^ 3)。
还有Johnson's algorithm的复杂度为O(V ^ 2 * log V + VE)。后者也很容易分发,因为它运行Dijkstra的算法V次,可以并行完成。
答案 2 :(得分:1)
有两种天真的方法来并行化这个问题:
1)识别子组件并在不同的计算机上分发这些子组件。来自两个不同组件的两个节点之间的路径长度未定义。
2)将图形加载到不同的计算机中,并为每台计算机提供一个节点列表,以计算所有最短路径。一个节点的结果不依赖于另一个节点的结果,因此您可以并行化此问题。
上行:不太难实现,但如果你必须解决这个问题,我只会这样做。如果这是一个反复出现的问题,那么您可能需要查看分布式算法。
使用igraph,它用C编写,速度非常快,你可以使用Python作为包装语言。
答案 3 :(得分:0)
查看具有以下关键字的论文/出版物:分布式图搜索算法。 Here可能会有所帮助。
此ACM帐户也只有纸张:Distributed computation on graphs: shortest path algorithms