11.5 Implementace Kruskalova algoritmu
Definice 11.3 (Struktura Union-Find)
Struktura Union-Find
Struktura Union-Find reprezentuje rozklad množiny objektů \(X\) a podporuje operace:
- Init(\(X\)) vytvoří strukturu, ve které je každý element z \(X\) ve vlastní množině.
- Find(\(u\)) vrátí identifikátor množiny obsahující element \(u\).
- Union(\(u,v\)) sjednotí množiny obsahující prvky \(u\) a \(v\) (pokud jsou ze stejné množiny, struktura zůstane nezměněná).
Algoritmus 11.3 Implementace Kruskalova algoritmu s Union-Find
Algoritmus Kruskal s Union-Find
Vstup
Souvislý graf G s vahami na hranách
Výstup
Kostra T s minimální váhou
Idea
- Kruskalův algoritmus musí nejprve seřadit hrany. Na to použijeme pochopitelně optimální řadící algoritmus.
- Začne s lesem izolovaných vrcholů a testuje postupně hrany, zda jejich vrcholy leží ve dvou různých stromových komponentách lesa a pokud ano, spojí tyto komponenty pomocí této hrany do větší.
- To vede na využití struktury Union-Find
- Struktura Union-Find reprezentuje komponenty souvislosti akuálního grafu a operace pak speciálně jsou:
- Init(\(V\)) založíme strukturu – každý vrchol je v samostatné komponentě.
- Find(\(u\)) vrátí identifikátor komponenty, ve které leží vrchol \(u\).
- Pokud pro testovanou hranu \(\{u,v\}\) platí, že \(u\) a \(v\) patří do různých komponent (tj. Find\((u)\ne\)Find\((v)\)), pak Union(\(u,v\)) tyto komponenty spojí do jedné (přidáme \(\{u,v\}\) do konstruované kostry).
Algoritmus
Algoritmus MinKostraKruskal(G = (V, E), w: E → R): | |
---|---|
Časová složitost Kruskalova algoritmu
- Připomeňme, že \(n = |V|\) a \(m = |E|\).
- Řazení hran trvá \(O(m \log m) = O(m \log {n^2}) = O(m \log n)\).
- Zbytek algoritmu testuje hrany pomocí operace Find a spojuje menší stromy do větších stromů pomocí operace Union.
Věta 11.7 (o časové složitosti Kruskalova algoritmu)
Kruskalův algoritmus vytvoří minimální kostru v čase \(O(m \log n + T_i(n) + m \cdot T_f(n) + n \cdot T_u(n))\), kde \(T_i(n), T_f(n)\) a \(T_u(n)\) jsou časové složitosti operací Init, Find a Union v Union-Find struktuře nad množinou velikosti \(n\).
Důkaz věty 11.7
Založí strukturu Union-Find. Při testování hran se nejvýše 2m-krát zavolá Find a (n − 1)-krát se zavolá Union.