Алгоритм Дейкстры — различия между версиями
Строка 1: | Строка 1: | ||
− | В ориентированном взвешенном графе <tex>G = (V, E)</tex>, вес рёбер которого неотрицателен и определяется весовой функцией <tex>w | + | В ориентированном взвешенном графе <tex>G = (V, E)</tex>, вес рёбер которого неотрицателен и определяется весовой функцией <tex>w : E \rightarrow R</tex>, Алгоритм Дейкстры находит длину кратчайшего пути из заданной вершины <tex>s</tex> до всех остальных. |
== Алгоритм == | == Алгоритм == | ||
− | В алгоритме поддерживается множество вершин <tex>U</tex>, для которых уже вычислены | + | В алгоритме поддерживается множество вершин <tex>U</tex>, для которых уже вычислены длины кратчайших путей до них из <tex>s</tex>. На каждой итерации основного цикла выбирается вершина <tex> u \notin U</tex>, которой на текущий момент соответствует минимальная оценка кратчайшего пути. Вершина <tex>u</tex> добавляется в множество <tex>U</tex> и производится релаксация всех исходящих из неё рёбер. |
== Псевдокод == | == Псевдокод == | ||
Строка 10: | Строка 10: | ||
<code>Пока</code> <tex>\exists v \notin U</tex> | <code>Пока</code> <tex>\exists v \notin U</tex> | ||
− | : <code>Пусть</code> <tex>v \notin U</tex> <code> | + | : <code>Пусть</code> <tex>v \notin U : d[v]</tex> <code> минимальный </code> |
: <code>Для всех</code> <tex>u \notin U</tex> <code>таких, что</code> <tex>vu \in E</tex> | : <code>Для всех</code> <tex>u \notin U</tex> <code>таких, что</code> <tex>vu \in E</tex> | ||
:: <code>если</code> <tex> d[u] > d[v] + w(vu)</tex> <code>то</code> | :: <code>если</code> <tex> d[u] > d[v] + w(vu)</tex> <code>то</code> | ||
Строка 18: | Строка 18: | ||
== Обоснование корректности == | == Обоснование корректности == | ||
Пусть <tex>\rho(u, v)</tex> — длина кратчайшего пути из вершины <tex>u</tex> в вершину <tex>v</tex>. Докажем по индукции, что в момент посещения любой вершины <tex>u</tex>, <tex>d(u) = \rho(s, u)</tex>, где <tex>s</tex> - стартовая вершина. | Пусть <tex>\rho(u, v)</tex> — длина кратчайшего пути из вершины <tex>u</tex> в вершину <tex>v</tex>. Докажем по индукции, что в момент посещения любой вершины <tex>u</tex>, <tex>d(u) = \rho(s, u)</tex>, где <tex>s</tex> - стартовая вершина. | ||
− | * Первая вершина - стартовая <tex>d(s) = | + | * Первая вершина - стартовая <tex>d(s) = \rho(s, s) = 0</tex> |
* Пусть для <tex>n</tex> первых шагов алгоритм сработал верно и на <tex>n + 1</tex> шагу выбрана вершина <tex>u</tex>. Докажем, что в этот момент <tex>d(u) = \rho(s, u)</tex>. Для начала отметим, что для любой вершины <tex>v</tex>, всегда выполняется <tex>d(v) \ge \rho(s, v)</tex> (алгоритм не может найти путь короче, чем кратчайший из всех существующих). Пусть <tex>P</tex> — кратчайший путь из <tex>s</tex> в <tex>u</tex>, <tex>v</tex> — первая непосещённая вершина на <tex>P</tex>, <tex>z</tex> — предшествующая ей (следовательно, посещённая). Поскольку путь <tex>P</tex> кратчайший, его часть, ведущая из <tex>s</tex> через <tex>z</tex> в <tex>v</tex>, тоже кратчайшая, следовательно <tex>\rho(s, v) = \rho(s, z) + w(zv)</tex>. По предположению индукции, в момент посещения вершины <tex>z</tex> выполнялось <tex>d(z) = \rho(s, z)</tex>, следовательно, вершина <tex>v</tex> тогда получила метку не больше чем <tex>d(z) + w(zv) = \rho(s, z) + w(zv) = \rho(s, v)</tex> (если существует <tex>k</tex>, такое что <tex>\rho(s, k) + w(kv) < \rho(s, z) + w(zv)</tex> то <tex>z</tex> не принадлежит <tex>P</tex>). Следовательно, <tex>d(v) = \rho(s, v)</tex>. С другой стороны, поскольку сейчас мы выбрали вершину <tex>u</tex>, её метка минимальна среди непосещённых, то есть <tex>d(u) \le d(v) = \rho(s, u) \le \rho(s, v)</tex>. Комбинируя это с <tex>d(u) \ge \rho(s, u)</tex>, имеем <tex>d(u) = \rho(s, u)</tex>, что и требовалось доказать. | * Пусть для <tex>n</tex> первых шагов алгоритм сработал верно и на <tex>n + 1</tex> шагу выбрана вершина <tex>u</tex>. Докажем, что в этот момент <tex>d(u) = \rho(s, u)</tex>. Для начала отметим, что для любой вершины <tex>v</tex>, всегда выполняется <tex>d(v) \ge \rho(s, v)</tex> (алгоритм не может найти путь короче, чем кратчайший из всех существующих). Пусть <tex>P</tex> — кратчайший путь из <tex>s</tex> в <tex>u</tex>, <tex>v</tex> — первая непосещённая вершина на <tex>P</tex>, <tex>z</tex> — предшествующая ей (следовательно, посещённая). Поскольку путь <tex>P</tex> кратчайший, его часть, ведущая из <tex>s</tex> через <tex>z</tex> в <tex>v</tex>, тоже кратчайшая, следовательно <tex>\rho(s, v) = \rho(s, z) + w(zv)</tex>. По предположению индукции, в момент посещения вершины <tex>z</tex> выполнялось <tex>d(z) = \rho(s, z)</tex>, следовательно, вершина <tex>v</tex> тогда получила метку не больше чем <tex>d(z) + w(zv) = \rho(s, z) + w(zv) = \rho(s, v)</tex> (если существует <tex>k</tex>, такое что <tex>\rho(s, k) + w(kv) < \rho(s, z) + w(zv)</tex> то <tex>z</tex> не принадлежит <tex>P</tex>). Следовательно, <tex>d(v) = \rho(s, v)</tex>. С другой стороны, поскольку сейчас мы выбрали вершину <tex>u</tex>, её метка минимальна среди непосещённых, то есть <tex>d(u) \le d(v) = \rho(s, u) \le \rho(s, v)</tex>. Комбинируя это с <tex>d(u) \ge \rho(s, u)</tex>, имеем <tex>d(u) = \rho(s, u)</tex>, что и требовалось доказать. | ||
Версия 07:32, 19 октября 2011
В ориентированном взвешенном графе
, вес рёбер которого неотрицателен и определяется весовой функцией , Алгоритм Дейкстры находит длину кратчайшего пути из заданной вершины до всех остальных.Алгоритм
В алгоритме поддерживается множество вершин
, для которых уже вычислены длины кратчайших путей до них из . На каждой итерации основного цикла выбирается вершина , которой на текущий момент соответствует минимальная оценка кратчайшего пути. Вершина добавляется в множество и производится релаксация всех исходящих из неё рёбер.Псевдокод
Для всех
Пока
-
Пусть
минимальный
-
Для всех
таких, что
-
если
то
-
Обоснование корректности
Пусть
— длина кратчайшего пути из вершины в вершину . Докажем по индукции, что в момент посещения любой вершины , , где - стартовая вершина.- Первая вершина - стартовая
- Пусть для первых шагов алгоритм сработал верно и на шагу выбрана вершина . Докажем, что в этот момент . Для начала отметим, что для любой вершины , всегда выполняется (алгоритм не может найти путь короче, чем кратчайший из всех существующих). Пусть — кратчайший путь из в , — первая непосещённая вершина на , — предшествующая ей (следовательно, посещённая). Поскольку путь кратчайший, его часть, ведущая из через в , тоже кратчайшая, следовательно . По предположению индукции, в момент посещения вершины выполнялось , следовательно, вершина тогда получила метку не больше чем (если существует , такое что то не принадлежит ). Следовательно, . С другой стороны, поскольку сейчас мы выбрали вершину , её метка минимальна среди непосещённых, то есть . Комбинируя это с , имеем , что и требовалось доказать.
- Поскольку алгоритм заканчивает работу, когда все вершины посещены, в этот момент для всех .
Оценка сложности
Основной цикл выполняется
раз. Релаксация выполниться всего раз. В реализации алгоритма присутствует функция выбора вершины с минимальным значением , асимптотика её работы зависит от реализации.Таким образом:
Структура данных | Время работы |
---|---|
Наивная реализация | |
Двоичная куча | |
Фибоначчиева куча |
Источники
- Кормен, Томас Х., Лейзерсон, Чарльз И., Ривест, Рональд Л., Штайн Клиффорд Алгоритмы: построение и анализ, 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — 1296 с.: ил. — Парал. тит. англ. — ISBN 978-5-8459-0857-5 (рус.)
- Википедия — свободная энциклопедия