Jak znaleźć supergwiazdę w czasie liniowym?

28

Rozważ skierowane wykresy. Nazywamy węzeł supergwiazdą wtedy i tylko wtedy, gdy nie można do niego dotrzeć z żadnego innego węzła, ale wszystkie inne węzły mają krawędź do . Formalnie:vv v

v superstar :⟺outdeg(v)=0indeg(v)=n1

z liczba węzłów na wykresie. Na przykład na poniższym wykresie niewypełniony węzeł jest supergwiazdą (a inne węzły nie są).n

Superstar
[ źródło ]

Jak możesz zidentyfikować wszystkie gwiazdy na kierowanych wykresach w czasie ? Odpowiednią reprezentację grafu można wybrać spośród zwykłych kandydatów ; powstrzymaj się od używania reprezentacji, które przenoszą złożoność problemu na proces wstępnego przetwarzania.O(n)

Nie można przyjąć żadnych założeń dotyczących gęstości. Nie zakładamy, że wykres zawiera gwiazdę; jeśli nie ma, algorytm powinien go rozpoznać.

Notacja : to liczba krawędzi wychodzących w węźle, podobny dla krawędzi przychodzących.outdegindeg

Raphael
źródło
1
Czy wolno nam gdzie to krawędzie, czy też musimy patrzeć tylko na krawędzie na każdym wierzchołku? O(n+k)kO(1)
Kevin
@Kevin Nie, jest ścisłym wymogiem. Odnośnie drugiego pytania: nie wiem, czy to nawet konieczne, ale na pewno nie możesz zrobić więcej. O(n)
Raphael
Czy znasz odpowiedz? Czy można to zrobić w ? O(n)
Dave Clarke
@DaveClarke: Tak i tak.
Raphael
Powinieneś jeszcze bardziej ograniczyć reprezentację; algorytm liniowy jest niemożliwy dla listy przyległości (tylko w celu potwierdzenia, że ​​wierzchołek jest supergwiazdą, konieczne może być przejrzenie całej listy przy każdym wierzchołku).
Gilles „SO- przestań być zły”

Odpowiedzi:

18

Możemy wyeliminować wszystkie z wyjątkiem jednego z wierzchołków, sprawdzając obecność krawędzi ponieważ możemy wyeliminować jedną możliwość dla każdej sprawdzanej krawędzi. W szczególności, jeśli krawędź biegnie od do , eliminujemy i przechodzimy do (ponieważ można z niej dotrzeć do innego wierzchołka); jeśli nie, eliminujemy (ponieważ nie można do niego dotrzeć z ). Kiedy dotrzemy do ostatniego wierzchołka, którykolwiek wierzchołek nie zostanie wyeliminowany, należy go porównać ze sobą (upewnij się, że warunek supergwiazdy jest zachowany: istnieje krawędź przychodząca, ale nie wychodząca), dopóki nie zostanie wyeliminowana lub potwierdzona jako supergwiazda. Niektóre pseudokod:n1xyxyyx

vertex superstar(graph g)
    current vertex = first
    # Go through each vertex
    for each subsequent vertex in g ("next")
        # If there's an edge from this to the next, we eliminate this one [move to the new one].
        # If not, we just stay here.
        if edge exists from current to next
            candidate = next
        end if
    end for
    # Now we are on the final remaining candidate, check whether it satisfies the requirements.
    # just a rename for clarity
    candidate = current
    for each other vertex in g
        if edge from current to other exists
            return null 
        else if no edge from other to current
            return null
        end if
    end for
    return candidate
end superstar

Przejdźmy przez przykład, aby zilustrować tę metodę. Weź tę tablicę z wierzchołkiem źródłowym u góry i miejscem docelowym z boku. 1 oznacza krawędź:

12341101210131114110

Wyszarzę wierzchołki, które wykluczyliśmy jako potencjalne gwiazdy. Użyję zielonego i czerwonego, aby wskazać krawędzie, na które patrzymy, kiedy to robią i nie zawierają krawędzi, której szukamy, i niebieskiej, aby wskazać, gdzie już patrzyliśmy.

Zaczynamy od spojrzenia na wierzchołki 1 i 2.

12341101210131114110
Zielona liczba pokazuje, że krawędź jest od 2 do 1, więc eliminujemy 2 i szukamy krawędzi od 3 do 1:

12341101210131114110

