Алгоритм Дейкстры — различия между версиями
 (→Литература)  | 
				 (→Оценка сложности)  | 
				||
| Строка 37: | Строка 37: | ||
== Оценка сложности ==  | == Оценка сложности ==  | ||
| − | Основной цикл выполняется <tex>V</tex> раз. Релаксация выполниться всего <tex>E</tex> раз. В реализации алгоритма присутствует функция   | + | Основной цикл выполняется <tex>V</tex> раз. Релаксация выполниться всего <tex>E</tex> раз. В реализации алгоритма присутствует функция выбора вершины с минимальным значением <tex>d</tex>, асимптотика её работы зависит от реализации.  | 
Таким образом:  | Таким образом:  | ||
{| border="1" cellpadding="5" cellspacing="0" style="text-align:center" width=30%  | {| border="1" cellpadding="5" cellspacing="0" style="text-align:center" width=30%  | ||
| − | !style="background:#f2f2f2"|Структура данных   | + | !style="background:#f2f2f2"|Структура данных    | 
| − | !style="background:#f2f2f2"|  | + | !style="background:#f2f2f2"|Время работы  | 
|-  | |-  | ||
|style="background:#f9f9f9"|Наивная реализация  | |style="background:#f9f9f9"|Наивная реализация  | ||
|style="background:#f9f9f9"|<tex>O(V^2+E)</tex>  | |style="background:#f9f9f9"|<tex>O(V^2+E)</tex>  | ||
|-  | |-  | ||
| − | |style="background:#f9f9f9"|  | + | |style="background:#f9f9f9"|Двоичная куча  | 
|style="background:#f9f9f9"|<tex>O(E\log{V})</tex>  | |style="background:#f9f9f9"|<tex>O(E\log{V})</tex>  | ||
|-  | |-  | ||
| Строка 53: | Строка 53: | ||
|style="background:#f9f9f9"|<tex>O(V\log{V}+E)</tex>  | |style="background:#f9f9f9"|<tex>O(V\log{V}+E)</tex>  | ||
|}  | |}  | ||
| − | |||
== Источники ==  | == Источники ==  | ||
Версия 20:41, 14 октября 2011
В ориентированном взвешанном графе , вес рёбер которого неотрицателен и определяется весовой функцией , Алгоритм Дейкстры находит длину кратчайшего пути из одной вершины до всех остальных.
Алгоритм
В алгоритме поддерживается множество вершин , для которых уже вычислены кратчайшие пути к ним из вершины . На каждой итерации основного цикла выбирается вершина , которой на текущий момент соответствует минимальная оценка кратчайшего пути. Вершина добавляется в множество и производится релаксация всех исходящих из неё рёбер.
Псевдокод
Для всех 
-  
присвоим 
Присвоим 
Пока 
-  
Пусть— вершина с минимальным -  
Для всехтаких, что-  
еслито 
 -  
 
Обоснование корректности работы
| Теорема: | 
После окончания работы алгоритма Дейкстры для всех вершин  будет выполняться равенство   | 
| Доказательство: | 
| 
 Рассмотрим инвариант основного цикла: в начале каждой итерации для всех вершин выполняется Инициализация. Изначально множество пусто, инвариант выполняется. Сохранение. Покажем, что при каждой итерации инвариант сохраняется для каждой вершины, добавленной в , для этого воспользуемся методом «от противного». Предположим, что первая добавленная в вершина, для которой равенство не выполняется. Рассмотрим ситуацию, сложившуюся в начале итерации, в которой будет добавлена в . Рассмотрев кратчайший путь из в , можно получить противоречие, заключающееся в том, что на рассматриваемый момент справедливо равенство . Должно выполняться условие , так как является первой вершиной, добавленной в и в момент её добавления равенство выполняется. Из условия следует, в частности, что не пусто. Из вершины в вершину должен существовать какой-нибудь путь, так как иначе выполняется соотношение , нарушающее предположение о том, что равенство не выполняется. Из существования пути следует, что существует и кратчайший путь из в . Перед добавлением в путь соединяет вершину из множества с вершиной принадлежащей множеству . Рассмотрим первую вершину на пути принадлежащую , и положим, что её предшествует вершина . Тогда, как видно из рис.1, путь можно разложить на составляющие . Утверждается, что в момент добавления вершины в множество , выполняется равенство . Так как вершина выбрана как первая вершина, после добавления которой в множество не выполянется соотношение , то после добавления вершины в справедливо равенство . В это время происходит релаксация ребра , поэтому вышеописанное утверждение выполняется. Поскольку на кратчайшем пути из в вершина находиться перед и вес каждого из ребер выражается неотрицательным значением, выполняется неравенство , поэтому . Но так как и вершина , и вершина во время выбора вершины находились в множестве , выполняется неравенство . Таким образом, оба . Значит, , что противоречит нашему выбору вершины . Следовательно, во время добавления вершины в множество выполняется равенство, а следовательно, оно выполняется и в дальнейшем. Завершение. По завершении работы алгоритма множество пусто. Из этого равенства следует, что . Таким образом, для всех вершин выполняется равенство . | 
Оценка сложности
Основной цикл выполняется раз. Релаксация выполниться всего раз. В реализации алгоритма присутствует функция выбора вершины с минимальным значением , асимптотика её работы зависит от реализации.
Таким образом:
| Структура данных | Время работы | 
|---|---|
| Наивная реализация | |
| Двоичная куча | |
| Куча Фибоначчи | 
Источники
- Кормен, Томас Х., Лейзерсон, Чарльз И., Ривест, Рональд Л., Штайн Клиффорд Алгоритмы: построение и анализ, 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — 1296 с.: ил. — Парал. тит. англ. — ISBN 978-5-8459-0857-5 (рус.)
 - Википедия — свободная энциклопедия