Trovare vertici gemelli nei grafici


22

Sia un grafico. Per un vertice , definire sia la (aperta) in zona di in . Cioè, . Definire due vertici in per essere gemelli se e hanno lo stesso insieme di vicini, ovvero se .x V N ( x ) x G N ( x ) = { y VG=(V,E)xVN(x)xGu , v G u v N ( u ) = N ( v )N(x)={yV|{x,y}E}u,vGuvN(u)=N(v)

Dato un grafico su vertici e spigoli come input, quanto velocemente possiamo trovare una coppia di gemelli in , se tale coppia esiste?n m GGnmG

Possiamo verificare se due vertici dati sono gemelli nel tempo , confrontando i loro quartieri. Un algoritmo semplice è trovare gemelli, quindi controllare, per ogni coppia di vertici, se sono gemelli. Questo richiede tempo (e trova anche tutte le coppie di gemelli). Esiste un modo significativamente più veloce per trovare (se esiste) una coppia di gemelli nel grafico? Esistono lavori noti in letteratura che affrontano questo problema?O ( n 3 )O(n)O(n3)


È possibile scorrere i quartieri e aggiungerli a una tabella hash. Correlati: cstheory.stackexchange.com/q/3390/236
Radu GRIGore

1
Questo è l'esercizio 2.17 qui books.google.co.uk/…
Radu GRIGore,

Qualcuno con poteri di modifica dovrebbe correggere la definizione di gemelli. (Vedi i commenti sulla risposta di TheMachineCharmer o la definizione nel libro che ho collegato.)
Radu GRIGore,

Risposte:


21

I gemelli in un grafico sono solo moduli di dimensione 2. La decomposizione modulare di un grafico può essere trovata nel tempo . L'albero di decomposizione modulare rappresenta implicitamente tutti i moduli del grafico ed è costituito da tre tipi di nodi interni: serie, nodi paralleli e primi, e le foglie sono costituite dai singoli nodi. Un insieme di almeno due vertici è un modulo se e solo se è un nodo nell'albero o l'unione di un insieme di figli di una serie o di un nodo parallelo.S VO(n+m)SV

Quindi, per trovare una coppia di nodi gemelli, se esistono, possiamo costruire l'albero di decomposizione modulare nel tempo . Quindi guarda le foglie, se il genitore di una foglia è un nodo serie o parallelo, quel nodo deve avere almeno due figli che formano una coppia gemella. Quindi il tempo di esecuzione totale è lineare.O(n+m)

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


Grazie, anche per avermi fatto conoscere la decomposizione modulare!
gphilip,

12

Il problema equivale a determinare se ci sono due righe uguali nella matrice del grafico. Possiamo costruire trie su righe di matrice grafica. La completezza del tempo sarà O (n ^ 2)


6
La stessa idea negli elenchi di adiacenza dà . O(m+n)
Radu GRIGore,

Ora sto nuotando una mosca;)
Hsien-Chih Chang 張顯

2
Questo può essere generalizzato in qualche modo. Se riformuliamo il problema come "Dato (dove qui ) troviamo distinti , tali che ", quindi per totalmente ordinato un approccio consiste nel valutare per ogni , ordinarli e controllare l'elenco ordinato per i duplicati. Il trie è effettivamente l'ordinamento radix. f ( x ) : = N ( x ) x 1 x 2 f ( x 1 ) = f ( x 2 ) Y f ( x ) x Xf:X>Yf(x):=N(x)x1x2f(x1)=f(x2)Yf(x)xX
Peter Taylor,

8

EDIT: le soluzioni di @MikleB e @Travis sono molto intelligenti. Ci scusiamo per la risposta eccessiva.


Sembra che il problema possa essere ridotto al problema della moltiplicazione della matrice sulla matrice di adiacenza del grafico, sostituendo la moltiplicazione con EQU (ovvero NXOR) e l'aggiunta con AND. Quindi, se nel grafico è presente una coppia di gemelli, la matrice risultante non sarà la matrice identità e gli indici cui il valore non è zero sono esattamente i gemelli coppia di nodi.A A T ( i , j ) a i , jAAAT(i,j)ai,j

