除了Dijkstra之外,还有另一种计算近似完整图的最短路径的方法吗?我有大约8,000个节点和大约1800万个边缘。我已经完成了线程"a to b on map"并决定使用Dijkstra。我使用Boost :: Graph库在Perl中编写了我的脚本。但结果并不是我的预期。使用调用$ graph-> dijkstra_shortest_path($ start_node,$ end_node)计算一条最短路径需要大约10多分钟;
我知道有很多边缘,这可能是运行缓慢的原因。我死在水里了吗?还有其他方法可以加快速度吗?
答案 0 :(得分:4)
简短回答:如果您只想要几条最短路径,那么Dijkstra是您最好的选择,如果您想在每对节点之间找到最短路径,那么Floyd-Warshall算法会更好。
对于加权图,Dijkstra算法找到图中从一个源到所有其他节点的最短路径。它在O(V ^ 2)时间内在密集图上运行。
Floyd-Warshall找到所有节点对之间的最短路径。它需要密集表示并在O(V ^ 3)时间内运行。它在加权或未加权图表上运行。
即使您的图形密集(根据您的问题的标题),如果您只想找到一些最短路径,将它转换为稀疏图并使用Dijkstra的稀疏实现可能会有一些好处。稀疏Dijkstra在O(E log V)中运行。
请注意,这是假设您的所有边权重都是非负的;如果他们是,那么你不能使用任何这些。你必须使用更慢的算法,比如Bellman-Ford。
答案 1 :(得分:1)
你也可以试着给 A* algorithm 一个旋转。
如果您可以获得良好的启发式方法,这种方法尤其有用。