Алгоритм Дейкстры — различия между версиями
Vasin (обсуждение | вклад) (→Псевдокод) |
Vasin (обсуждение | вклад) (→Псевдокод) |
||
Строка 5: | Строка 5: | ||
== Псевдокод == | == Псевдокод == | ||
− | <code>Для всех</code> <tex>u \in V</tex> [[Файл:Dijksta Anim.gif| | + | <code>Для всех</code> <tex>u \in V</tex> [[Файл:Dijksta Anim.gif|250px|thumb|right|Пример работы алгоритма]] |
: <tex>d[u] \gets \infty</tex> | : <tex>d[u] \gets \infty</tex> | ||
<tex>d[s] \gets 0\</tex><br> | <tex>d[s] \gets 0\</tex><br> |
Версия 21:18, 20 октября 2011
В ориентированном взвешенном графе
, вес рёбер которого неотрицателен и определяется весовой функцией , алгоритм Дейкстры находит длины кратчайших путей из заданной вершины до всех остальных.Алгоритм
В алгоритме поддерживается множество вершин
, для которых уже вычислены длины кратчайших путей до них из . На каждой итерации основного цикла выбирается вершина , которой на текущий момент соответствует минимальная оценка кратчайшего пути. Вершина добавляется в множество и производится релаксация всех исходящих из неё рёбер.Псевдокод
Для всех
Пока
-
Пусть
минимальный
-
Для всех
таких, что
-
если
то
-
Обоснование корректности
Пусть
— длина кратчайшего пути из вершины в вершину . Докажем по индукции, что в момент посещения любой вершины , , где - стартовая вершина.- На первом шаге выбирается , для нее выполнено:
- Пусть для первых шагов алгоритм сработал верно и на шагу выбрана вершина . Докажем, что в этот момент . Для начала отметим, что для любой вершины , всегда выполняется (алгоритм не может найти путь короче, чем кратчайший из всех существующих). Пусть — кратчайший путь из в , — первая непосещённая вершина на , — предшествующая ей (следовательно, посещённая). Поскольку путь кратчайший, его часть, ведущая из через в , тоже кратчайшая, следовательно . По предположению индукции, в момент посещения вершины выполнялось , следовательно, вершина тогда получила метку не больше чем , следовательно, . С другой стороны, поскольку сейчас мы выбрали вершину , её метка минимальна среди непосещённых, то есть , где второе неравенсто верно из-за ранее упомянутого определения вершины в качестве первой непосещённой вершины на , то есть вес пути до промежуточной вершины не превосходит веса пути до конечной вершины вследствие неотрицательности весовой функции. Комбинируя это с , имеем , что и требовалось доказать.
- Поскольку алгоритм заканчивает работу, когда все вершины посещены, в этот момент для всех .
Оценка сложности
Основной цикл выполняется
раз. Релаксация выполниться всего раз. В реализации алгоритма присутствует функция выбора вершины с минимальным значением , асимптотика её работы зависит от реализации.Таким образом:
Структура данных | Время работы |
---|---|
Наивная реализация | |
Двоичная куча | |
Фибоначчиева куча |
Источники
- Кормен, Томас Х., Лейзерсон, Чарльз И., Ривест, Рональд Л., Штайн Клиффорд Алгоритмы: построение и анализ, 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — 1296 с.: ил. — Парал. тит. англ. — ISBN 978-5-8459-0857-5 (рус.)
- Википедия — свободная энциклопедия