Как на производительность алгоритма Крускала влияет несвязанная структура данных набора?
У меня есть общее представление о том, что такое алгоритм Крускала, и вот что я обнаружил:
Этот алгоритм в основном строит минимальное остовное дерево путем объединения нескольких деревьев, и он начинает с сортировки ребер по их весам. Начиная с пустого подграфа, алгоритм сканирует список ребер, добавляя следующее ребро к подграфу, если он не создает цикл.
Где как непересекающееся множество - это структура данных, у которой на самом деле мало способов получить минимальное связующее дерево, используя метод связанных списков или лесных деревьев.
Что я хочу знать, так это то, как непересекающиеся множества влияют на производительность алгоритма Крускала? Любая помощь может быть оценена.
2 ответа
Структура данных "непересекающийся набор" важна для обеспечения общей сложности O(E*logE).
Давайте рассмотрим стандартный алгоритм kruskal.
KRUSKAL(G):
A = ∅
foreach v ∈ G.V:
MAKE-SET(v)
foreach (u, v) in G.E ordered by weight(u, v), increasing:
if FIND-SET(u) ≠ FIND-SET(v):
A = A ∪ {(u, v)}
UNION(u, v)
return A
Методы FIND-SET() и UNION() идентифицируют наборы (или леса) и объединяют их. Обе эти операции могут быть выполнены в O(1) со структурой данных "несвязный набор". Общая сложность для части FIND и UNION - O (E).
вместе мы имеем O(V) + O(E * logE) + O(E) = O(E * logE)
Следовательно, структура данных "непересекающийся набор" важна для обеспечения общей сложности O(E*logE).
Алгоритм Крускала сначала сортирует ребра. Это можно сделать в O(E*log(E)) = O(E*log(V^2)) = O(E*2*log(V)) = O(E*log(V))
время.
Затем перебирает края и выполняет O(E)
несвязанные-заданные операции структуры данных (2
найти и возможно 1
объединение на каждой итерации). Сложность операций зависит от реализации несвязанного множества. Наивная реализация имеет O(V)
операция по объединению и O(1)
найти операцию. Это ведет к O(E + V^2)
время, потому что операция объединения будет выполнена не более V
раз, но даже с лесом несвязных множеств с объединением по рангу сложность обеих операций O(log(V))
(может быть O(α(V))
с добавлением пути сжатия).
Таким образом, алгоритм Крускала с наивной реализацией структуры данных с несвязным множеством:O(E*log(V)) + O(E + V^2) = O(E*log(V) + V^2)
(в достаточно редких графиках доминирует второй член)
реализация, которая имеет по крайней мере объединение по рангу:O(E*log(V)) + O(E*log(V)) = O(E*log(V))