Al mio miglior conoscenza problema della moltiplicazione matrice può essere risolto in tempo con dal algoritmo Coppersmith-Winograd . Se sono necessarie soluzioni pratiche, qualsiasi algoritmo di moltiplicazione di matrici funziona bene nella pratica.α 2.376O(nα)α2.376


Fantastico, questo funziona! : DI pensa che basterà valutare solo la metà superiore di . cosa pensi? A2
Pratik Deoghare

1
@TheMachineCharmer: Grazie :) Sì, se il grafico non è indirizzato.
Hsien-Chih Chang 張顯 之

Sì. Esattamente! :)
Pratik Deoghare

5

A causa del folle sistema di questo sito non posso commentare direttamente, ma ho un paio di osservazioni sulle risposte esistenti.

A2AAT

L'osservazione 4 di TheMachineCharmer è in primo piano (contro-esempio: [0,0,1], [0,1,0], [0,1,1] ha determinante 0 ma nessun gemello). Se esistono gemelli, il determinante è zero.


A2

A2AAT

Il sistema potrebbe non essere pazzo, ma forse controintuitivo per i poster della prima volta. Puoi rispondere ma non commentare ... ma i tuoi commenti sono stati abbastanza belli IMHO per giustificare la pubblicazione. Una volta che avrai acquisito maggiore reputazione, penso che troverai il sistema abbastanza avvincente.
Hardmath,

3
Essere in grado di rispondere ma non commentare è folle. Obbliga i nuovi utenti a scegliere se non essere utile o rispondere nel posto sbagliato.
Peter Taylor,

3

Questo thread è piuttosto vecchio; tuttavia, nessuno sembra aver colpito l'approccio più elegante e semplice. Ordinare in modo lessicografico l'elenco di adiacenza in tempo O (n + m), quindi verificare la presenza di duplicati (vedere Aho, Hopcroft, Ullman, 74 '). È possibile utilizzare la decomposizione modulare, ma si tratta di un overkill totale.


2

Questa discussione è vecchia e alla domanda di OP è stata data una risposta, ma vorrei aggiungere un altro algoritmo per trovare tutte queste coppie in tempo lineare. Nessuno ha menzionato il perfezionamento della partizione !

Questo algoritmo trova le classi di equivalenza dei falsi gemelli. L'algoritmo si basa su una procedura efficiente che perfeziona una partizione. Dato un set Se una partizione P = {X1, ..., Xn}. refine(P, S) = {X1 ^ S, X1 - S, X2 ^ S, X2 - S, ..., Xn ^ S, Xn - S}. ^indica l'intersezione -impostata e imposta la differenza. Una partizione è stabile se non può essere ulteriormente perfezionata. Questa procedura richiede tempo O (| S |) (vedi l'articolo di Wikipedia sul perfezionamento delle partizioni), quindi è veloce.

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

Il tempo totale è O (| V | + | E |). Anche questo è semplice da programmare.


1

Alcune osservazioni che potrebbero aiutare

  1. a,bVabcdcN(a)dN(b)

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

  3. bN(a)ab

  4. Se esistono gemelli, il determinante della matrice di adiacenza è zero.

Idea di fantasia:

  1. Costruisci un albero binario completo con height = | V |.
  2. Quindi iniziare a leggere una riga della matrice di adiacenza.
  3. Se incontri 0 prendi a sinistra, altrimenti prendi a destra.
  4. Quando raggiungi una foglia, conserva il tuo vertice lì.
  5. Fallo per tutte le righe. Quindi, alla fine, ogni foglia avrà dei vicini.

Rubato dall'algoritmo di compressione Inspired by Huffman! :)


2
ab

1
N(a)b=N(b)a
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.