Я реализовал Dijkstra используя кучи Fibonacci несколько лет назад, и проблема довольно похожа. В принципе, преимущество кучи Фибоначчи заключается в том, что он делает поиск минимума набора постоянной работы; так что это очень подходит для Prim и Dijkstra, где на каждом шаге вам нужно выполнить эту операцию.
Почему это хорошо
Сложность этих алгоритмов с использованием биномиальной кучи (которая является более «стандартным» способом) является O (E * .log V), потому что - грубо - вы будете стараться каждое ребро (E), и для каждого из них вы либо добавите новую вершину в свою биномиальную кучу (журнал V), либо уменьшите ее ключ (журнал V), а затем должны найти минимум своей кучи (другой журнал V).
Вместо этого, когда вы используете кучу Фибоначчи, стоимость вставки вершины или уменьшения ее ключа в вашей куче постоянна, поэтому для этого у вас есть только O (E). BUT удаляет вершину O (log V), так что в конце каждая вершина будет удалена, что добавит O (V * log V) для общего O (E + V * log V).
Итак, если ваш график достаточно плотный (например, E >> V), использование кучи Фибоначчи лучше, чем биномиальная куча.
Как
Идея, таким образом, использовать кучу Фибоначчи хранить все вершины, доступные из поддерева вы уже построен, индексированные по весу наименьшего края, ведущей к нему. Если вы понимаете реализацию или алгоритм Prim с использованием другой структуры данных, нет реальной трудности в использовании кучи Fibonacci вместо этого - просто используйте вставки и deleteemin методов кучи, как обычно, и используйте код уменьшения метод обновления вершины, когда вы отпускаете ребро, ведущее к нему.
Единственная сложная задача - реализовать фактическую кучу Фибоначчи.
Я не могу дать вам все детали реализации здесь (это займет страницы), но когда я сделал это, я сильно полагался на Introduction to algorithms (Cormen et al). Если у вас его еще нет, но вы заинтересованы в алгоритмах, я настоятельно рекомендую вам получить его копию! Это язык агностик, и он дает подробные объяснения по всем алгоритмам стандартов, а также их доказательствам и, несомненно, повысит ваши знания и умение использовать их все, а также спроектирует и докажет новые. This PDF (со страницы со ссылками на Википедию) содержит некоторые детали реализации, но это определенно не так ясно, как Введение в алгоритмы.
У меня есть report и presentation я написал после того, как сделать это, что немного объяснить, как продолжить (для Дейкстры - см конец РРТ для функций Фибоначчи кучи в псевдо-коде), но это все по-французски. .. и мой code находится в Caml (и на французском), поэтому я не уверен, что это помогает !!! И если вы можете понять что-то из этого, будьте снисходительны, я только начинал программировать, поэтому мои навыки кодирования были довольно плохими в то время ...
Знаете ли вы, что такое биномиальная куча? Это объясняет большую разницу. – Haozhun
№. просто что википедия говорит –