Is there a standard Java implementation of a Fibonacci heap?

25,998

Solution 1

No, the standard Java collections API does not contain an implementation of a Fibonacci heap. I'm not sure why this is, but I believe it is because while Fibonacci heaps are asymptotically great in an amortized sense, they have huge constant factors in practice. The collections framework also doesn't have a binomial heap, which would be another good heap to include.

As a totally shameless self-plug, I have an implementation of a Fibonacci heap in Java on my personal website. I'm not sure how useful it will be, but if you're curious to see how it works I think it might be a good starting point.

Hope this helps!

Solution 2

But why they did not use a Fibonacci heap?

Probably because those heaps have a lot more overhead per entry than binary keys.

Also, is there an implementation of Fibonacci heap in Java.util?

No, but

  1. There is graphmaker from Nathan Fiedler - GPL and with good test coverage, but have a look into this nice blog post about it and about problems a fibonacci impl can have. In this post a lot of other Java implementions are referenced.
  2. There is some code with unit tests here
  3. The JGraphT project (also Nathan Fiedler) and also with (some minor) tests but LGPL.
  4. Last but not least there is Neo4j - GPL - no tests.

Solution 3

But why they did not use a Fibonacci heap?

I think the main reason is because the Fibonacci heap can only help in the case when you have lot more decreaseKey operation connected to one extractMin operation. For example, when you are using it with the Dijkstra's algorithm.

Also, is there an implementation of Fibonacci heap in Java.util?

There is no implementation in Java.util, but I did some experiment on this topic using existing open-source versions of the Fibonacci heap. You can find it on my blog or on the project's GitHub repository.

Share:
25,998
Phil
Author by

Phil

Updated on February 08, 2020

Comments

  • Phil
    Phil over 4 years

    I was looking at the different kind of heap data structures.

    The Fibonacci heap seems to have the better worst case complexity for (1) insertion, (2) deletion and (2) finding the minimum element.

    I have found that in Java there is a class PriorityQueue that is a balanced binary heap. But why they did not use a Fibonacci heap?

    Also, is there an implementation of a Fibonacci heap in java.util?

    Thanks!

  • Phil
    Phil about 13 years
    Thanks a lot. Your implementation looks well-done and well documented with many explanations. I will have a look at this.
  • Andy
    Andy over 10 years
    Wow, I was going to write my own for fun but yours is so nice!
  • arunmoezhi
    arunmoezhi over 9 years
    Can you please elaborate on your answer for the first question
  • gabormakrai
    gabormakrai over 9 years
    Of course I can. Fibonacci Heap has superiority over Binary Heap on executing decreaseKey and insert operations, also it has the same time complexity for extractMin, but this operation takes much more time for FH than BH, because it is consolidating the inner tree forest. So if you have a very few decreaseKey then it is slower than the normal Binary Heap. For some special graphs, that's the case for the Dijkstra's algorithm.
  • Has QUIT--Anony-Mousse
    Has QUIT--Anony-Mousse over 8 years
    How does it perform in reality? The Fibonacci heap seems to have quite a lot of memory overhead.
  • templatetypedef
    templatetypedef over 8 years
    @Anony-Mousse Fibonacci heaps are notoriously slow in practice for precisely the reason you've mentioned.