Главная Контакты

Реклама

Опрос пользователей

Оцените работу движка


Календарь

«    Апрель 2026    »
ПнВтСрЧтПтСбВс
 12345
6789101112
13141516171819
20212223242526
27282930 

Реализация алгоритма Дейкстры: мои грабли и успехи

Всем привет! Решил тут на досуге поковыряться с алгоритмами, и вот добрался до Дейкстры. Ну, казалось бы что может быть сложного? Граф, веса, поиск кратчайшего пути. Ага, как же!

Начал с простейшей реализации на списках смежности. Вроде все логично: очередь с приоритетом, обновляем расстояния. Но вот тут-то и начались пляски с бубном. Во-первых, на больших графах это начинает тормозить нещадно, особенно если веса не очень приятные. Во-вторых, обработка ошибок – это отдельная песня. Я пару раз так зациклился, что чуть курсор не сломал. В итоге, после пары бессонных ночей и тонны кофе, понял, что для некоторых задач надо либо более хитрую структуру данных использовать, либо вообще смотреть в сторону А*.

Плюсы:
  • Простота понимания основной логики
  • Хорошо работает на небольших графах
Минусы:
  • Низкая производительность на больших данных
  • Сложность обработки особых случаев
  • Требует внимания к деталям реализации

Итого: алгоритм мощный, но требует аккуратного подхода. Для учебных целей – самое то. Для продакшена – надо крепко подумать.

krab5.at

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
Разместил: NetAdmin
В среду в 18:20
Комментариев: 5
Публикаций: 1
Статус: offline
    Нравится 0

CodeMaster

CloudNine

NetAdmin, приветствую. Проблемы с Дейкстрой — классика. Чаще всего упираются в реализацию очереди с приоритетом. Стандартный heapq в Python, например, работает O(log N) для push и pop, но вот decrease-key там напрямую не сделать. Приходится либо добавлять дубликаты вершин с новым, меньшим расстоянием (что увеличивает размер кучи), либо использовать более сложные структуры.

Я вот у себя на slon6.cc когда-то реализовывал, пришлось повозиться. В итоге остановился на варианте с двумя кучами: одна для хранения пар (расстояние, вершина), другая — для отслеживания, была ли вершина уже обработана. Получилось около O(E log V) для разреженных графов, где E — количество ребер, V — количество вершин. Для плотных графов, где E ≈ V^2, это может быть медленнее, чем вариант с Фибоначчиевой кучей (O(E + V log V)), но проще в реализации.

А ты какой тип графа использовал? Ориентированный, неориентированный? С отрицательными весами (хотя Дейкстра их не любит)? Если веса неотрицательные, то все должно быть достаточно предсказуемо. Может, ошибка в логике обновления расстояний? Или в условии выхода из цикла?

slon5.cc

Добавление комментария

Ваше Имя:*
Ваш E-Mail:*
 
Введите код с картинки:*
Кликните на изображение чтобы обновить код, если он неразборчив

Новости партнёров