【问题标题】:Fibonacci Heap for Dijkstra via Java通过 Java 实现 Dijkstra 的斐波那契堆
【发布时间】:2017-01-10 17:13:10
【问题描述】:

我想在 Dijkstra 算法上实现斐波那契堆。我将此代码用于斐波那契堆。 http://keithschwarz.com/interesting/code/?dir=fibonacci-heap 问题是如何调用方法:reduceKey?它总是给我提示(条目,双重)。但是如何写一个条目?下面是一个简单的例子,问号怎么填?

FibonacciHeap<Integer> aa = new FibonacciHeap<>();
aa.enqueue(10, 1.01);
aa.enqueue(10, .2);
aa.enqueue(12, 3.2);
aa.enqueue(13, 3.4);
aa.decreaseKey(??????, newPriority);

【问题讨论】:

    标签: java dijkstra


    【解决方案1】:

    decreaseKey() 期望第一个参数是FibonacciHeap.Entry 类型。类中的3个方法返回堆的Entrys:

    • public Entry&lt;T&gt; enqueue(T value, double priority);
    • public Entry&lt;T&gt; min();
    • public Entry&lt;T&gt; dequeueMin();

    这 3 个方法中的每一个都返回一个不同的元素,并以自己的方式修改堆。根据您的用例,您可以将这些Entrys 存储在一个变量中并将其传递给decreaseKey()

    一种这样的情况是在排队时存储Entry。每当您将enqueue() 某些东西放入堆时,它就会返回其对应的Entry。从其文档中:

    /**
     * Inserts the specified element into the Fibonacci heap with the specified
     * priority.  
     * ...
     * @return An Entry representing that element in the tree.
     */
    public Entry<T> enqueue(T value, double priority);
    

    您可以存储它,并将其传递给decreaseKey()

    FibonacciHeap<Integer> aa = new FibonacciHeap<>();
    FibonacciHeap.Entry entry = aa.enqueue(10, 1.01);
    // ...
    aa.decreaseKey(entry, newPriority);
    

    【讨论】:

    • 非常感谢!效果很好,但只需要添加 FibonacciHeap.Entry.
    猜你喜欢
    • 2013-03-01
    • 2012-12-29
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 2016-06-13
    • 2012-12-16
    • 2010-11-24
    • 2013-04-15
    相关资源
    最近更新 更多