stringtranslate.com

Алгоритм Борувки

Алгоритм Борувки — это жадный алгоритм поиска минимального остовного дерева в графе или минимального остовного леса в случае несвязного графа.

Впервые он был опубликован в 1926 году Отакаром Боровкой как метод построения эффективной электросети для Моравии . [1] [2] [3] Алгоритм был заново открыт Шоке в 1938 году; [4] снова Флореком, Лукасевичем , Перкалем, Штейнхаусом и Зубжицким в 1951 году; [5] и снова Жоржем Соллином в 1965 году. [6] Этот алгоритм часто называют алгоритмом Соллина , особенно в литературе по параллельным вычислениям .

Алгоритм начинается с поиска ребра минимального веса, инцидентного каждой вершине графа, и добавления всех этих ребер в лес. Затем он повторяет аналогичный процесс поиска ребра с минимальным весом от каждого построенного дерева к другому дереву и добавляет все эти ребра в лес. Каждое повторение этого процесса уменьшает количество деревьев в каждом связном компоненте графа не более чем до половины этого прежнего значения, поэтому после логарифмического количества повторений процесс завершается. Когда это происходит, набор добавленных ребер образует минимальный остовный лес.

Псевдокод

Следующий псевдокод иллюстрирует базовую реализацию алгоритма Борувки. В условных предложениях каждое ребро ув считается дешевле, чем «Нет». Цель заполненной переменной — определить, является ли лес F связующим лесом.

Если ребра не имеют различных весов, необходимо использовать последовательное правило разрешения конфликтов , например, основанное на некотором общем порядке вершин или ребер. Этого можно достичь, представляя вершины как целые числа и сравнивая их напрямую; сравнение их адресов памяти ; и т. д. Правило разрешения конфликтов необходимо для того, чтобы созданный граф действительно был лесом, то есть не содержал циклов. Например, рассмотрим треугольный граф с узлами { a , b , c } и всеми ребрами веса 1. Тогда цикл может быть создан, если мы выберем ab в качестве ребра минимального веса для { a }, bc для { b } и ca для { c }. Правило разрешения конфликтов, которое упорядочивает ребра сначала по источнику, а затем по назначению, предотвратит создание цикла, что приведет к минимальному связующему дереву { ab , bc }.

