Czy istnieje algorytm online do śledzenia komponentów na zmieniającym się niekierowanym wykresie?

12

Problem

Mam nieukierunkowany wykres (z wieloma krawędziami), który z czasem się zmieni, węzły i krawędzie można wstawiać i usuwać. Przy każdej modyfikacji wykresu muszę aktualizować połączone elementy tego wykresu.

Nieruchomości

Dodatkowe właściwości polegają na tym, że żadne dwa składniki nigdy nie zostaną ponownie połączone. Oczywiście wykres może mieć dowolne cykle (w przeciwnym razie rozwiązanie byłoby trywialne). Jeśli krawędź nie zawiera węzła n , nigdy nie przyjmie tego węzła. Jednak jeśli n e , może zmienić się na n e .minnminmi

Podejścia

Do tej pory mam dwa możliwe podejścia, ale jak zobaczycie, są one okropne:

Powolny bez stanu

Mogę za każdym razem przeszukiwać (dfs / bfs) wykres, zaczynając od zmodyfikowanych elementów. Oszczędza to miejsce, ale jest wolne, ponieważ dla każdej modyfikacji mamy O (n + m).

Podejście stanowe szybkie (-er) (?)

Mogę przechowywać wszystkie możliwe ścieżki dla każdego węzła do wszystkich możliwych węzłów, ale jeśli zobaczę to poprawnie, zajmie to pamięć O (n ^ 4). Ale nie jestem pewien, jak poprawia się środowisko wykonawcze (jeśli w ogóle istnieje, ponieważ muszę aktualizować informacje dla każdego węzła w tym samym komponencie).

Pytanie

Czy masz jakieś wskazówki, w jaki sposób mogę dowiedzieć się więcej na temat tego problemu lub może algorytmów, na których mogę bazować?

Uwaga

Jeśli nastąpiłaby znaczna poprawa czasu wykonywania / pamięci, mógłbym żyć z nieoptymalnym rozwiązaniem, które czasami mówi, że dwa składniki są jednym, ale oczywiście wolałbym optymalne rozwiązanie.

maska ​​bitowa
źródło
Jeśli dobrze przeczytałem ostatnie dwa zdania w „Właściwościach”, wydaje się, że interesuje Cię tylko problem dekrementacji. Jeśli tak, koniecznie zapoznaj się z pracą Thorup na temat malejącej dynamicznej łączności. (Cytat można znaleźć za pomocą wskaźników JeffE, które dotyczą w pełni dynamicznej wersji problemu.)
Maverick Woo
@Maverick Woo: Zawsze mogą istnieć nowe krawędzie / węzły. Myślę, że ostatnia właściwość nie jest bardzo silna, właśnie z tego powodu. Czy nadal kwalifikuje się jako malejący?
maska ​​bitowa
Ups, nie wiem, jak przeoczyłem pierwsze zdanie ... Zobacz „odpowiedź” poniżej.
Maverick Woo

Odpowiedzi:

17

Istnieje kilka struktur danych, które obsługują wstawianie krawędzi, usuwanie krawędzi i zapytania dotyczące łączności (czy te dwa wierzchołki są w tym samym połączonym składniku?) W czasie polilogarytmicznym.

Jeffε
źródło
Brzmi niesamowicie, kiedy przejrzę gazety, najprawdopodobniej to zaakceptuję.
maska ​​bitowa
6

Myślę, że szukasz algorytmu grafu dynamicznego do dekompozycji połączonych komponentów. Algorytm Holma, de Lichtenberga i Thorupa [HLT01] ma amortyzowany czas polilogarytmiczny przy każdej aktualizacji krawędzi. Dawno nie patrzyłem na ten problem już dawno, więc prawdopodobnie postęp jest bardziej aktualny.

[HLT01] Jacob Holm, Kristian de Lichtenberg i Mikkel Thorup. Poli-logarytmiczne deterministyczne w pełni dynamiczne algorytmy dla łączności, minimalnego drzewa opinającego, 2-krawędziowego i biconnectivity. Journal of the ACM , 48 (4): 723–760, lipiec 2001. http://doi.acm.org/10.1145/502090.502095

Tsuyoshi Ito
źródło
Pech. Jesteś mi winien colę.
Jeffε
@JeffE: Nie wiedziałem o tej grze . Ale zgodnie z zasadami nie przegrałem gry (jestem po prostu w stanie „spartaczynia”), więc nie jestem ci winien coli, chyba że mówię dalej… och, poczekaj chwilę.
Tsuyoshi Ito
gdybyś tylko mógł wymienić punkty reputacji :)
Suresh Venkat
5

(Na razie pozwólcie, że pozostanę przy zapytaniach dotyczących łączności, które niestety mogą być niewystarczające dla twojej aplikacji).

Wiele wcześniejszych prac nad problemem dynamicznej łączności dotyczy modelu aktualizacji krawędzi: zakładasz, że liczba wierzchołków jest stała i możesz wstawiać i / lub usuwać krawędzie podczas tworzenia zapytań. Jeśli możesz tylko wstawić (usunąć), będzie to przyrostowe (malejące). Jeśli możesz zrobić jedno i drugie, jest to w pełni dynamiczne. Prace Thorupa, jak wskazał JeffE (i ja w komentarzu), są przeznaczone do aktualizacji krawędzi.

AFAIK, społeczność teorii CS dopiero zaczyna przyglądać się aktualizacjom wierzchołków dla ogólnych wykresów. Chan, Pătraşcu i Roditty przeprowadzili w FOCS 2008 przełomowe prace w tej sprawie. Zobacz ten link, aby zobaczyć najnowszą (wrzesień 2010 r.) Wersję i odnośniki do niej.

Maverick Woo
źródło
Jak myślisz, dlaczego Holm i in. glin. podejście nie działa w przypadku mojego problemu? Zamierzałem to adoptować.
maska ​​bitowa
1
Jeśli wykres ma określony stopień, to teoretycznie można emulować aktualizację wierzchołków za pomocą szeregu aktualizacji krawędzi. W przeciwnym razie pojedyncza aktualizacja wierzchołka (powiedzmy usunięcie środka wykresu gwiazdowego) może drastycznie zmienić łączność wykresu, w takim przypadku potrzebny jest wynik Chana i in.
Maverick Woo
Widzę. Powinienem był stwierdzić w pierwotnym pytaniu, że usuwanie wierzchołków jest rzadkie, więc mogę sobie pozwolić na robienie tego od krawędzi do krawędzi.
maska ​​bitowa