Mniej więcej rok temu razem z przyjacielem zastanawialiśmy się, jak zaimplementować algorytm Kruskala dla gęstych wykresów w lepszej niż zwykle granicy (bez zakładania wstępnie posortowanych krawędzi). Konkretnie, osiągamy we wszystkich przypadkach, podobnie jak Prim, gdy implementujemy je za pomocą macierzy sąsiedztwa.
Na blogu opublikowałem trochę informacji o algorytmie, w tym kod C ++ i testy porównawcze, ale oto ogólny pomysł:
Utrzymaj jeden reprezentatywny węzeł dla każdego podłączonego komponentu. Początkowo wszystkie węzły reprezentują siebie.
Zachowaj wektor
dist[i]
taki, że dla każdego komponentui
ma najlżejsze uderzenie krawędzi przecinającej komponenti
.Znajdując najlżejszą krawędź przecinającą partycje, po prostu znajdź,
i
która minimalizuje wagędist[i]
w czasie liniowym.
Skurczenie najlżejszej krawędzi i znalezienie wspomnianej krawędzi można zatem wykonać w czasie liniowym. Robimy to razy, aby znaleźć MST. Potrzebna jest niewielka księgowość, aby znaleźć krawędź, którą chcemy dodać do MST, ale nie zwiększa to złożoności. Tak więc środowisko wykonawcze to . Implementacja to tylko kilka pętli.
Czy ta wersja Kruskala jest dobrze znana w literaturze?