Алгоритм Кинг — различия между версиями
(Первая версия статьи) |
м (rollbackEdits.php mass rollback) |
||
(не показано 7 промежуточных версий 2 участников) | |||
Строка 1: | Строка 1: | ||
{{в разработке}} | {{в разработке}} | ||
− | '''Алгоритм Кинг''' {{---}} | + | '''Алгоритм Кинг''' {{---}} алгоритм, предложенный Валери Кинг (''англ. Valerie King''), позволяющий свести проверку минимальности [[Лемма о безопасном ребре#Необходимые определения |остовного дерева]] графа к случаю полного ветвящегося дерева. Данное вспомогательное дерево может быть использовано в частном случае [[Алгоритм Комлоса| алгоритма Комлоса]], для которого также была предложена эффективная реализация, позволяющая выполнить проверку минимальности за линейное время. Алгоритм имеет линейную сложность, что является преимуществом по сравнению с ранними подходами<ref name="tarjan">Tarjan, R.E., 1979. Applications of path compression on balanced trees. Journal of the ACM (JACM), 26(4), pp.690-715.</ref><ref name="drt">B. Dixon, M. Rauch, and R. Tarjan, Verification and sensitivity analysis of minimum spanning trees in linear time,SIAM J. Comput.,21(6) (1992), 1184–1192.</ref><ref name="komlos">Komlós, J. Linear verification for spanning trees. Combinatorica 5, 57–65 (1985). https://doi.org/10.1007/BF02579443</ref>. |
== Описание алгоритма == | == Описание алгоритма == | ||
− | Пусть <math>T = (V_T, E_T)</math> {{---}} остовное дерево неориентированного взвешенного графа <math>G = (V_G, E_G) | + | Пусть <math>T = (V_T, E_T)</math> {{---}} остовное дерево неориентированного взвешенного графа <math>G = (V_G, E_G)</math>. |
− | + | Проверка минимальности остовного дерева заключается в проверке [[Критерий Тарьяна минимальности остовного дерева|критерия Тарьяна]]: | |
{{Утверждение | {{Утверждение | ||
|statement= | |statement= | ||
− | Остовное дерево является минимальным тогда и только тогда, когда вес любого ребра графа <math> | + | Остовное дерево является минимальным тогда и только тогда, когда вес любого ребра графа, соединяющего вершины <math>u</math> и <math>v</math>, не входящего в остовное дерево, больше либо равен весу ребра, имеющего максимальный вес среди ребер входящих в путь между <math>u</math> и <math>v</math> в остовном дереве. |
}} | }} | ||
Используем следующие обозначения: | Используем следующие обозначения: | ||
+ | * <math>\{u, v\}</math> {{---}} ребро, соединяющее вершины <math>u</math> и <math>v</math>, | ||
* <math>T(u, v)</math> {{---}} множество рёбер, входящих в путь между вершинами <math>u, v</math> в дереве <math>T</math>, | * <math>T(u, v)</math> {{---}} множество рёбер, входящих в путь между вершинами <math>u, v</math> в дереве <math>T</math>, | ||
* <math>w(e)</math> {{---}} вес ребра <math>e</math>, | * <math>w(e)</math> {{---}} вес ребра <math>e</math>, | ||
Строка 17: | Строка 18: | ||
=== Построение вспомогательного дерева === | === Построение вспомогательного дерева === | ||
− | Алгоритм строит вспомогательное дерево <math>B = (V_B, E_B)</math>, являющееся подвешенным и полным ветвящимся (такое дерево, у вершин которого либо 0, либо 2 и более | + | Алгоритм строит вспомогательное дерево <math>B = (V_B, E_B)</math>, являющееся подвешенным и полным ветвящимся (такое дерево, у вершин которого либо 0, либо 2 и более потомков, и в котором все листья находятся на одном уровне), для которого будет выполняться следующее: <math>w(Heavy(B, u, v)) = w(Heavy(T, u, v))</math> для любой пары вершин <math>u, v \in V_T</math>. Построение дерева <math>B</math> основано на [[Алгоритм Борувки|алгоритме Борувки]]. При инициализации алгоритма для каждой вершины <math>v \in T</math> создается лист <math>f(v)</math> в <math>B</math>. Пусть на некотором шаге алгоритма Борувки алгоритм объединяет множество деревьев <math>A</math> в одно дерево, обозначаемое <math>t</math>. При этом алгоритм выбирает некоторые рёбра с наименьшим весом, прилегающие к деревьям из множества <math>A</math>. Обозначим такое ребро для некоторого дерева <math>a \in A</math> как <math>adj(a)</math>. Тогда алгоритм создает новую вершину <math>f(t)</math> в <math>V_B</math> и добавляет новые рёбра в <math>E_B</math> как <math>\{\{f(t), f(a)\} | a \in A\}</math>. Каждому ребру <math>\{f(t), f(a)\}</math> присваивается вес выбранного алгоритмом Борувки ребра, т.е. <math>w(\{f(t), f(a)\}) := w(adj(a))</math>. |
Сложность каждой фазы алгоритма пропорциональна количеству рёбер, не выбранных ранее. Так как <math>T</math> является деревом, количество таких рёбер равно количеству деревьев на шаге алгоритма минус один. После каждой фазы количество деревьев сокращается как минимум вдвое, поэтому можно заключить, что построение дерева <math>B</math> имеет сложность <math>O(n)</math>. | Сложность каждой фазы алгоритма пропорциональна количеству рёбер, не выбранных ранее. Так как <math>T</math> является деревом, количество таких рёбер равно количеству деревьев на шаге алгоритма минус один. После каждой фазы количество деревьев сокращается как минимум вдвое, поэтому можно заключить, что построение дерева <math>B</math> имеет сложность <math>O(n)</math>. | ||
Строка 24: | Строка 25: | ||
|author=1 | |author=1 | ||
|statement= | |statement= | ||
− | Пусть <math>T = (V_T, E_T)</math> {{---}} остовное дерево графа, и <math>B = (V_B, E_B)</math> {{---}} дерево, построенное алгоритмом | + | Пусть <math>T = (V_T, E_T)</math> {{---}} остовное дерево графа, и <math>B = (V_B, E_B)</math> {{---}} дерево, построенное алгоритмом. Тогда для каждой пары вершин <math>x, y \in V_T</math>, <math>w(Heavy(T, x, y)) = w(Heavy(B, f(x), f(y)))</math>. |
|proof= | |proof= | ||
Вначале покажем, что для каждого ребра <math>e \in B(f(x), f(y))</math> существует ребро <math>e'\in T(x,y)</math> для которого верно <math>w(e) \leq w(e')</math>. | Вначале покажем, что для каждого ребра <math>e \in B(f(x), f(y))</math> существует ребро <math>e'\in T(x,y)</math> для которого верно <math>w(e) \leq w(e')</math>. | ||
− | Пусть <math>e = \{a, b\}</math> и, без потери общности, положим, что вершина <math>a</math> находится дальше от корня дерева <math>B</math>, чем <math>b</math>. Тогда <math>a = f(t)</math> для некоторого дерева <math>t</math>, построенного | + | Пусть <math>e = \{a, b\}</math> и, без потери общности, положим, что вершина <math>a</math> находится дальше от корня дерева <math>B</math>, чем <math>b</math>. Тогда <math>a = f(t)</math> для некоторого дерева <math>t</math>, построенного на некотором шаге алгоритма Борувки, которое содержит либо <math>x</math>, либо <math>y</math>, но не обе вершины одновременно. |
Пусть <math>e' \in T(x, y)</math> {{---}} ребро, содержащее ровно одно окончание в дереве <math>t</math>. Так как во время фазы, в которой производился выбор ребра для дерева <math>t</math>, была возможность выбрать ребро <math>e'</math>, его вес <math>w(e') \geq w(e)</math>, что и требовалось показать. | Пусть <math>e' \in T(x, y)</math> {{---}} ребро, содержащее ровно одно окончание в дереве <math>t</math>. Так как во время фазы, в которой производился выбор ребра для дерева <math>t</math>, была возможность выбрать ребро <math>e'</math>, его вес <math>w(e') \geq w(e)</math>, что и требовалось показать. | ||
Строка 39: | Строка 40: | ||
Предположим, что существует единственное ребро в <math>T(x, y)</math>, имеющее максимальный вес. Доказательство тривиально обобщается на случай нескольких рёбер с максимальным весом. | Предположим, что существует единственное ребро в <math>T(x, y)</math>, имеющее максимальный вес. Доказательство тривиально обобщается на случай нескольких рёбер с максимальным весом. | ||
− | Если ребро <math>e</math> было выбрано алгоритмом Борувки для дерева, которое содержит <math>x</math> или <math>y</math>, тогда ребру в <math>B(f(x), f(y))</math> был присвоен вес <math>w(e)</math>. Предположим обратное {{---}} ребро <math>e</math> было выбрано алгоритмом для дерева, не содержащего вершины <math>x</math> или <math>y</math>. Одно из окончаний ребра <math>e</math> находится в этом дереве, и данная вершина является промежуточной на пути из <math>x</math> в <math>y</math>. Следовательно, это ребро прилегает к двум другим рёбрам, находящимся на пути из <math>x</math> в <math>y</math>. Тогда среди этих | + | Если ребро <math>e</math> было выбрано алгоритмом Борувки для дерева, которое содержит <math>x</math> или <math>y</math>, тогда ребру в <math>B(f(x), f(y))</math> был присвоен вес <math>w(e)</math>. Предположим обратное {{---}} ребро <math>e</math> было выбрано алгоритмом для дерева, не содержащего вершины <math>x</math> или <math>y</math>. Одно из окончаний ребра <math>e</math> находится в этом дереве, и данная вершина является промежуточной на пути из <math>x</math> в <math>y</math>. Следовательно, это ребро прилегает к минимум двум другим рёбрам, находящимся на пути из <math>x</math> в <math>y</math>. Тогда среди этих рёбер <math>e</math> является ребром с наибольшим весом, которое не было выбрано, что является противоречием. |
}} | }} | ||
− | |||
− | |||
− | + | == Использование вспомогательного дерева == | |
− | + | Построенное вспомогательное дерево позволяет свести задачу проверки минимального остовного дерева к случаю полного ветвящегося дерева, что является частным случаем [[Алгоритм Комлоса#Случай полного ветвящегося дерева|алгоритма Комлоса]] верификации минимального остовного дерева. Кинг была предложена [[Алгоритм Комлоса#Эффективная реализация при помощи битового сжатия|эффективная реализация]] данного случая с использованием битового сжатия, позволяющая проверить минимальность остовного дерева со сложностью <math>O(|E_T|+|V_T|)</math>. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | # | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | == См. также == | ||
+ | * [[Алгоритм Комлоса]] | ||
+ | * [[Алгоритм Борувки]] | ||
+ | * [[Критерий Тарьяна минимальности остовного дерева]] | ||
== Источники информации == | == Источники информации == | ||
* King, V. A simpler minimum spanning tree verification algorithm. Algorithmica 18, 263–270 (1997). https://doi.org/10.1007/BF02526037 | * King, V. A simpler minimum spanning tree verification algorithm. Algorithmica 18, 263–270 (1997). https://doi.org/10.1007/BF02526037 | ||
Строка 78: | Строка 55: | ||
== Примечания == | == Примечания == | ||
<references/> | <references/> | ||
+ | |||
+ | [[Категория:Алгоритмы на графах]] | ||
+ | [[Категория:Построение остовных деревьев]] |
Текущая версия на 19:32, 4 сентября 2022
Алгоритм Кинг — алгоритм, предложенный Валери Кинг (англ. Valerie King), позволяющий свести проверку минимальности остовного дерева графа к случаю полного ветвящегося дерева. Данное вспомогательное дерево может быть использовано в частном случае алгоритма Комлоса, для которого также была предложена эффективная реализация, позволяющая выполнить проверку минимальности за линейное время. Алгоритм имеет линейную сложность, что является преимуществом по сравнению с ранними подходами[1][2][3].
Содержание
Описание алгоритма
Пусть критерия Тарьяна:
— остовное дерево неориентированного взвешенного графа . Проверка минимальности остовного дерева заключается в проверкеУтверждение: |
Остовное дерево является минимальным тогда и только тогда, когда вес любого ребра графа, соединяющего вершины и , не входящего в остовное дерево, больше либо равен весу ребра, имеющего максимальный вес среди ребер входящих в путь между и в остовном дереве. |
Используем следующие обозначения:
- — ребро, соединяющее вершины и ,
- — множество рёбер, входящих в путь между вершинами в дереве ,
- — вес ребра ,
- — ребро с максимальным весом на пути между вершинами в дереве .
Если найти
для всех , то для проверки минимальности остовного дерева достаточно сравнить и для всех рёбер .Построение вспомогательного дерева
Алгоритм строит вспомогательное дерево алгоритме Борувки. При инициализации алгоритма для каждой вершины создается лист в . Пусть на некотором шаге алгоритма Борувки алгоритм объединяет множество деревьев в одно дерево, обозначаемое . При этом алгоритм выбирает некоторые рёбра с наименьшим весом, прилегающие к деревьям из множества . Обозначим такое ребро для некоторого дерева как . Тогда алгоритм создает новую вершину в и добавляет новые рёбра в как . Каждому ребру присваивается вес выбранного алгоритмом Борувки ребра, т.е. .
, являющееся подвешенным и полным ветвящимся (такое дерево, у вершин которого либо 0, либо 2 и более потомков, и в котором все листья находятся на одном уровне), для которого будет выполняться следующее: для любой пары вершин . Построение дерева основано наСложность каждой фазы алгоритма пропорциональна количеству рёбер, не выбранных ранее. Так как
является деревом, количество таких рёбер равно количеству деревьев на шаге алгоритма минус один. После каждой фазы количество деревьев сокращается как минимум вдвое, поэтому можно заключить, что построение дерева имеет сложность .Теорема (1): | ||
Пусть — остовное дерево графа, и — дерево, построенное алгоритмом. Тогда для каждой пары вершин , . | ||
Доказательство: | ||
Вначале покажем, что для каждого ребра существует ребро для которого верно .Пусть и, без потери общности, положим, что вершина находится дальше от корня дерева , чем . Тогда для некоторого дерева , построенного на некотором шаге алгоритма Борувки, которое содержит либо , либо , но не обе вершины одновременно.Пусть — ребро, содержащее ровно одно окончание в дереве . Так как во время фазы, в которой производился выбор ребра для дерева , была возможность выбрать ребро , его вес , что и требовалось показать.Остается доказать следующее:
Предположим, что существует единственное ребро в Если ребро , имеющее максимальный вес. Доказательство тривиально обобщается на случай нескольких рёбер с максимальным весом. было выбрано алгоритмом Борувки для дерева, которое содержит или , тогда ребру в был присвоен вес . Предположим обратное — ребро было выбрано алгоритмом для дерева, не содержащего вершины или . Одно из окончаний ребра находится в этом дереве, и данная вершина является промежуточной на пути из в . Следовательно, это ребро прилегает к минимум двум другим рёбрам, находящимся на пути из в . Тогда среди этих рёбер является ребром с наибольшим весом, которое не было выбрано, что является противоречием. | ||
Использование вспомогательного дерева
Построенное вспомогательное дерево позволяет свести задачу проверки минимального остовного дерева к случаю полного ветвящегося дерева, что является частным случаем алгоритма Комлоса верификации минимального остовного дерева. Кинг была предложена эффективная реализация данного случая с использованием битового сжатия, позволяющая проверить минимальность остовного дерева со сложностью .
См. также
Источники информации
- King, V. A simpler minimum spanning tree verification algorithm. Algorithmica 18, 263–270 (1997). https://doi.org/10.1007/BF02526037
Примечания
- ↑ Tarjan, R.E., 1979. Applications of path compression on balanced trees. Journal of the ACM (JACM), 26(4), pp.690-715.
- ↑ B. Dixon, M. Rauch, and R. Tarjan, Verification and sensitivity analysis of minimum spanning trees in linear time,SIAM J. Comput.,21(6) (1992), 1184–1192.
- ↑ Komlós, J. Linear verification for spanning trees. Combinatorica 5, 57–65 (1985). https://doi.org/10.1007/BF02579443