查找图表上每对节点的所有最短路径

时间:2010-03-10 23:57:46

标签: algorithm graph graph-theory shortest-path

我有大约70k个节点和250k边缘,并且图形不一定是连接的。显然,使用有效的算法至关重要。你推荐什么?

作为旁注,我很欣赏有关如何在多台机器之间划分任务的建议 - 这种问题是否可能实现?

由于

4 个答案:

答案 0 :(得分:4)

MapReduce是一个很好的分布式算法,虽然可能有点过于强大。如果您对此感兴趣,请查看this lecture或此blog post获取灵感。 (事实上​​,当我学习MapReduce时,这是第一个例子。)

对于250k边缘和70k,似乎图形相对稀疏,Dijkstra's algorithmO( 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