Алгоритм Левита — различия между версиями
Никита (обсуждение | вклад) (→Сложность) |
Никита (обсуждение | вклад) (→Сложность) |
||
Строка 54: | Строка 54: | ||
== Сложность == | == Сложность == | ||
− | В худшем случае алгоритм Левита работает за <tex>\bf O(|V| | + | В худшем случае алгоритм Левита работает за <tex>\bf O(|V| \cdot 2^{|V|})</tex>. Это происходит вследствие того, что некоторые вершины приходится обрабатывать повторно. Однако эксперементы показывают, что для реальных графов(например, карт дорог) данный алгоритм оказывается достаточно быстрым. Эксперементальная оценка данного алгоритма составляет <tex>\bf O(|E| \cdot log |V|)</tex>. |
== См. также == | == См. также == |
Версия 19:08, 19 октября 2013
Алгоритм Левита находит расстояние от заданной вершины
до всех остальных. Позволяет работать с ребрами отрицательного веса при отсутствии отрицательных циклов.Содержание
Алгоритм
Пусть
— текущая длина кратчайшего пути до вершины . Изначально, для всех ; .Разделим вершины на три множества:
- — вершины, расстояние до которых уже вычислено(возможно, не окончательно)
- — вершины, расстояние до которых вычисляется. Это множество в свою очередь делится на два упорядоченных подмножества:
- — основная очередь
- — срочная очередь
- — вершины, расстояние до которых не вычисленно
Изначально все вершины, кроме
помещаются в множество . Вершина помещается в множество .
Шаг алгоритма: выбирается вершина из . Если подмножество не пусто, то вершина берется из него, иначе из . Далее, для каждого ребра :
- если , то переводится в конец очереди . При этом
- если , то происходит релаксация ребра
- если и , то происходит релаксация ребра и помещается в
В конце шага помещаем вершину
в множество .
Алгоритм заканчивает работу, когда множество становится пустым.
Псевдокод
for uV : .add(s) for u s V : .add(u) while : if : u .pop() else : u .pop() for uv E : if v : .push(v) relax(uv) if v : relax(uv) if v and : relax(uv) .push(v) .add(u)
Сложность
В худшем случае алгоритм Левита работает за
. Это происходит вследствие того, что некоторые вершины приходится обрабатывать повторно. Однако эксперементы показывают, что для реальных графов(например, карт дорог) данный алгоритм оказывается достаточно быстрым. Эксперементальная оценка данного алгоритма составляет .См. также
Источники
- Алгоритм Левита - Википедия, свободная энциклопедия
- Алгоритм Левита - MAXimal::algo
- И. В. Романовский, Дискретный анализ, ISBN 5-7940-0138-0; 2008 г., стр. 228-234.