Алгоритм Дейкстры — различия между версиями
| Строка 42: | Строка 42: | ||
Таким образом: | Таким образом: | ||
| − | {| border="1" cellpadding="5" cellspacing="0" style="text-align:center" | + | |
| − | ! | + | {| border="1" cellpadding="5" cellspacing="0" style="text-align:center" |
| − | ! | + | ! Структура данных |
| + | ! Время работы | ||
|- | |- | ||
| − | + | |Наивная реализация | |
| − | + | |<tex>O(V^2+E)</tex> | |
|- | |- | ||
| − | + | |[[Двоичная куча]] | |
| − | + | |<tex>O(E\log{V})</tex> | |
|- | |- | ||
| − | + | |[[Фибоначчиевы кучи|Фибоначчиева куча]] | |
| − | + | |<tex>O(V\log{V}+E)</tex> | |
|} | |} | ||
== Источники == | == Источники == | ||
| − | * | + | * Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — с. 459. — ISBN 5-8489-0857-4 |
| − | * [ | + | * [http://e-maxx.ru/algo/dijkstra MAXimal :: algo :: Нахождение кратчайших путей от заданной вершины до всех остальных вершин алгоритмом Дейкстры] |
| + | * [https://ru.wikipedia.org/wiki/Алгоритм_Дейкстры Википедия — Алгоритм Дейкстры] | ||
| + | * [https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm Wikipedia — Dijkstra's algorithm] | ||
[[Категория: Алгоритмы и структуры данных]] | [[Категория: Алгоритмы и структуры данных]] | ||
[[Категория: Кратчайшие пути в графах ]] | [[Категория: Кратчайшие пути в графах ]] | ||
Версия 18:59, 19 декабря 2015
| Задача: |
| Для заданного взвешенного графа найти кратчайшие пути из заданной вершины до всех остальных вершин. Веса всех рёбер неотрицательны. |
Алгоритм
В ориентированном взвешенном графе , вес рёбер которого неотрицателен и определяется весовой функцией , алгоритм Дейкстры находит длины кратчайших путей из заданной вершины до всех остальных.
В алгоритме поддерживается множество вершин , для которых уже вычислены длины кратчайших путей до них из . На каждой итерации основного цикла выбирается вершина , которой на текущий момент соответствует минимальная оценка кратчайшего пути. Вершина добавляется в множество и производится релаксация всех исходящих из неё рёбер.
Псевдокод
func dijkstra(s):
for i = 0 to n // n — количество вершин в графе
d[v] =
used[v] = false
d[s] = 0
for i = 0 to n
v = null
for j = 0 to n // найдем вершину с минимальным расстоянием
if !used[j] and (v == null or d[j] < d[v])
v = j
if d[v] ==
break
used[v] = true
for e : исходящие из v рёбра // произведём релаксацию по всем рёбрам, исходящим из v
if d[v] + e.len < d[e.to]
d[e.to] = d[v] + e.len
Обоснование корректности
| Теорема: |
Пусть — ориентированный взвешенный граф, вес рёбер которого неотрицателен, — стартовая вершина.
Тогда после выполнения алгоритма Дейкстры для всех , где — длина кратчайшего пути из вершины в вершину |
| Доказательство: |
|
Докажем по индукции, что в момент посещения любой вершины , .
|
Оценка сложности
Основной цикл выполняется раз. Релаксация выполнится всего раз. В реализации алгоритма присутствует функция выбора вершины с минимальным значением , асимптотика её работы зависит от реализации.
Таким образом:
| Структура данных | Время работы |
|---|---|
| Наивная реализация | |
| Двоичная куча | |
| Фибоначчиева куча |
Источники
- Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — с. 459. — ISBN 5-8489-0857-4
- MAXimal :: algo :: Нахождение кратчайших путей от заданной вершины до всех остальных вершин алгоритмом Дейкстры
- Википедия — Алгоритм Дейкстры
- Wikipedia — Dijkstra's algorithm