Алгоритм Дейкстры — различия между версиями
| Строка 15: | Строка 15: | ||
'''for''' <tex>i \in V</tex> | '''for''' <tex>i \in V</tex> | ||
v = ''null'' | v = ''null'' | ||
| − | '''for''' <tex>j \in V</tex> | + | '''for''' <tex>j \in V</tex> <font color="green">// найдем вершину с минимальным расстоянием</font> |
'''if''' !used[j] '''and''' (v == ''null'' '''or''' d[j] < d[v]) | '''if''' !used[j] '''and''' (v == ''null'' '''or''' d[j] < d[v]) | ||
v = j | v = j | ||
| Строка 39: | Строка 39: | ||
== Оценка сложности == | == Оценка сложности == | ||
| − | + | В реализации алгоритма присутствует функция выбора вершины с минимальным значением <tex>d</tex> и релаксация по всем рёбрам для данной вершины. Асимптотика работы зависит от реализации. | |
| − | + | Пусть <tex>n</tex> - количество вершин в графе, <tex>m</tex> - количество рёбер в графе. | |
| − | {| | + | {| class="wikitable" |
| − | |||
| − | |||
|- | |- | ||
| − | | | + | ! rowspan="2" | |
| − | | | + | ! colspan="3" | Время работы |
| + | ! rowspan="2" | Описание | ||
|- | |- | ||
| − | + | ! Поиск минимума | |
| − | + | ! Релаксация | |
| + | ! Общее | ||
|- | |- | ||
| − | |[[Фибоначчиевы кучи|Фибоначчиева куча]] | + | | align="center" | Наивная реализация |
| − | |<tex>O( | + | | align="center" | <tex>O(n)</tex> |
| + | | align="center" | <tex>O(1)</tex> | ||
| + | | align="center" | <tex>O(n^2 + m)</tex> | ||
| + | | align="center" | <tex>n</tex> раз осуществляем поиск вершины с минимальной величиной <tex>d</tex> среди <tex>O(n)</tex> непомеченных вершин и <tex>m</tex> раз проводим релаксацию за <tex>O(1)</tex>. Для плотных графов (<tex>m \approx n^2</tex>) данная асимптотика является оптимальной. | ||
| + | |- | ||
| + | | align="center" | [[Двоичная куча]] | ||
| + | | align="center" | <tex>O(\log{n})</tex> | ||
| + | | align="center" | <tex>O(\log{n})</tex> | ||
| + | | align="center" | <tex>O(m\log{n})</tex> | ||
| + | | align="center" | Используя двоичную кучу можно выполнять операции извлечения минимума и обновления элемента за <tex>O(\log{n})</tex>. Тогда время работы алгоритма Дейкстры составит <tex>O(n\log{n} + m\log{n}) = O(m\log{n})</tex>. | ||
| + | |- | ||
| + | | align="center" | [[Фибоначчиевы кучи|Фибоначчиева куча]] | ||
| + | | align="center" | <tex>O(\log{n})</tex> | ||
| + | | align="center" | <tex>O(1)</tex> | ||
| + | | align="center" | <tex>O(n\log{n} + m)</tex> | ||
| + | | align="center" | Используя Фибоначчиевы кучи можно выполнять операции извлечения минимума за <tex>O(\log{n})</tex> и обновления элемента за <tex>O(1)</tex>. Таким образом, время работы алгоритма составит <tex>O(n\log{n} + m)</tex>. | ||
|} | |} | ||
Версия 19:21, 27 декабря 2015
| Задача: |
| Для заданного взвешенного графа найти кратчайшие пути из заданной вершины до всех остальных вершин. Веса всех рёбер неотрицательны. |
Содержание
Алгоритм
В ориентированном взвешенном графе , вес рёбер которого неотрицателен и определяется весовой функцией , алгоритм Дейкстры находит длины кратчайших путей из заданной вершины до всех остальных.
В алгоритме поддерживается множество вершин , для которых уже вычислены длины кратчайших путей до них из . На каждой итерации основного цикла выбирается вершина , которой на текущий момент соответствует минимальная оценка кратчайшего пути. Вершина добавляется в множество и производится релаксация всех исходящих из неё рёбер.
Псевдокод
func dijkstra(s):
for
d[v] =
used[v] = false
d[s] = 0
for
v = null
for // найдем вершину с минимальным расстоянием
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