Znajdowanie bliźniaczych wierzchołków na wykresach

22

Niech będzie wykresem. Przez wierzchołek , określa za (otwarty) sąsiedztwie w . To znaczy, . Zdefiniuj dwa wierzchołki w aby były bliźniakami, jeżeli i mają ten sam zestaw sąsiadów, to znaczy, jeśli .G=(V,E)xVN(x)xGN(x)={yV|{x,y}E}u,vGuvN(u)=N(v)

Biorąc pod uwagę wykres na wierzchołkach i krawędziach jako dane wejściowe, jak szybko możemy znaleźć parę bliźniaków w , jeśli taka para istnieje?GnmG

Możemy sprawdzić, czy dwa podane wierzchołki są bliźniakami w czasie , porównując ich sąsiedztwa. Prostym algorytmem znajdowania bliźniaków jest zatem sprawdzenie, dla każdej pary wierzchołków, czy są bliźniakami. Zajmuje to czas (a także wyszukuje wszystkie pary bliźniaków). Czy istnieje znacznie szybszy sposób na znalezienie (jeśli istnieje) pary bliźniaków na wykresie? Czy w literaturze znane są prace dotyczące tego problemu?O(n)O(n3)

gphilip
źródło
Możesz iterować po dzielnicach i dodawać je do tabeli mieszającej. Powiązane: cstheory.stackexchange.com/q/3390/236
Radu GRIGore
1
To ćwiczenie 2.17 tutaj books.google.co.uk/…
Radu GRIGore
Ktoś z uprawnieniami do edycji powinien naprawić definicję bliźniaków. (Zobacz komentarze do odpowiedzi TheMachineCharmer lub definicję w książce, którą
podłączyłem

Odpowiedzi:

21

Bliźnięta na wykresie to tylko moduły wielkości 2. Modułowy rozkład grafu można znaleźć w czasie . Modułowe drzewo dekompozycji domyślnie reprezentuje wszystkie moduły wykresu i składa się z trzech rodzajów węzłów wewnętrznych: szeregowych, równoległych i pierwotnych, a liście składają się z poszczególnych węzłów. Zestaw co najmniej dwóch wierzchołków jest modułem wtedy i tylko wtedy, gdy jest to jakiś węzeł w drzewie lub związek jakiegoś zestawu potomków szeregu lub równoległego węzła.S V.O(n+m)SV

Aby więc znaleźć parę bliźniaczych węzłów, jeśli istnieją, możemy zbudować modułowe drzewo dekompozycji w czasie . Następnie spójrz na liście, jeśli rodzicem jakiegokolwiek liścia jest węzeł szeregowy lub równoległy, wówczas ten węzeł musi mieć co najmniej dwoje dzieci, które tworzą podwójną parę. Zatem całkowity czas pracy jest liniowy.O(n+m)

http://en.wikipedia.org/wiki/Modular_decomposition

Travis Service
źródło
Dziękujemy również za zapoznanie mnie z rozkładem modułowym!
gphilip 11.01.11
12

Problem jest równoważny z ustaleniem, czy w macierzy graficznej są dwa równe rzędy. Możemy konstruować trie na wierszach macierzy graficznej. Kompleksem czasowym będzie O (n ^ 2)

MikleB
źródło
6
Ten sam pomysł na listach przyległości daje . O(m+n)
Radu GRIGore 10.01.11
Teraz miewam muchę;)
Hsien-Chih Chang 張顯 之
2
Można to nieco uogólnić. Jeśli przeformułujemy problem jako „Biorąc pod uwagę (gdzie tutaj f ( x ) : = N ( x ) ) znajdź wyraźne x 1 , x 2 takie, że f ( x 1 ) = f ( x 2 ) ” to dla całkowicie uporządkowanego Y jednym podejściem jest ocena f ( x ) dla każdego x Xf:X>Yf(x):=N(x)x1x2f(x1)=f(x2)Yf(x)xX, posortuj je i sprawdź sortowaną listę pod kątem duplikatów. Trie skutecznie sortuje według radix.
Peter Taylor
8

EDYCJA: rozwiązania @MikleB i @Travis są bardzo sprytne. Przepraszam za odpowiedź za nadmierną liczbę zabójstw.


Wydaje się, że problem można sprowadzić do problemu mnożenia macierzy na macierzy przyległości wykresu, zastępując mnożenie EQU (to znaczy NXOR) i dodając AND. Tak więc, gdy znajduje się para bliźniąt na wykresie, to otrzymana osnowa T nie będzie macierz tożsamości, a indeksy ( i , j ) , gdzie wartość I , J , nie zero są dokładnie węzły parę bliźniaczych .ZAZAZAT.(i,j)ai,j

