Реальные применения бинарных куч и куч Фибоначчи

Каковы реальные применения кучи Фибоначчи и двоичных кучи? Было бы здорово, если бы вы могли поделиться каким-то примером, когда использовали его для решения проблемы.

Изменить: Добавлены двоичные кучи также. Любопытно узнать.

4 ответа

Решение

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

Из вики:

Хотя общее время выполнения последовательности операций, начинающихся с пустой структуры, ограничено указанными выше границами, некоторые (очень немногие) операции в последовательности могут выполняться очень долго (в частности, минимальные значения удаления и удаления имеют линейное время выполнения в худший случай). По этой причине кучи Фибоначчи и другие амортизированные структуры данных могут не подходить для систем реального времени.

Бинарная куча - это структура данных, которую можно использовать для быстрого поиска максимального (или минимального) значения в наборе значений. Он используется в алгоритме Дейкстры (кратчайший путь), алгоритме Прима (минимальное связующее дерево) и кодировании Хаффмана (сжатие данных).

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

Одним известным примером является планирование процессов в ядре. Процесс с наивысшим приоритетом берется первым.

Я использовал очереди приоритетов при разбиении наборов. Набор с максимальным количеством членов должен был быть взят первым для разбиения.

В большинстве сценариев вы должны выбирать в зависимости от сложности:

  • вставка
  • поиск элементов

И обычные подозреваемые:

  • BST: log(n) вставить и найти
  • связанный список: O(1) вставить и O(n) находить
  • куча:
    • O(1) вставить
    • O(1) найти только для первого элемента, O(n) в общем
      • худший случай для двоичной кучи
      • амортизируется по Фибоначчи

Существует также очередь Бродал и другие кучи, которые достигают O(1) в худшем случае, но требует даже больших очередей, чем Фибоначчи, чтобы оно того стоило.

Так что, если вашему алгоритму нужно только "найти" первый элемент и выполнить много вставок, кучи - хороший выбор.

Как уже упоминалось, это дело Дейкстры.

Приоритетные очереди обычно реализуются в виде кучи, например: http://download.oracle.com/javase/6/docs/api/java/util/PriorityQueue.html

Вычисление первых N элементов из огромного набора данных может быть эффективно выполнено с использованием двоичных куч (например, самых популярных поисковых запросов на крупномасштабном веб-сайте).

Другие вопросы по тегам