Czy ta gęsta wersja algorytmu Kruskala jest dobrze znana?


15

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 O(mlog⁡m) (bez zakładania wstępnie posortowanych krawędzi). Konkretnie, osiągamy Θ(n2)) 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 komponentu ima najlżejsze uderzenie krawędzi przecinającej komponent i.

  • Znajdując najlżejszą krawędź przecinającą partycje, po prostu znajdź, iktóra minimalizuje wagę dist[i]w czasie liniowym.

  • dojadojotZAZAja,k=min{ZAja,k,ZAjot,k}kjajot

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.n-1Θ(n2))

Czy ta wersja Kruskala jest dobrze znana w literaturze?

Odpowiedzi:


19

Nie jestem pewien co do tej konkretnej metody osiągania czasu , ale dwie różne metody przeprowadzania Kruskala w czasie podane są w moim artykule „Szybkie grupowanie hierarchiczne i inne zastosowania dynamicznych najbliższych par „(SODA 1998, arXiv: cs.DS / 9912014 i J. Experimental Algorithms 2000):O(n2))O(n2))

  1. Zamiast tego użyj Prim – Dijkstra – Jarník, a następnie posortuj krawędzie, aby uzyskać sekwencję wstawiania, którą dałby Kruskal, lub

  2. Użyj struktury danych z najbliższej pary z czterema drzewami opisanej w artykule, traktując Kruskala jako standardową procedurę skupiania aglomeracyjnego, w której na każdym etapie łączymy dwie najbliższe klastry w supergromadę, przy czym „najbliższa” jest definiowana jako długość najkrótszej krawędzi łączącej dwa klastry .

Rozwiązanie 2 jest podobne w duchu do tego, co opisujesz, ale szczegóły dotyczące śledzenia odległości między klastrami są nieco inne. Zachowujesz rzędy minimów macierzy odległości klastra, pozwalając ci zeskanować tę listę minimów wierszy w czasie liniowym, aby znaleźć globalne minimum, podczas gdy mój papier nakłada się na czworokąt na tej samej macierzy i śledzi minimum w każdym kwadratowy kwadrat. Twoja metoda jest prostsza, ale mniej elastyczna w przypadku niektórych innych dynamicznych problemów z najbliższymi parami (zależy to od tego, że połączenie dwóch klastrów powoduje zmniejszenie ich odległości do innych klastrów, co prawda w przypadku tego problemu, ale niekoniecznie w przypadku innych).

Jak napisałem w 2011 r. W artykule w Wikipedii na temat algorytmu łańcucha najbliższego sąsiada , algorytm ten można również wykorzystać do wykonania Kruskala w czasie . Jednak (w przeciwieństwie do innych aplikacji algorytmu łańcucha najbliższego sąsiada) nie uzyskuje się oszczędności miejsca, więc (podobnie jak metoda quadtree i twoja metoda) przestrzeń jest nadal . W przeciwieństwie do sortowania Prim +, można użyć tylko miejsca poza miejscem potrzebnym do przechowywania danych wejściowych.O(n2))O(n2))O(n)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.