使用Fibonacci堆改进Dijkstra?

时间:2015-06-16 09:50:53

标签: java algorithm path-finding

我使用优先级队列找到了Dijkstra的this implementation(相关部分)。是否有可能通过实施斐波那契堆甚至转向迭代深化A *来进一步加速?

 47     public static void computePaths(Vertex source)
 48     {
 49         source.minDistance = 0.;
 50         PriorityQueue<Vertex> vertexQueue = new PriorityQueue<Vertex>();
 51     vertexQueue.add(source);
 52 
 53     while (!vertexQueue.isEmpty()) {
 54         Vertex u = vertexQueue.poll();
 55 
 56             // Visit each edge exiting u
 57             for (Edge e : u.adjacencies)
 58             {
 59                 Vertex v = e.target;
 60                 double weight = e.weight;
 61                 double distanceThroughU = u.minDistance + weight;
 62         if (distanceThroughU < v.minDistance) {
 63             vertexQueue.remove(v);
 64 
 65             v.minDistance = distanceThroughU ;
 66             v.previous = u;
 67             vertexQueue.add(v);
 68         }
 69             }
 70         }
 71     }

1 个答案:

答案 0 :(得分:1)

是的,你可以。

建议的实施有一个主要的性能缺陷:

 62         if (distanceThroughU < v.minDistance) {
 63             vertexQueue.remove(v);
 64 
 65             v.minDistance = distanceThroughU ;
 66             v.previous = u;
 67             vertexQueue.add(v);
 68         }

这段代码的问题是在线性时间内从优先级队列中删除任意(非根)节点vJava Docs

  

实施说明:此实现提供O(log(n))时间   enqueing和dequeing方法(offer,poll,remove()和add);    remove(Object)和contains(Object)方法的线性时间;和检索方法的持续时间(窥视,元素和大小)。

然而,在fibonacci堆中,您可以更有效地更改节点的优先级。