Есть ли стандартная Java-реализация кучи Фибоначчи?

Я смотрел на различные типы структур данных кучи.

Куча Фибоначчи, кажется, имеет лучшую сложность наихудшего случая для (1) вставки, (2) удаления и (2) поиска минимального элемента.

Я обнаружил, что в Java есть класс PriorityQueue, который представляет собой сбалансированную двоичную кучу. Но почему они не использовали кучу Фибоначчи?

Кроме того, есть ли реализация кучи Фибоначчи в java.util?

Спасибо!


person Phil    schedule 08.06.2011    source источник
comment
Коллекции java предоставляют только самые распространенные структуры данных. Я полагаю, что куча Фибоначчи более специализирована или, возможно, использует больше памяти.   -  person Denis Tulskiy    schedule 08.06.2011
comment
@ Джеймс, какое это имеет значение с кучей Фибоначчи? o.o   -  person ignis    schedule 08.06.2011
comment
algs4.cs.princeton.edu/code/ javadoc / edu / princeton / cs / algs4 /   -  person maplemaple    schedule 22.08.2019


Ответы (3)


Нет, стандартный API коллекций Java не содержит реализации кучи Фибоначчи. Я не уверен, почему это так, но я считаю, что это потому, что, хотя кучи Фибоначчи асимптотически велики в амортизированном смысле, на практике они имеют огромные постоянные факторы. Фреймворк коллекций также не имеет биномиальной кучи, что было бы еще одной хорошей кучей для включения.

В качестве совершенно бессовестного самоподключения у меня есть реализация кучи Фибоначчи на Java на моем личном веб-сайте. Я не уверен, насколько это будет полезно, но если вам интересно посмотреть, как это работает, я думаю, что это может быть хорошей отправной точкой.

Надеюсь это поможет!

person templatetypedef    schedule 08.06.2011
comment
Большое спасибо. Ваша реализация выглядит хорошо сделанной и хорошо задокументированной с множеством объяснений. Я посмотрю на это. - person Phil; 08.06.2011
comment
Вау, я собирался написать свое собственное удовольствие, но твое такое хорошее! - person Andy; 18.12.2013
comment
Как это работает на самом деле? Куча Фибоначчи, похоже, имеет довольно много накладных расходов на память. - person Has QUIT--Anony-Mousse; 09.10.2015
comment
@ Anony-Mousse Фибоначчи кучи печально известны своей медлительностью на практике именно по той причине, о которой вы упомянули. - person templatetypedef; 09.10.2015

Но почему они не использовали кучу Фибоначчи?

Вероятно, потому, что в этих кучах накладные расходы на запись намного больше, чем на двоичные ключи.

Кроме того, есть ли реализация кучи Фибоначчи в Java.util?

Нет, но

  1. Существует графмейкер от Натана Фидлера - GPL и с хорошим тестовое покрытие, но обратите внимание на это прекрасное сообщение в блоге об этом и о проблемах, которые может иметь fibonacci impl. В этом посте упоминается множество других реализаций Java.
  2. здесь есть код с модульными тестами.
  3. Проект JGraphT (также Натан Фидлер), а также (некоторые второстепенные) тесты, но LGPL.
  4. И последнее, но не менее важное: Neo4j - GPL - без тестов.
person Karussell    schedule 15.01.2012

Но почему они не использовали кучу Фибоначчи?

Я думаю, что основная причина заключается в том, что куча Фибоначчи может помочь только в том случае, если у вас намного больше операции reduceKey, связанной с одной операцией extractMin. Например, когда вы используете его с алгоритмом Дейкстры.

Кроме того, есть ли реализация кучи Фибоначчи в Java.util?

В Java.util нет реализации, но я провел несколько экспериментов по этой теме, используя существующие версии кучи Фибоначчи с открытым исходным кодом. Вы можете найти его в моем блоге или на репозиторий GitHub проекта.

person gabormakrai    schedule 12.02.2015
comment
Не могли бы вы уточнить свой ответ на первый вопрос - person arunmoezhi; 12.02.2015
comment
Конечно я могу. Куча Фибоначчи имеет превосходство над двоичной кучей при выполнении операций reduceKey и вставки, а также имеет ту же временную сложность для extractMin, но эта операция занимает гораздо больше времени для FH, чем для BH, потому что она консолидирует внутренний лес дерева. Так что, если у вас очень мало reduceKey, тогда он будет медленнее, чем обычная двоичная куча. Для некоторых специальных графиков это случай алгоритма Дейкстры. - person gabormakrai; 13.02.2015