Ukierunkowane znalezienie związku

11

Rozważ skierowany wykres na którym można dynamicznie dodawać krawędzie i tworzyć określone zapytania.G

Przykład: las rozłączny

Rozważ następujący zestaw zapytań:

arrow(u, v)
equiv(u, v)
find(u)

pierwszy dodaje strzałkę do wykresu, drugi decyduje, czy u v , ostatni znajduje kanoniczny reprezentant klasy równoważności , tj. r ( u ) taki, że u v implikuje r ( v ) = r ( u ) .uvuvr(u)uvr(v)=r(u)

Istnieje dobrze znany algorytm wykorzystujący rozłożoną strukturę danych lasu implementującą te zapytania w quasi-stałej amortyzacji złożoności, a mianowicie . Zauważ, że w tym przypadku jest implementowany za pomocą .O(α(n))equivfind

Bardziej złożony wariant

Teraz interesuje mnie bardziej złożony problem, w którym ważne są wskazówki:

arrow(u, v)
confl(u, v)
find(u)

pierwsza dodaje strzałkę , sekundy decydują, czy istnieje węzeł w osiągalny zarówno u, jak i v , tj. u v . Ostatni powinien zwrócić obiekt r ( u ) tak, że u v implikuje r ( u ) r ( v ) gdzie powinno być łatwo obliczalne. (W celu, powiedzmy, obliczeńuvwuvuvr(u)uvr(u)r(v)confl). Celem jest znalezienie dobrej struktury danych, aby operacje te były szybkie.

Cykle

Wykres może zawierać cykle.

Nie wiem, czy istnieje sposób na wydajne i przyrostowe obliczenie silnie połączonych komponentów, aby rozważyć tylko DAG dla głównego problemu.

Oczywiście doceniłbym również rozwiązanie dla DAG. Odpowiadałoby to inkrementalnemu obliczeniu najmniej powszechnego przodka.

Naiwne podejście

Struktura danych lasu rozłącznego nie jest tu pomocna, ponieważ ignoruje kierunek krawędzi. Zauważ, że nie może być pojedynczym węzłem, w przypadku gdy wykres nie jest zbieżny.r(u)

Można zdefiniować i zdefiniować jako S 1S 2, gdy S 1S 2 . Ale jak obliczyć to przyrostowo?r(u)={vuv}S1S2S1S2

Prawdopodobnie obliczenie tak dużego zestawu nie jest przydatne, mniejszy zestaw powinien być bardziej interesujący, jak w zwykłym algorytmie znajdowania związku.

jmad
źródło

Odpowiedzi:

3

( Edycja : całkowicie przepisałem moją odpowiedź teraz, gdy moje zrozumienie problemu jest (mam nadzieję) jaśniejsze.)

Wygląda na to, że ten problem można sprowadzić do stopniowego konstruowania i poprawiania aproksymacji przejściowego zamknięcia wykresu, gdy wykres jest budowany i przeszukiwany.

r(u)uvvuu,vuvuwvw

uuR(u)

Nie mam żadnych pomysłów bezceremonialny dla struktury danych, która rejestruje to, że jest bardziej wydajny niż ogólnym przypadku (np nieco wektora lub tabeli mieszania,), ale można zaktualizować te zestawy stopniowo:

uvR(u)=R(u)R(v)

conflR(u)R(v)R(u)R(v)R(u)R(v)Ra jeśli znajdziesz wspólny węzeł, ustaw R (u) = R (v) = R (u) \ cup R (v) .

find(u)R(u)conflfindRO(α(n))conflR

Brzmi to tak, jakby to był szczególny przypadek metod La Poutré i van Leeuwen utrzymywania przechodniego zamknięcia wykresu .

R

Chris Pressey
źródło
r(u)r(u)
r(u)uv vuu
r(u)
confl(u,v)R(u)R(v)find
findr(u)R(u)finduR(u)