Бібліотеки Boost C ++ включають реалізацію куб Фібоначчі в boost/pending/fibonacci_heap.hpp
. Цей файл, мабуть, є pending/
роками, і за моїми прогнозами, він ніколи не буде прийнятий. Також у цій реалізації були помилки, які виправляв мій знайомий та крутий хлопець Аарон Віндзор. На жаль, у більшості версій цього файлу, які я міг знайти в Інтернеті (і в пакеті libboost-dev Ubuntu), все ще були помилки; Мені довелося витягнути чисту версію з сховища Subversion.
Починаючи з версії 1.49, бібліотеки Boost C ++ додали багато нових струпінгових структур, у тому числі кучу платформ.
Мені вдалося скласти dijkstra_heap_performance.cpp проти модифікованої версії dijkstra_shortest_paths.hpp, щоб порівняти купи Фібоначчі і бінарні купи. (У рядку typedef relaxed_heap<Vertex, IndirectCmp, IndexMap> MutableQueue
, змініть relaxed
на fibonacci
.) Я спершу забув скласти з оптимізаціями, і в цьому випадку Фібоначчі та двійкові купи виконують приблизно однаково, при цьому купи Фібоначчі зазвичай перевершують незначну кількість. Після того, як я склав дуже сильні оптимізації, бінарні купи отримали величезний приріст. У моїх тестах Фібоначчі купував тільки бінарні купи, коли графік був неймовірно великий і щільний, наприклад:
Generating graph...10000 vertices, 20000000 edges.
Running Dijkstra's with binary heap...1.46 seconds.
Running Dijkstra's with Fibonacci heap...1.31 seconds.
Speedup = 1.1145.
Наскільки я розумію, це стосується принципових відмінностей між купами Фібоначчі та бінарними купами. Єдина реальна теоретична відмінність між двома структурами даних полягає в тому, що купи Фібоначчі підтримують постійне час (амортизованого) постійного часу. З іншого боку, бінарні купи отримують значну продуктивність від їх реалізації як масиву; використання чіткої структури вказівника означає, що купи Фібоначчі зазнають величезних результатів.
Тому, щоб отримати користь від купи Фібоначчі на практиці , вам доведеться використовувати їх у програмі, де зменшення_кілій надзвичайно часто. З точки зору Дайкстра, це означає, що основний графік щільний. Деякі додатки можуть бути суттєво зменшеними-інтенсивними; Я хотів спробувати алгоритм мінімального скорочення Нагомочі-Ібаракі, тому що, мабуть, він генерує безліч скорочень зменшення, але це було занадто багато зусиль, щоб порівняти час роботи.
Попередження : я, можливо, зробив щось не так. Ви можете спробувати відтворити ці результати самостійно.
Теоретична примітка : Покращена продуктивність куб Фібоначчі при зменшенні клавіші важлива для теоретичних застосувань, таких як час виконання Dijkstra. Купи Фібоначчі також перевершують бінарні купи під час вставки та злиття (обидва амортизовані постійного часу для купи Фібоначчі). Вставлення по суті не має значення, тому що це не впливає на час роботи Дейкстри, і досить легко модифікувати бінарні купи, щоб вони також вставляли в амортизований постійний час. Злиття в постійний час - це фантастично, але не стосується цієї програми.
Особиста примітка : Один мій друг і я одного разу написали документ, в якому пояснювали нову чергу пріоритетів, яка намагалася повторити (теоретичний) час роботи куб Фібоначчі без їх складності. Стаття ніколи не була опублікована, але мій співавтор реалізував двійкові купи, куби Фібоначчі та нашу власну чергу пріоритетів для порівняння структур даних. Графіки експериментальних результатів вказують на те, що Фібоначчі купує трохи перевиконані бінарні купи за загальним порівнянням, що дозволяє припустити, що купи Фібоначчі будуть краще працювати в ситуації, коли вартість порівняння перевищує накладні витрати. На жаль, у мене немає коду, і, мабуть, у вашій ситуації порівняння коштує дешево, тому ці коментарі є релевантними, але безпосередньо не застосовуються.
Між іншим, я настійно рекомендую спробувати співставити час виконання куб Фібоначчі з вашою власною структурою даних. Я виявив, що я просто винаходив кучки Фібоначчі. Перш ніж я подумав, що всі складності куб Фібоначчі - це деякі випадкові ідеї, але згодом я зрозумів, що всі вони природні і досить вимушені.