我使用优先级队列找到了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 }
答案 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 }
这段代码的问题是在线性时间内从优先级队列中删除任意(非根)节点v
。 Java Docs:
实施说明:此实现提供O(log(n))时间 enqueing和dequeing方法(offer,poll,remove()和add); remove(Object)和contains(Object)方法的线性时间;和检索方法的持续时间(窥视,元素和大小)。
然而,在fibonacci堆中,您可以更有效地更改节点的优先级。