我有大约70,000个节点和250,000条边,而且图不一定是连通的。显然使用高效的算法至关重要。你有什么建议?
另外,我希望知道如何在几台机器之间分配任务——这种问题是否可能?
谢谢。
我有大约70,000个节点和250,000条边,而且图不一定是连通的。显然使用高效的算法至关重要。你有什么建议?
另外,我希望知道如何在几台机器之间分配任务——这种问题是否可能?
谢谢。
MapReduce是一种非常适合分布式算法的技术,但可能有些过于强大。如果您对此感兴趣,请参考这个讲座或者这篇博客文章以获取灵感。实际上,当我学习MapReduce时,这是其中的一个最早的例子之一。
对于250k个边和70k个节点来说,似乎这个图相对稀疏,Dijkstra算法每个节点的运行时间为O( E + V log V )
,所有源的全运行时间为O( VE + V^2 log V )
。这应该已经足够快了,但是对于Dijkstra算法也存在通常的注意事项(负边缘)。
如果您的问题涉及负权重但不涉及负循环,则还可以查看Johnson算法。具体来说,它也可以进行分布式处理,因为它对重新加权的图进行处理,然后从每个节点运行Dijkstra算法。
O(n^3)
。可能不是非常高效。 - dirkgently有两种并行化这个问题的天真方法:
1)识别子组件并将其分布在不同的计算机上。两个不同组件之间的路径长度是未定义的。
2)在不同的计算机上加载图形,并为每个计算机提供要计算所有最短路径的节点列表。一个节点的结果不依赖于另一个节点的结果,因此可以并行化此问题。
优点:实现起来不太困难,但如果您只想解决一次此问题,则应仅以此方式执行。如果这是一个经常出现的问题,那么您可能需要查看分布式算法。
使用igraph,它是用C编写的,非常快速,您可以使用Python作为包装语言。