新来的,但都被作为潜伏很长一段时间的客人:)
好了,所以我一直在试图做用斐波那契堆(在Java中)Dijkstra的最短路径算法。 某些搜索后,我设法跨越代表斐波那契堆两家预拌制造实现绊倒。 第一个实现是相当精美做得很好,可以发现在这里 。 第二种方案,看似那么优雅,是这里 。
现在,这一切都看起来不错,很好。 不过,我想用这些实现了我的版本Dijkstra算法中的一个,但我还没有与任何运气。 Dijkstra的使用实施情况如下:
public void dijkstra(Vertex source) {
{
source.minDistance = 0.;
PriorityQueue<Vertex> vertexQueue = new PriorityQueue<>();
vertexQueue.add(source);
while (!vertexQueue.isEmpty()) {
Vertex u = vertexQueue.poll();
// Visit each edge exiting u
for (Edge e : u.adjacencies) {
Vertex v = e.target;
double weight = e.weight;
double distanceThroughU = u.minDistance + weight;
if (distanceThroughU < v.minDistance) {
vertexQueue.remove(v);
v.minDistance = distanceThroughU;
v.previous = u;
vertexQueue.add(v);
}
}
}
}
}
由于是明确的,这实现使用基于Java的PriorityQueue类(我相信是基于二进制堆本身)。 我希望如此,它使用任一种前述斐波那契堆实现的,而不是Java的的PriorityQueue的修改上面的代码。
我已经尝试了很多,但我只是无法弄清楚如何做到这一点,但我敢肯定,这是作为替代的几行代码一样简单。
我希望我是不够清楚。 这是从字面上我对这些板的第一篇文章。
任何帮助将不胜感激。
编辑:在回答您的意见,我想我会扩大我的职务与我的企图方案之一。
以下是上述的Dijkstra方法使用前面链接的第二斐波那契堆实现的修改版本:
public static void computePathsFibonacciHeap(Node source) {
{
source.minDistance = 0.;
FibonacciHeap myHeap = new FibonacciHeap();
myHeap.insert(source, source.minDistance);
while (!myHeap.isEmpty()) {
Node u = myHeap.min();
// Visit each edge exiting u
for (Edge e : u.adjacencies) {
Node v = e.target;
double weight = e.weight;
double distanceThroughU = u.minDistance + weight;
if (distanceThroughU < v.minDistance) {
v.minDistance = distanceThroughU;
myHeap.decreaseKey(v, v.minDistance);
v.previous = u;
}
}
}
}
}
这是非常直接从伪转换(因而是完全有可能的,我只是没有合适的翻译吧)。 我得到的错误说“decreaseKey()得到了一个更大的价值。” 如果我尝试取消最低,我得到一个NullPointerException。
我敢肯定,我做错了什么,我很想知道它是什么。 再次,这是使用第二FHeap实现。 我宁愿使用第一次执行这样做(它只是看起来很多更彻底/专业),但我很遗憾无法弄清楚如何。