Какая очередь с приоритетами быстрее на практике? - PullRequest
0 голосов
/ 07 февраля 2020

Наиболее часто используемая операция: FindMin. Реже: Вставьте и Извлеките. Редко: DeleteNode. Очень редко: объединение.

Какая из следующих приоритетных очередей на практике быстрее при перечисленных условиях?

  • Наивная реализация на основе отсортированного двусвязного списка
  • Простая куча
  • Левая куча
  • Биноминальная куча
  • Куча Фибоначчи
  • 2-3 куча
  • Соединение кучи
  • Тонкая куча
  • Толстая куча
  • Косая биноминальная куча
  • Бродал-Окасаки очередь

1 Ответ

0 голосов
/ 11 февраля 2020

Мой опыт, основанный на работе, которую я проделал более пяти лет go, заключается в том, что 3-куча превосходит двоичную кучу в общем случае. Кучи списков пропуска и кучи сопряжения немного превосходят 3 кучи, но при более высокой стоимости памяти. Все три вышеупомянутых кучи Фибоначчи превзошли все ожидания.

Теоретически очередь Бродала является наиболее эффективной. Но, как сказал сам Бродал, они «довольно сложны» и «[не] применимы на практике». https://en.wikipedia.org/wiki/Brodal_queue

Многие люди говорят об эффективности кучи Фибоначчи, а асимптотический анализ c говорит, что он должен превзойти другие типы кучи. Эмпирические данные не подтверждают это. Существуют определенные недостатки кучи Фибоначчи, как описано в https://en.wikipedia.org/wiki/Fibonacci_heap#Worst_case.

Если вы хотите реализовать кучу, я бы предложил начать с двоичной кучи. Или 3 кучи, что является простой оптимизацией. Следующим моим шагом, если бы мне нужно было больше производительности, была бы куча сопряжения. Это легко реализовать и довольно эффективно.

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

...