Алгоритм Краскала — различия между версиями
(→Задача о максимальном ребре минимального веса) |
(→Задача о максимальном ребре минимального веса) |
||
Строка 16: | Строка 16: | ||
==Задача о максимальном ребре минимального веса== | ==Задача о максимальном ребре минимального веса== | ||
− | Очевидно, что максимальное ребро в MST минимально. Пусть это не так, тогда рассмотрим разрез, который оно пересекает. В этом разрезе должно быть ребро с меньшим весом, иначе максимальное ребро было бы минимальным, но в таком случае минимальный остов не является минимальным, следовательно, максимальное ребро в минимальном остовном дереве минимально. Если же максимальное ребро в остовном дереве минимально, то такое дерево может не быть минимальным. Зато его можно найти быстрее чем MST, а конкретно за <tex>O(E)</tex>. Алгоритм описанный ниже ищет максимальное ребро минимального веса, но по этому ребру можно достаточно просто построить остовное дерево. С помощью [[Поиск_k-ой_порядковой_статистики_за_линейное_время | алгоритма поиска k-ой порядковой статистики]] найдем ребро-медиану за <tex>O(E)</tex> и разделим множество ребер на два равных по мощности так, чтобы в первом подмножестве все ребра не превосходили ребро-медиану. Запустим [[Использование_обхода_в_глубину_для_проверки_связности|обход в глубину]], чтобы проверить образуют ли ребра из первого подмножества остов, иначе говоря связен ли этот подграф. Если да, то второе подмножество ребер можно " | + | Очевидно, что максимальное ребро в MST минимально. Пусть это не так, тогда рассмотрим разрез, который оно пересекает. В этом разрезе должно быть ребро с меньшим весом, иначе максимальное ребро было бы минимальным, но в таком случае минимальный остов не является минимальным, следовательно, максимальное ребро в минимальном остовном дереве минимально. Если же максимальное ребро в остовном дереве минимально, то такое дерево может не быть минимальным. Зато его можно найти быстрее чем MST, а конкретно за <tex>O(E)</tex>. Алгоритм описанный ниже ищет максимальное ребро минимального веса, но по этому ребру можно достаточно просто построить остовное дерево. С помощью [[Поиск_k-ой_порядковой_статистики_за_линейное_время | алгоритма поиска k-ой порядковой статистики]] найдем ребро-медиану за <tex>O(E)</tex> и разделим множество ребер на два равных по мощности так, чтобы в первом подмножестве все ребра не превосходили ребро-медиану, а во втором были не меньше его. Запустим [[Использование_обхода_в_глубину_для_проверки_связности|обход в глубину]], чтобы проверить образуют ли ребра из первого подмножества остов, иначе говоря связен ли этот подграф. Если да, то второе подмножество ребер можно "выкинуть", а от первого подмножества рекурсивно запустить алгоритм. В противном случае сконденсируем в супервершины получившиеся несвязные компоненты и рассмотрим граф с этими супервершинами и ребрами из второго подмножества. На последнем шаге алгоритм соединит две оставшихся компоненты — это и будет максимальное ребро минимального веса. На каждом шаге ребер становится в два раза меньше, следовательно, время работы алгоритма <tex>O(E+\frac{E}{2}+\frac{E}{4}+...+1)=O(E)</tex>. Чтобы восстановить остовное дерево, достаточно запустить алгоритм поиска в глубину и добавлять в остов только те ребра, которые не превосходят найденное алгоритмом ребро. |
==Пример== | ==Пример== |
Версия 15:42, 14 декабря 2014
Алгоритм Краскала (англ. Kruskal's algorithm) — алгоритм поиска минимального остовного дерева (англ. minimum spanning tree, MST) во взвешенном неориентированном связном графе.
Содержание
[убрать]Идея
Будем последовательно строить подграф разрез такой, что одна из компонент связности составляет одну его часть, а оставшаяся часть графа — вторую. Тогда и есть минимальное ребро, пересекающее этот разрез. Значит, из леммы о безопасном ребре следует, что можно продолжить до MST, поэтому добавим это ребро в . На последнем шаге ребро соединит две оставшиеся компоненты, это и будет минимальным остовным деревом.
Реализация
//— исходный граф // — минимальный остов // для проверки возможности добавления ребра используется система непересекающихся множеств function for if и в разных компонентах связности
Задача о максимальном ребре минимального веса
Очевидно, что максимальное ребро в MST минимально. Пусть это не так, тогда рассмотрим разрез, который оно пересекает. В этом разрезе должно быть ребро с меньшим весом, иначе максимальное ребро было бы минимальным, но в таком случае минимальный остов не является минимальным, следовательно, максимальное ребро в минимальном остовном дереве минимально. Если же максимальное ребро в остовном дереве минимально, то такое дерево может не быть минимальным. Зато его можно найти быстрее чем MST, а конкретно за алгоритма поиска k-ой порядковой статистики найдем ребро-медиану за и разделим множество ребер на два равных по мощности так, чтобы в первом подмножестве все ребра не превосходили ребро-медиану, а во втором были не меньше его. Запустим обход в глубину, чтобы проверить образуют ли ребра из первого подмножества остов, иначе говоря связен ли этот подграф. Если да, то второе подмножество ребер можно "выкинуть", а от первого подмножества рекурсивно запустить алгоритм. В противном случае сконденсируем в супервершины получившиеся несвязные компоненты и рассмотрим граф с этими супервершинами и ребрами из второго подмножества. На последнем шаге алгоритм соединит две оставшихся компоненты — это и будет максимальное ребро минимального веса. На каждом шаге ребер становится в два раза меньше, следовательно, время работы алгоритма . Чтобы восстановить остовное дерево, достаточно запустить алгоритм поиска в глубину и добавлять в остов только те ребра, которые не превосходят найденное алгоритмом ребро.
. Алгоритм описанный ниже ищет максимальное ребро минимального веса, но по этому ребру можно достаточно просто построить остовное дерево. С помощьюПример
Задан неориентированный связный граф, требуется построить в нём минимальное остовное дерево.
Создадим новый граф, содержащий все вершины из заданного графа, но не содержащий рёбер.
Этот новый граф будет ответом, в него будут добавлены рёбра из заданного графа по ходу выполнения алгоритма.
Отсортируем рёбра заданного графа по их весам и рассмотрим их в порядке возрастания.
Рёбра (в порядке их просмотра) | ae | cd | ab | be | bc | ec | ed |
Веса рёбер |
Асимптотика
Сортировка
Работа с системой непересекающихся множеств займет , где — обратная функция Аккермана, которая не превосходит 4 во всех практических приложениях и которую можно принять за константу.
Алгоритм работает за .
См. также
Источники информации
- Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн — Алгоритмы: построение и анализ, 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — 1296 с.: ил. — Парал. тит. англ. — ISBN 978-5-8459-0857-5 (рус.)
- Википедия — Функция Аккермана
- Википедия — Алгоритм Крускала
- Wikipedia — Kruskal's algorithm
- MAXimal :: algo :: Минимальное остовное дерево. Алгоритм Крускала