Widzimy, że nie ma takiej krawędzi, więc eliminujemy 1 i bierzemy 3 jako nasz aktualny wierzchołek. Przypomnijmy, że już wyeliminowaliśmy 2, więc sprawdź, czy jest krawędź od 4 do 3:

12341101210131114110

Istnieje krawędź od 4 do 3, więc eliminujemy 4. W tym momencie wyeliminowaliśmy wszystkie z wyjątkiem jednego z wierzchołków (3), więc sprawdź jego krawędzie i sprawdź, czy się kwalifikuje:

12341101210131114110

Istnieje przewaga od 1 do 3, ale nie odwrotnie, więc 3 nadal jest kandydatem.

12341101210131114110

Istnieje również przewaga od 2 do 3, ale nie odwrotnie, więc 3 wciąż jest kandydatem.

12341101210131114110

Istnieje krawędź od 4 do 3, ale nie od 3 do 4; która kończy naszą kontrolę krawędzi 3 i odkryliśmy, że jest to supergwiazda.

Ponieważ eliminujemy jeden wierzchołek jako możliwą supergwiazdę na każdej z pierwszych kontroli krawędzi , najlepszym przypadkiem jest to, że ta kontrola eliminuje końcowy wierzchołek dla złożoności . W najgorszym przypadku (ostatni lub przedostatni wierzchołek jest supergwiazdą lub ostateczna kontrola go dyskwalifikuje), po pierwszych porównaniach porównujemy kandydata z więcej wierzchołków, dla najgorszy przypadek złożoności ( ). Ten algorytm to .n1nnn12×(n1)3n3O(n)Θ(n)

Kevin
źródło
8

Czy to nie problem z celebrytą ?

Będzie tylko jedna supergwiazda (gwiazda), jeśli taka istnieje.

Używamy reprezentacji macierzy przyległości, gdzie jeśli istnieje skierowana krawędź od do , w przeciwnym razie jest to . (Zgaduję, że jest to dozwolone).i j 0A[i,j]=1ij0

Patrząc na (można to zrobić za czas), możemy wyeliminować co najmniej jednego z nich jako kandydata na celebrytę: Jeśli , następnie można wyeliminować . Jeśli , możemy wyeliminować .O ( 1 ) A [ i , j ] = 1 i A [ i , j ] = 0 jA[i,j]O(1)A[i,j]=1iA[i,j]=0j

Utrzymuj listę aktualnych kandydatów, eliminując jeden po drugim. Połączona lista powinna wystarczyć.

Na koniec możesz sprawdzić, czy twój kandydat jest rzeczywiście gwiazdą.

Algorytmem będzie .O(n)

Aryabhata
źródło
Jak wybrać odpowiedni w stałym czasie? (i,j)
Raphael
3
@Raphael: Po prostu wybierz pierwszych dwóch kandydatów z połączonej listy. (głowa i głowa-> dalej).
Aryabhata
6

Ta odpowiedź dotyczy wersji pytania, w której możliwa była dowolna reprezentacja graficzna, a nie bieżącej wersji pytania.

  • Przechowuj wykres jako parę listy sąsiedztwa i odwróconej listy sąsiedztwa, gdzie każda lista zawiera dodatkowo długość listy, a zatem odpowiednio liczbę na zewnątrz i na krawędzi.

  • Przetwarzanie wstępne: oblicz listę odwrotnego przylegania (to znaczy listę krawędzi wewnętrznych). Koszt .O(|E|)

  • Przejdź przez listy i wybierz dowolny węzeł, w którym liczba krawędzi zewnętrznych wynosi a liczba krawędzi wewnętrznych wynosi . Koszt .n - 1 O ( | N | )0n1O(|N|)

Dave Clarke
źródło
Ok, widzę, że zezwolenie na dowolną reprezentację wykresu jest zbyt słabe. Ograniczyłem pytanie do tego, co zamierzałem.
Raphael
2

Dla odniesienia jest to pseudokod rekurencyjnej wersji tego, co opublikował Kevin.

superstar(V, E) {
  if ( |V| == 1 ) {
    return V.pop
  }

  a = V.pop
  b = V.pop
  if ( (a,b) ∈ E ) {
    no_ss = a
    keep  = b
  }
  else {
    no_ss = b
    keep = a
  }

  s = superstar(V ++ keep)

  return ( s != null && (no_ss, s) ∈ E && !(s, no_ss) ∈ E ) ? s : null
}

hasSuperstar(V, E) = superstar(V, E) != null
Raphael
źródło