Алгоритм Дейкстры — различия между версиями
(→Обоснование корректности работы) |
(→Алгоритм) |
||
Строка 2: | Строка 2: | ||
== Алгоритм == | == Алгоритм == | ||
− | + | Алгори́тм Де́йкстры (Dijkstra’s algorithm) — алгоритм на графах, изобретённый нидерландским ученым Э. Дейкстрой в 1959 году. Находит кратчайшее расстояние от одной из вершин графа до всех остальных. Алгоритм работает только для графов без рёбер отрицательного веса. | |
== Псевдокод == | == Псевдокод == |
Версия 20:10, 14 октября 2011
В ориентированном взвешанном графе
, вес рёбер которого неотрицателен и определяется весовой функцией , Алгоритм Дейкстры находит длину кратчайшего пути из одной вершины до всех остальных.Алгоритм
Алгори́тм Де́йкстры (Dijkstra’s algorithm) — алгоритм на графах, изобретённый нидерландским ученым Э. Дейкстрой в 1959 году. Находит кратчайшее расстояние от одной из вершин графа до всех остальных. Алгоритм работает только для графов без рёбер отрицательного веса.
Псевдокод
Dijkstra(, , ) while do argmin( ) for do relax( , , )
Обоснование корректности работы
Теорема: |
После окончания работы алгоритма Дейкстры для всех вершин будет выполняться равенство |
Доказательство: |
Рассмотрим инвариант основного цикла: в начале каждой итерации для всех вершин выполняетсяИнициализация. Изначально множество пусто, инвариант выполняется.Сохранение. Покажем, что при каждой итерации инвариант сохраняется для каждой вершины, добавленной в , для этого воспользуемся методом «от противного». Предположим, что первая добавленная в вершина, для которой равенство не выполняется. Рассмотрим ситуацию, сложившуюся в начале итерации, в которой будет добавлена в . Рассмотрев кратчайший путь из в , можно получить противоречие, заключающееся в том, что на рассматриваемый момент справедливо равенство . Должно выполняться условие , так как является первой вершиной, добавленной в и в момент её добавления равенство выполняется. Из условия следует, в частности, что не пусто. Из вершины в вершину должен существовать какой-нибудь путь, так как иначе выполняется соотношение , нарушающее предположение о том, что равенство не выполняется. Из существования пути следует, что существует и кратчайший путь из в . Перед добавлением в путь соединяет вершину из множества с вершиной принадлежащей множеству . Рассмотрим первую вершину на пути принадлежащую , и положим, что её предшествует вершина . Тогда, как видно из рис.1, путь можно разложить на составляющие .Утверждается, что в момент добавления вершины в множество , выполняется равенство . Так как вершина выбрана как первая вершина, после добавления которой в множество не выполянется соотношение , то после добавления вершины в справедливо равенство . В это время происходит релаксация ребра , поэтому вышеописанное утверждение выполняется.Поскольку на кратчайшем пути из в вершина находиться перед и вес каждого из ребер выражается неотрицательным значением, выполняется неравенство , поэтому . Но так как и вершина , и вершина во время выбора вершины находились в множестве , выполняется неравенство . Таким образом, оба .Значит, Завершение. По завершении работы алгоритма множество , что противоречит нашему выбору вершины . Следовательно, во время добавления вершины в множество выполняется равенство , а следовательно, оно выполняется и в дальнейшем. пусто. Из этого равенства следует, что . Таким образом, для всех вершин выполняется равенство . |
Оценка сложности
Основной цикл выполняется
раз. Релаксация выполниться всего раз. В реализации алгоритма присутствует функция argmin, асимптотика её работы зависит от реализации.Таким образом:
Структура данных для хранения множества | Асимптотика времени работы |
---|---|
Наивная реализация | |
Куча | |
Куча Фибоначчи |
Литература
- Кормен, Томас Х., Лейзерсон, Чарльз И., Ривест, Рональд Л., Штайн Клиффорд Алгоритмы: построение и анализ, 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — 1296 с.: ил. — Парал. тит. англ. — ISBN 978-5-8459-0857-5 (рус.)