【问题标题】:Will multiple solutions for speeding up Dijkstra lower performance?多种加速 Dijkstra 的解决方案会降低性能吗?
【发布时间】:2015-06-20 11:09:42
【问题描述】:

我已经实现了一个通用的 Dijkstra 搜索:

public void search(Vertex source) {
    source.minDistance = 0;

    PriorityQueue<Vertex> vertexQueue = new PriorityQueue<Vertex>();
    vertexQueue.add(source);

    while (!vertexQueue.isEmpty()) {
        Vertex u = vertexQueue.poll();

        for (Edge e : u.edges) {
            Vertex v = e.target;

            int weight = e.weight;
            int distance = u.minDistance + weight;

            if (distance < v.minDistance) {
                vertexQueue.remove(v);

                v.minDistance = distance ;
                v.previous = u;

                vertexQueue.add(v);
            }
        }
     }
}

提速方式包括:

  • 斐波那契堆
  • 双向搜索

此搜索将用作使用 Yen 算法实现 k 最短路径的基础。

在算法上同时应用这两种加速会改善搜索时间还是会因为两者都被使用而导致一些性能损失?

另外,是否可以实现进一步的加速?

【问题讨论】:

  • 斐波那契堆的问题是它们的常量很差。在使用朴素优先级队列(O(n) 任意删除)和斐波那契堆(使用不良常量)之间存在一些中间点。
  • @amit 视情况而定。如果距离差别很大,那就更好了

标签: java algorithm graph-algorithm path-finding


【解决方案1】:

java.util.PriorityQueue.remove 是一个 O(n) 操作。如果要使用这个PriorityQueue,最好允许PriorityQueue中有重复的顶点,但只在第一次轮询时处理一个Vertex:

class Vertex {
    // existing members

    boolean visited;
}

        Vertex u = vertexQueue.poll();
        if (u.visited) continue;
        u.visited = true;

虽然这会将优先级队列的大小最多增加 d 倍(最大节点度),因此将运行时间更改为 O(dn log(nd)),即 O(dn (log n + log d)),如果 d 很小,这可能是可以接受的。特别是,如果 d 是常数(在许多现实世界的寻路问题中都是如此),那么这个算法是 O(n log n)。

使用基于指针的堆实现(例如斐波那契堆)可以通过提供降低成本的操作来有效地防止堆中的重复,但是基于指针的数据结构的常数因子比支持数组的优先级队列差。此外,斐波那契堆的陡峭系数为常数,需要在每个操作中触及更多节点。因此,我怀疑它实际上会比具有重复项的二进制堆慢(假设节点相当小)。

对于双向搜索,我假设您的意思是从两端“平行”运行 Dijkstra,直到两者相遇?这种优化将独立于队列表示的改进,并且可以很好地结合起来。

另一个可能的改进是通过利用 Yen 算法的后续 Dijkstra 调用的相似性,减少调用 Dijkstra 的频率。是否值得修改 Dijkstra 以便我们可以倒带,而不是从头开始重新开始?唉,我不太了解日元算法,所以我无法评估这是否有帮助。

【讨论】:

    【解决方案2】:

    我确实认为使用斐波那契堆会更快,尽管您可能只有在多次调用此函数时才会注意到。使用回溯也可能会有所帮助。

    但是,我建议不要使用 Yen 算法,而是使用 K* 算法,它基本上允许您使用 A* 来解决 k 最短路径问题! K* 还有其他一些好处,特别是对于非常大的图的内存使用。

    您可以在此处找到该论文的免费副本:(我认为该论文还有更新的更长版本)K∗: A Directed On-The-Fly Algorithm for Finding the k Shortest Paths

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-28
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-26
      • 2018-03-28
      相关资源
      最近更新 更多