Я реализовал Дейкстру с использованием кучи Фибоначчи несколько лет назад, и проблема очень похожа. По сути, преимущество кучи Фибоначчи состоит в том, что она делает поиск минимума набора постоянной операцией; так что это очень подходит для Прима и Дейкстры, где на каждом этапе вы должны выполнять эту операцию.
Почему это хорошо
Сложность этих алгоритмов, использующих биномиальную кучу (что является более «стандартным» способом), составляет O (E * log V), потому что - грубо - вы попробуете каждое ребро (E), и для каждого из них вы либо добавите новую вершину в вашу биномиальную кучу (журнал V) или уменьшите ее ключ (журнал V), а затем вам нужно найти минимум вашей кучи (другой журнал V).
Вместо этого, когда вы используете кучу Фибоначчи, стоимость вставки вершины или уменьшения ее ключа в вашей куче постоянна, поэтому для этого у вас есть только O (E). НО удаление вершины - это O (log V), поэтому, поскольку в конце будет удалена каждая вершина, которая добавляет O (V * log V), всего O (E + V * log V).
Поэтому, если ваш график достаточно плотный (например, E >> V), использование кучи Фибоначчи лучше, чем биномиальная куча.
Как сделать
Таким образом, идея состоит в том, чтобы использовать кучу Фибоначчи для хранения всех вершин, доступных из уже построенного поддерева, индексированных по весу наименьшего ребра, ведущего к нему. Если вы разобрались в реализации или алгоритме Прима с использованием другой структуры данных, нет никаких реальных трудностей в использовании вместо этого кучи Фибоначчи - просто используйте методы insert и deletemin кучи. как обычно, и используйте метод reducekey для обновления вершины, когда вы отпускаете ребро, ведущее к ней.
Единственная сложная часть - это реализовать фактическую кучу Фибоначчи.
Я не могу предоставить вам все подробности реализации здесь (для этого потребуются страницы), но когда я делал свою, я сильно полагался на Введение в алгоритмы (Кормен и др.). Если у вас его еще нет, но вы интересуетесь алгоритмами, я настоятельно рекомендую вам получить его копию! Он не зависит от языка и предоставляет подробные объяснения всех стандартных алгоритмов, а также их доказательства, и определенно повысит ваши знания и способность использовать все из них, а также разрабатывать и проверять новые алгоритмы. Этот PDF-файл (со страницы Википедии, на которую вы указали ) предоставляет некоторые детали реализации, но они определенно не так ясны, как Введение в алгоритмы.
У меня есть отчет и презентация Я написал после этого, что немного объясняет, как действовать (для Дейкстры - см. Куча Фибоначчи работает в псевдокоде), но все на французском ... и мой код находится на Caml (и французском), поэтому я не уверен, что это поможет !!! И если вы понимаете что-то из этого, пожалуйста, проявите снисходительность, я только начинал программировать, поэтому мои навыки программирования в то время были довольно плохими ...
person
Jules Olléon
schedule
28.01.2011