Алгоритм Левита — различия между версиями
Lehanyich (обсуждение | вклад) (→Сложность) |
|||
Строка 1: | Строка 1: | ||
+ | {| class="wikitable" align="center" style="color: red; background-color: black; font-size: 56px; width: 800px;" | ||
+ | |+ | ||
+ | |-align="center" | ||
+ | |'''НЕТ ВОЙНЕ''' | ||
+ | |-style="font-size: 16px;" | ||
+ | | | ||
+ | 24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян. | ||
+ | |||
+ | Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием. | ||
+ | |||
+ | Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей. | ||
+ | |||
+ | Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить. | ||
+ | |||
+ | ''Антивоенный комитет России'' | ||
+ | |-style="font-size: 16px;" | ||
+ | |Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению. | ||
+ | |-style="font-size: 16px;" | ||
+ | |[https://meduza.io/ meduza.io], [https://www.youtube.com/c/popularpolitics/videos Популярная политика], [https://novayagazeta.ru/ Новая газета], [https://zona.media/ zona.media], [https://www.youtube.com/c/MackNack/videos Майкл Наки]. | ||
+ | |} | ||
+ | |||
'''Алгоритм Левита''' (англ. ''Levit's algorithm'') находит расстояние от заданной вершины <tex>s</tex> до всех остальных. Позволяет работать с ребрами отрицательного веса при отсутствии отрицательных циклов. | '''Алгоритм Левита''' (англ. ''Levit's algorithm'') находит расстояние от заданной вершины <tex>s</tex> до всех остальных. Позволяет работать с ребрами отрицательного веса при отсутствии отрицательных циклов. | ||
Версия 07:11, 1 сентября 2022
НЕТ ВОЙНЕ |
24 февраля 2022 года российское руководство во главе с Владимиром Путиным развязало агрессивную войну против Украины. В глазах всего мира это военное преступление совершено от лица всей страны, всех россиян. Будучи гражданами Российской Федерации, мы против своей воли оказались ответственными за нарушение международного права, военное вторжение и массовую гибель людей. Чудовищность совершенного преступления не оставляет возможности промолчать или ограничиться пассивным несогласием. Мы убеждены в абсолютной ценности человеческой жизни, в незыблемости прав и свобод личности. Режим Путина — угроза этим ценностям. Наша задача — обьединить все силы для сопротивления ей. Эту войну начали не россияне, а обезумевший диктатор. И наш гражданский долг — сделать всё, чтобы её остановить. Антивоенный комитет России |
Распространяйте правду о текущих событиях, оберегайте от пропаганды своих друзей и близких. Изменение общественного восприятия войны - ключ к её завершению. |
meduza.io, Популярная политика, Новая газета, zona.media, Майкл Наки. |
Алгоритм Левита (англ. Levit's algorithm) находит расстояние от заданной вершины
до всех остальных. Позволяет работать с ребрами отрицательного веса при отсутствии отрицательных циклов.Алгоритм
Пусть
— текущая длина кратчайшего пути до вершины . Изначально, все элементы , кроме -го равны бесконечности; .Разделим вершины на три множества:
- — вершины, расстояние до которых уже вычислено (возможно, не окончательно),
- очереди: — вершины, расстояние до которых вычисляется. Это множество в свою очередь делится на две
- — основная очередь,
- — срочная очередь;
- — вершины, расстояние до которых еще не вычислено.
Изначально все вершины, кроме
помещаются в множество . Вершина помещается в множество (в любую из очередей).Шаг алгоритма: выбирается вершина
из . Если очередь не пуста, то вершина берется из нее, иначе из . Для каждого ребра возможны три случая:- , то переводится в конец очереди . При этом (производится релаксация ребра ),
- , то происходит релаксация ребра ,
- . Если при этом , то происходит релаксация ребра и вершина помещается в ; иначе ничего не делаем.
В конце шага помещаем вершину
в множество .Алгоритм заканчивает работу, когда множество
становится пустым.Псевдокод
Для хранения вершин используем следующие структуры данных:
- хеш-таблица, —
- очереди, — основная и срочная
- хеш-таблица. —
for.push( ) for and .add( ) while and .pop() .pop() for if .push( ) .remove( ) min( ) else if min( ) else if and .push( ) .remove( ) .add( )
Доказательство
Лемма: |
Алгоритм отработает за конечное время |
Доказательство: |
Не теряя общности, будем считать, что граф связен. Тогда алгоритм завершит работу, когда в | окажутся все вершины. Так как в исходном графе нет отрицательных циклов, то для каждой вершины существует кратчайший путь. Тогда расстояние до каждой вершины может уменьшится только конечное число раз и, как следствие, вершина будет переведена из в тоже конечное число раз. С другой стороны, на каждом шаге текущая вершина гарантированно помещается в . Тогда за конечное число шагов все вершины окажутся в .
Лемма: |
В конце работы алгоритма не найдется такое ребро , что его релаксация будет успешной |
Доказательство: |
Предположим обратное. Тогда рассмотрим 2 случая:
|
Из двух предыдущих лемм напрямую следует корректность алгоритма.
Сложность
При неправильной реализации алгоритма, используя вместо очередей дек и добавляя вершины из в начало дека, алгоритм в худшем случае будет работать за экспоненциальное время, так делать не рекомендуется.
иВ плохих случаях алгоритм Левита работает за лексикографическом порядке:
. Рассмотрим полный граф с вершинами и такими рёбрами, идущими в- для всех вершин вес ребра , т.е. количество вершин между и ; ,
- ребро веса ,
- для всех вершин вес ребра ; от до вершины расстояние равно .
Ясно, что кратчайший путь до каждой вершины равен Форда Беллмана и не многим уступает алгоритму Дейкстры.
, но в плохом случае алгоритм при подсчёте вершины будет пересчитывать все вершины до неё (кроме первой). На шаге в очередь положат вершины от до , причём вершину из больше не достанут. На следующем шаге добавлений не произойдёт, так как вершины больше уже в очереди. На шаге алгоритм улучшит расстояние до вершины на (что видно из веса рёбер и , равных и соответственно), так что её добавят в и обработают на шаге (релаксаций не происходит). На следующем шаге из обычной очереди достанут вершину , расстояние до неё, равное , на меньше, чем расстояние до и вершин. Их добавят в срочную очередь, но так как , то после подсчёта вершины вершину снова добавят в . Затем дойдёт очередь до вершины , что вызовет релаксацию предыдущих вершин , затем прорелаксируют вершины , и после вершина . Аналогично будут происходить релаксации всех вершин при обработке вершины из очереди . Таким образом, вершину будут добавлять в срочную очередь раз (добавление вершин из очереди с номером больше ) количество добавлений "старшей" вершины . Количество добавлений вершины составит , а сумма всех добавлений примерно составит . При обработке каждой вершины приходится обходить ребер, что даёт оценку . Однако, на реальных графах алгоритм Левита работает быстрее, чем алгоритмСм. также
- Алгоритм A*
- Алгоритм Дейкстры
- Алгоритм Джонсона
- Алгоритм Флойда
- Алгоритм Форда-Беллмана
- Обход в ширину
Источники информации
- Википедия — Алгоритм Левита
- MAXimal :: algo :: Алгоритм Левита
- И. В. Романовский, Дискретный анализ, ISBN 5-7940-0138-0; 2008 г., 4 издание, стр. 229-231.