Według mojej najlepszej wiedzy problem mnożenia macierzy można rozwiązać w czasie pomocą α 2,376 za pomocą algorytmu Coppersmith – Winograd . Jeśli potrzebne są praktyczne rozwiązania, każdy algorytm mnożenia macierzy działa dobrze, w praktyce jest miły.O(nα)α2.376

Hsien-Chih Chang 張顯 之
źródło
Super, to działa! : DI że będzie to wystarczające, aby ocenić tylko górną połowę . co myślisz? A2)
Pratik Deoghare
1
@TheMachineCharmer: Dziękuję :) Tak, jeśli wykres nie jest przekierowany.
Hsien-Chih Chang 10 之
Tak. Dokładnie! :)
Pratik Deoghare
5

Z powodu szalonego systemu na tej stronie nie mogę komentować bezpośrednio, ale mam kilka uwag na temat istniejących odpowiedzi.

Jestem całkiem pewny potrzeb rozwiązanie Hsien-Chih Changa skorygować do A A T .A2AAT

Obserwacja 4 maszyny jest zwrócona do przodu (kontrprzykład: [0,0,1], [0,1,0], [0,1,1] ma wyznacznik 0, ale nie ma bliźniaków). Jeśli istnieją bliźniaki, wyznacznikiem jest zero.

Peter Taylor
źródło
Nie widzę problemu z . Jakieś przykłady? btw, system na tej stronie NIE jest szalony! :)A2)
Pratik Deoghare
działałaby dla grafów niekierowanych (dla których A == A T ), ale ogólnie nie dla grafów ukierunkowanych. AND na XNOR musi porównać dwa rzędy A, a mnożenie macierzy działa na rzędzie z pierwszej macierzy z kolumną z drugiej. A2)ZAAT.
Peter Taylor
System może nie być szalony, ale może sprzeczny z intuicją w stosunku do plakatów po raz pierwszy. Możesz odpowiedzieć, ale nie komentować ... ale twoje komentarze były na tyle ładne IMHO, aby uzasadnić opublikowanie. Gdy zdobędziesz więcej reputacji, myślę, że uznasz, że system jest bardzo uzależniający.
hardmath
3
Będąc w stanie odpowiedzieć na komentarz, ale nie jest szalony. Zmusza nowych użytkowników do wyboru między brakiem pomocy a odpowiedzią w niewłaściwym miejscu.
Peter Taylor
3

Ten wątek jest dość stary; wydaje się jednak, że nikt nie wybrał najbardziej eleganckiego i prostego podejścia. Leksykograficznie posortuj listę sąsiedztwa w czasie O (n + m), a następnie sprawdź duplikaty (patrz Aho, Hopcroft, Ullman, 74 '). Możesz użyć rozkładu modułowego, ale jest to całkowita przesada.

Nathan Lindzey
źródło
2

Wątek jest stary i na pytanie OP udzielono odpowiedzi, ale chciałbym dodać inny algorytm, aby znaleźć wszystkie takie pary w czasie liniowym. Nikt nie wspominał o ulepszeniu partycji !

Ten algorytm znajduje klasy równoważności fałszywych bliźniaków. Algorytm opiera się na wydajnej procedurze, która udoskonala partycję. Biorąc pod uwagę zestaw Si partycję P = {X1, ..., Xn}. refine(P, S) = {X1 ^ S, X1 - S, X2 ^ S, X2 - S, ..., Xn ^ S, Xn - S}. ^oznacza zestaw przecięcia i -ustaw różnicę. Partycja jest stabilna, jeśli nie można jej dalej udoskonalać. Ta procedura wymaga czasu O (| S |) (patrz artykuł Wikipedii na temat udoskonalania partycji), więc jest szybka.

Algorithm:

P = {V} // initial partition consists of the vertex set
for every vertex v:
    P = refine(P, N(v)) // refine with the open neighborhood of v

Całkowity czas to O (| V | + | E |). Jest to również łatwe do zaprogramowania.

saadtaame
źródło
1

Kilka uwag, które mogą pomóc

  1. za,bV.zabdorecN(a)dN(b)

  2. |N(a)||N(b)|zab

  3. bN(a)ab

  4. Jeśli istnieją bliźniaki, wyznacznikiem macierzy przylegania jest zero.

Fantazyjny pomysł:

  1. Zbuduj kompletne drzewo binarne o wysokości = | V |.
  2. Następnie zacznij czytać jeden wiersz macierzy sąsiedztwa.
  3. Jeśli napotkasz 0, skręć w lewo, w przeciwnym razie skręć w prawo.
  4. Kiedy dotrzesz do liścia, przechowuj tam swój wierzchołek.
  5. Zrób to dla wszystkich wierszy. W końcu każdy liść będzie miał sąsiadów.

Skradziony z algorytmu kompresji zainspirowanego przez Huffmana! :)

Pratik Deoghare
źródło
2
ab
1
N.(za)-b=N.(b)-za