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

Метод нахождения минимальных остовных деревьев
Алгоритм Борувки
Анимация алгоритма Борувки
СортАлгоритм минимального остовного дерева
Структура данныхГрафик
Худший вариант производительности О ( | Э | бревно | В | ) {\displaystyle O(|E|\log |V|)}

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

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

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

Псевдокод

Следующий псевдокод иллюстрирует базовую реализацию алгоритма Борувки. В условных предложениях каждое ребро uv считается более дешевым, чем "None". Целью завершенной переменной является определение того, является ли лес 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  if is-preferred-over( uv , wx ) then Установить uv как самое дешевое ребро для компонента u let yz будет самым дешевым ребром для компонента v  if is-preferred-over( uv , yz ) then Установить uv как самое дешевое ребро для компонента v  if all components has cheap edge set to "None" then  // больше деревьев нельзя объединить — мы закончили done  :  = true  else  complete  := false  для каждого компонента, самое дешевое ребро которого не равно "None" do Добавить его самое дешевое ребро к E'функция is-preferred-over( edge1 , edge2 ) возвращает ( edge2 is "None") или (вес( ребро1 ) < вес( ребро2 )) или (вес( ребро1 ) = вес( ребро2 ) и правило-разрешения-ничьи( ребро1 , ребро2 ))function tie-breaking-rule( edge1 , edge2 ) — это правило разрешения конфликтов; возвращает значение true тогда и только тогда, когда в случае конфликта конфликтующих сторон конфликтующее положение конфликтующих сторон предпочтительнее конфликта конфликтующих сторон .

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

Сложность

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

Пример

ИзображениекомпонентыОписание
{А} {
Б
} {В}
{Г}
{Д}
{Е}
{Ж}
Это наш исходный взвешенный граф. Числа около ребер указывают их вес. Изначально каждая вершина сама по себе является компонентом (синие кружки).
{А,Б,Г,Е}
{С,Д,Ж}
В первой итерации внешнего цикла добавляется минимальное ребро веса из каждого компонента. Некоторые ребра выбираются дважды (AD, CE). Остается два компонента.
{А,Б,В,Г,Д,Е,Ж}Во второй и последней итерации добавляется минимальное ребро веса из каждого из двух оставшихся компонентов. Это одно и то же ребро. Остается один компонент, и мы закончили. Ребро BD не рассматривается, поскольку обе конечные точки находятся в одном компоненте.

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

Другие алгоритмы для этой задачи включают алгоритм Прима и алгоритм Крускала . Быстрые параллельные алгоритмы могут быть получены путем объединения алгоритма Прима с алгоритмом Борувки. [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). «Охватывающие деревья и остовные элементы». В Сэк, Дж.-Р .; Уррутия, Дж. (ред.). Справочник по вычислительной геометрии . Elsevier. С. 425–461.; Мареш, Мартин (2004). «Два алгоритма с линейным временем для MST на второстепенных классах замкнутых графов» (PDF) . Архив Математикум . 40 (3): 315–320..
  8. ^ Бадер, Дэвид А.; Конг, Гоцзин (2006). «Быстрые алгоритмы с общей памятью для вычисления минимального остовного леса разреженных графов». Журнал параллельных и распределенных вычислений . 66 (11): 1366–1378. CiteSeerX 10.1.1.129.8991 . doi :10.1016/j.jpdc.2006.06.001. S2CID  2004627. 
  9. ^ Каргер, Дэвид Р.; Кляйн, Филип Н.; Тарьян, Роберт Э. (1995). «Рандомизированный линейный алгоритм поиска минимальных остовных деревьев». Журнал ACM . 42 (2): 321–328. CiteSeerX 10.1.1.39.9012 . doi :10.1145/201019.201022. S2CID  832583. 
  10. ^ Шазелл, Бернар (2000). «Алгоритм минимального остовного дерева со сложностью обратного типа Аккермана» (PDF) . J. ACM . 47 (6): 1028–1047. CiteSeerX 10.1.1.115.2318 . doi :10.1145/355541.355562. S2CID  6276962. 
Взято с "https://en.wikipedia.org/w/index.php?title=Borůvka%27s_algorithm&oldid=1250833278"