【问题标题】:Optimizing Dijkstra for dense graph?为密集图优化 Dijkstra?
【发布时间】:2009-09-12 00:31:53
【问题描述】:

除了 Dijkstra 之外,还有其他方法可以计算接近完整图的最短路径吗?我有大约 8,000 个节点和大约 1800 万条边。我浏览了"a to b on map" 的线程并决定使用 Dijkstra。我使用 Boost::Graph 库在 Perl 中编写了我的脚本。但结果不是我所期望的。使用调用 $graph->dijkstra_shortest_path($start_node,$end_node); 计算一条最短路径大约需要 10 多分钟;

我知道有很多优势,这可能是运行时间缓慢的原因。我死在水里了吗?有没有其他方法可以加快速度?

【问题讨论】:

    标签: path graph dijkstra shortest


    【解决方案1】:

    简短回答:如果您只需要几条最短路径,Dijkstra 是您的最佳选择,如果您想找到每对节点之间的最短路径,则 Floyd-Warshall 算法更好。

    • Dijkstra 算法为加权图找到从一个源到图中所有其他节点的最短路径。它在 O(V^2) 时间内对密集图进行操作。

    • Floyd-Warshall 找到所有节点对之间的最短路径。它需要密集的表示并在 O(V^3) 时间内运行。它对加权或未加权的图进行操作。

    即使您的图很密集(根据您的问题的标题),如果您只想找到一些最短路径,将其转换为稀疏图并使用 Dijkstra 的稀疏实现可能会有一些好处。稀疏 Dijkstra 的运行时间为 O(E log V)。

    请注意,这是假设您所有的边权重都是非负的;如果是,那么您不能使用其中任何一个。您将不得不使用更慢的算法,例如 Bellman-Ford。

    【讨论】:

    • 1.密集的邻接矩阵。确切地说,它们是成对的,但并不完全形成完整的图表。 2. 是的,它们具有正权重。 3. 理想情况下全部。但在这一点上,我很乐意随机抽样或尽可能多地抽样。在您提到的 3 个中,Dijkstra 最适合我的问题。但性能并不能支持声称的运行时间。我仍然对可能成为瓶颈的东西感到迷茫。
    • 如果您的权重可以用整数表示压缩到 8 位或 16 位,也许您可​​以节省一些空间和时间?
    • 另外,如果图形是无向的,那么您应该能够通过仅使用矩阵的上三角形将内存减少一半。我在这里关注内存,因为您可能会遇到数据吞吐量问题。
    • 我刚刚在一个随机创建的基于矩阵的图上实现了 Dijkstra,其密度与您的图相同。我创建了图表,并在 40 秒内从不同的源节点运行了 Dijkstra 的算法 100 次。所以每次调用 Dijkstra 不到 0.5 秒。这是 C++/Linux/3.0GHz xeon/8GB 内存。
    • 格雷格,感谢您试用。您可能对数据吞吐量是正确的。我的进程在 2.6GHz Xeon 和 16GB 上显示了大约 2.4GB 的虚拟内存。与您的规格相差不远。我也开始怀疑 Perl 没有我想象的那么高效。我选择它主要是因为它易于处理原始数据。
    【解决方案2】:

    你也可以试试A* algorithm。

    如果您能够获得良好的启发式方法,这种方法特别有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-12
      • 2011-06-29
      • 1970-01-01
      • 2011-09-29
      • 2021-04-18
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      相关资源
      最近更新 更多