Pull to refresh

Comments 8

Плохое объяснение. Особенно с учетом, что статьями про дейкстру завален интернет в целом и хабр в частности.

Вы воспроизводите самую большую ошибку комментариев - когда в них просто продублировано, что делает код:

# присваиваем 10 в переменную a
a = 10

По вашей статье невозможно понять алгоритм, только вызубрить. Ни слова про то, что он является по сути динамическим программированием, почему он работает, что его можно делать без очереди и так будет даже быстрее на плотных графах. Вообще, правильно сначала объяснить алгоритм без очереди, а потом уже ее сверху навешивать как оптимизацию.

Здравствуйте! Я с вами согласен. Это одна из моих первых статей и я разбираюсь на сколько умею. Мне нравится писать и параллельно понимать. В следующий раз постараюсь сделать лучше, а сейчас получилось вот так.

Ваши слова приму во внимание.

Можно ли узнать, лучше ли использовать по общей эффективности алгоритм A*(возможно даже bidirectional), чем просто raw Дейкстра?

Или эти вещи не стоит сравнивать?

Я до вашего комментария не читал про A*. Но теперь могу предположить, что для поиска единственного лучшего пути больше подойдет A*. Спасибо за вопрос.

Это разные классы алгоритмов. Дейкстра ищет до всех вершин, а A* до одной конкретной. A* в этом случае обычно лучше. Правда, не везде и не всегда. Если эвристика не очень точная и долго вычисляемая, то Дейкстра будет даже быстрее A*.

Вот метод, как найти все кратчайшие пути (вы в другой статье спрашивали): cначала Дейкстрой найдите расстояния до всех вершин. Потом рекурсивным перебором из конца, идите в каждую вершину, если расстояние там + длина ребра = расстоянию тут. Когда дошли до начала выводите текущий путь задом на перед. Можно, кстати, упростить этот момент, если запускать Дейкстру не из начала в конец, а наоборот, из конца в начало. Тогда восстановленый путь не надо будет разворачивать. Ну, если у вас граф не ориентированный, конечно. В ориентированном надо сначала все ребра развернуть.

Учтите только, что различных путей кратчайшей длины может быть экспоненциально много, а в случае ребер нулевой длины - вообще бесконечное количество. Кстати, для ребер отрицательной длины дейкстра вообще не работает, про это стоило упомянуть в статье.

Спасибо вам. Хорошая задача что бы попрактиковаться. Для таких комментариев стоит писать и ошибаться)

Sign up to leave a comment.

Articles