Алгоритм Борувки на  входе: Взвешенный неориентированный граф G = ( V , E ). вывод:  F , минимальный остовный лес G . Инициализируйте лес F как ( V , E' ), где E' = {}. завершено  := false,  пока не завершено.  do Найдите компоненты связности F и назначьте каждой вершине ее компонент. Инициализируйте самое дешевое преимущество для каждого компонента как «Нет». для каждого ребра uv в E , где u и v находятся в разных компонентах F : пусть wx будет самым дешевым ребром для компонента u  , если is-preferred-over( uv , wx ) , затем Установите uv как самое дешевое ребро для компонента u , пусть yz будет самым дешевым ребром для компонента v  , если is-preferred- over( uv , yz ) then Set uv как самое дешевое ребро для компонента v  , если для всех компонентов самое дешевое ребро установлено на «Нет», тогда  // больше нельзя объединять деревья — мы закончили  завершено  := true  else  завершено  : = false  для каждого компонента, у которого самое дешевое ребро не «Нет». Добавить его самое дешевое ребро к E'функция is-preferred-over( Edge1 , Edge2 ) возвращается ( Edge2 имеет значение «Нет») или (вес( край1 ) < вес( край2 )) или (вес( ребро1 ) = вес( ребро2 ) и правило разрешения конфликтов ( ребро1 , ребро2 ))функция -правило разрешения конфликтов ( edge1 , Edge2 )  правило разрешения конфликтов; возвращает true тогда и только тогда, когда край1 предпочтительнее края2 в случае ничьей.

В качестве оптимизации можно удалить из G каждое ребро, соединяющее две вершины в одном и том же компоненте, чтобы это не тратило время на поиск самых дешевых ребер в более поздних компонентах.

Сложность

Можно показать, что алгоритм Борувки выполняет O (log V ) итераций внешнего цикла до тех пор, пока он не завершится, и, следовательно, работает за время O ( E log V ) , где E — количество ребер, а V — количество вершин в G (при условии, что EV ). В плоских графах и, в более общем плане, в семействах графов, замкнутых с помощью второстепенных операций над графом, его можно заставить работать за линейное время, удаляя все ребра, кроме самого дешевого, между каждой парой компонентов после каждого этапа алгоритма. [7]

Пример

Другие алгоритмы

Другие алгоритмы решения этой задачи включают алгоритм Прима и алгоритм Краскала . Быстрые параллельные алгоритмы можно получить, объединив алгоритм Прима с алгоритмом Борувки. [8]

Более быстрый рандомизированный алгоритм минимального остовного дерева, частично основанный на алгоритме Борувки Каргера, Кляйна и Тарьяна, работает за ожидаемое время O( E ) . [9] Самый известный (детерминированный) алгоритм минимального остовного дерева Бернара Шазеля также частично основан на алгоритме Борувки и работает за время O( E α( E , V )) , где α — обратная функция Аккермана . [10] Эти рандомизированные и детерминированные алгоритмы сочетают в себе шаги алгоритма Борувки, уменьшающие количество компонентов, которые осталось соединить, с шагами другого типа, которые уменьшают количество ребер между парами компонентов.

Примечания

  1. ^ Борувка, Отакар (1926). «О jistém problému minimálním» [О некоторой минимальной проблеме]. Праче Мор. Прширодовед. ООО V Brně III (на чешском и немецком языках). 3 : 37–58.
  2. ^ Борувка, Отакар (1926). «Вклад в решение проблемы экономичного строительства электрических сетей». Электроницкий обзор (на чешском языке). 15 : 153–154.
  3. ^ Нешетржил, Ярослав ; Милькова, Ева; Нешетрилова, Елена (2001). «Отакар Борувка о проблеме минимального остовного дерева: перевод обеих статей 1926 года, комментарии, история». Дискретная математика . 233 (1–3): 3–36. дои : 10.1016/S0012-365X(00)00224-7. hdl : 10338.dmlcz/500413 . МР  1825599.
  4. ^ Шоке, Гюстав (1938). «Этюд определенных маршрутов». Comptes Rendus de l'Académie des Sciences (на французском языке). 206 : 310–313.
  5. ^ Флорек, К.; Лукашевич Ю .; Перкаль, Дж.; Штайнхаус, Хьюго ; Зубжицкий, С. (1951). «Связь и разделение конечных точек ансамбля». Коллоквиум Mathematicum (на французском языке). 2 (3–4): 282–285. дои : 10,4064/см-2-3-4-282-285. МР  0048832.
  6. ^ Соллен, Жорж (1965). «След канализации». Программирование, игры и транспортные сети (на французском языке).
  7. ^ Эппштейн, Дэвид (1999). «Накидные деревья и гаечные ключи». В Саке Ж.-Р. ; Уррутия, Дж. (ред.). Справочник по вычислительной геометрии . Эльзевир. стр. 425–461.; Мареш, Мартин (2004). «Два алгоритма с линейным временем для MST на второстепенных классах замкнутых графов» (PDF) . Архив Математикум . 40 (3): 315–320..
  8. ^ Бадер, Дэвид А.; Конг, Гоцзин (2006). «Быстрые алгоритмы с общей памятью для вычисления минимального остовного леса разреженных графов». Журнал параллельных и распределенных вычислений . 66 (11): 1366–1378. CiteSeerX 10.1.1.129.8991 . дои : 10.1016/j.jpdc.2006.06.001. S2CID  2004627. 
  9. ^ Каргер, Дэвид Р.; Кляйн, Филип Н.; Тарьян, Роберт Э. (1995). «Рандомизированный алгоритм линейного времени для поиска минимальных остовных деревьев». Журнал АКМ . 42 (2): 321–328. CiteSeerX 10.1.1.39.9012 . дои : 10.1145/201019.201022. S2CID  832583. 
  10. ^ Шазель, Бернар (2000). «Алгоритм минимального остовного дерева со сложностью типа, обратной Аккерману» (PDF) . Дж. АКМ . 47 (6): 1028–1047. CiteSeerX 10.1.1.115.2318 . дои : 10.1145/355541.355562. S2CID  6276962.