在过去的几周里,我一直在玩Dijkstra算法的各种实现,作为个人项目的一部分(主要用于测试性能)。我最近遇到了this implementation算法,我已经测试了所有内容。但是,我正在尝试修改该实现,因此它需要一个额外的参数来表示目标节点,这意味着我希望算法只从指定的源运行一次到指定的目标而不是图中的所有其他节点
我尝试添加第三个targetNode
参数,但实现中找到的dest
变量的类型为Entry<T>
,我的参数类型为Node
(自定义类I)写道),所以我最终得到了一个不兼容的类型错误信息。
是否有可能以某种方式进行此修改?我通过另一个实现很容易做到,但我似乎无法弄清楚这一点主要是因为Node
和Entry<T>
的类型不同。这不是什么大不了的事,但我想这样做。
谢谢!
编辑:这就是我的所作所为:public static <Node> Map<Node, Double> dijkstraFibonacciHeap(DirectedGraph<Node> graph, Node source, Node target) {
FibonacciHeap<Node> priorityQueue = new FibonacciHeap<>();
Map<Node, FibonacciHeap.Entry<Node>> entries = new HashMap<>();
Map<Node, Double> result = new HashMap<>();
for (Node node : graph) {
entries.put(node, priorityQueue.enqueue(node, Double.POSITIVE_INFINITY));
}
priorityQueue.decreaseKey(entries.get(source), 0.0);
while (!priorityQueue.isEmpty()) {
FibonacciHeap.Entry<Node> curr = priorityQueue.dequeueMin();
result.put(curr.getValue(), curr.getPriority());
for (Map.Entry<Node, Double> arc : graph.edgesFrom(curr.getValue()).entrySet()) {
if (result.containsKey(arc.getKey())) {
continue;
}
double pathCost = curr.getPriority() + arc.getValue();
// Error occurrs here.
target = entries.get(arc.getKey());
if (pathCost < target.getPriority()) {
priorityQueue.decreaseKey(target, pathCost);
}
}
}
return result;
}
答案 0 :(得分:0)
Dijkstra的算法通过查找从源节点到图中每个其他节点的最短路径来工作。当然,一旦找到到目标节点的最短路径,就可以提前终止它,但这并不一定会带来很大的加速。
如果你真的想加快最短路径的发现,那么“中间相遇”技巧会很有用。您可以使用来自信宿的最短路径同时从信号源运行最短路径(将每个边缘视为其反向);一旦两个搜索都到达同一节点,您就可以重建最短的源到目标路径。
如果您对图表的外观有一个很好的猜测,那么A *是另一种方法。
我还应该指出,对此代码进行另一个非常非常简单的优化是停止将所有内容包装在对象中。无论是在空间上还是在速度上,你都需要花费很多钱来在double
课程中包装Double
,以及你的Node
在课堂上的任何内容。