Il controllo della transitività di un digrafo non è più facile di (in termini di complessità asintotica) prendere la chiusura transitiva del digrafo? Conosciamo un limite inferiore migliore di per determinare se un digrafo è transitivo o no?
Il controllo della transitività di un digrafo non è più facile di (in termini di complessità asintotica) prendere la chiusura transitiva del digrafo? Conosciamo un limite inferiore migliore di per determinare se un digrafo è transitivo o no?
Risposte:
Di seguito mostrerò quanto segue: se hai un algoritmo temporale O ( ) per verificare se un grafico è transitivo per qualsiasi ε > 0 , allora hai un algoritmo temporale O ( n 3 - ε ) per rilevare un triangolo in un nodo grafico n , e quindi (da un articolo di FOCS'10 ) avresti un algoritmo temporale O ( n 3 - ε / 3 ) per moltiplicare due matrici booleane n × n , e quindi per un risultato di Fischer e Meyer degli anni '70 , questo implica anche una O ( n 3 - ) algoritmo temporale per la chiusura transitiva.
Supponiamo che si desidera rilevare un triangolo in un nodo G . Ora possiamo creare il grafico seguente H . H è tripartito con partizioni I , J , K su n nodi ciascuno. Qui ciascun nodo x di G ha copie x I , x J , x K nelle parti I , J , K . Per ogni bordo ( u , v ) di G aggiungi bordi diretti ( e ( u J , v K ) . Per ogni nonedge ( u , v ) di G aggiungere il bordo diretto ( u I , v K ) .
Innanzitutto, se contiene un triangolo u , v , w , allora H non è transitivo. Questo perché i bordi ( u I , v J ) , ( v J , w K ) sono in H ma ( u I , w K ) no. In secondo luogo, se H non è transitiva, allora deve esistere un certo cammino orientato da qualche nodo s a qualche nodo t in H tale che ( non è un arco orientato in H . Tuttavia, i percorsi più lunghi in H hanno 2 spigoli, quindi qualsiasi percorso di questo tipo deve avere la forma ( u I , v J ) , ( v J , w K ) e ( u I , w K ) non è in H , quindi u , v , w forma un triangolo G .
Sembra che sia il limite inferiore più noto, poiché qualsiasi limite inferiore implica un limite inferiore per la moltiplicazione della matrice booleana. Sappiamo che il controllo della transitività può essere ottenuto utilizzando una moltiplicazione della matrice booleana, ovvero G è transitivo se e solo se G = G 2 .
Capire se un DAG è transitivo è difficile quanto decidere se un digraph generale è transitivo (il che ci riporta alla tua domanda precedente :)).
Supponiamo di avere un algoritmo in esecuzione nel tempo per decidere se un DAG è transitivo.
Dato un grafico diretto , puoi usare il seguente algoritmo randomizzato per decidere se G è transitivo nel tempo O ( f ( n ) ⋅ log ( 1e probabilità di errore≤δ:
1. for $O(\log{\frac{1}{\delta}})$ iterations:
1.1. Compute a random permutation on $V$. Denote the result by $<v_1,v_2,...,v_n>$.
1.2. Set $G'=(V,E\cup \{(v_i,v_j)|i<j\})$ (i.e. compute a random acyclic orientation).
1.3. If $G'$ (which is acyclic) is not transitive return false.
2. return true.
Ora è ovvio che se fosse transitivo, questo algoritmo tornerà vero.
Ora supponiamo che non fosse transitivo. Sia e 1 = ( v i , v j ) , e 2 = ( v j , tale che ( v i , v k ) ∉ E (devono esserci dei bordi poiché G non è transitivo). La probabilità che e 1 , e 2 ∈ G ′ sia 1 , quindi in ogni iterazione la probabilità che l'algoritmo calcolerà cheGnon fosse transitivo è1 e dopo leiterazioniO(log(δ))la probabilità di fallimento è al massimoδ.
Penso che questo dovrebbe essere fattibile in un tempo lineare, cioè dove n è il numero di vertici e m il numero di spigoli. Forse adattando qualche schema di attraversamento del grafico all'impostazione diretta? Un punto di partenza potrebbe essere la LexBFS / LexDFS qui descritta ; per i grafici diretti sembra che dovremmo usare l'ordinamento topologico piuttosto che DFS, quindi forse è possibile scoprirlo con qualche algoritmo LexTSA ?
Per quanto riguarda la risposta precedente, ecco un modo semplice per definire un tale algoritmo. Assegna a ciascun vertice un indice i ( x ) , inizializzato su . Per ogni x , sia M ( x ) a indicare il multiset di indici dei suoi vicini. Simuliamo un ordinamento topologico mantenendo un insieme R di vertici inesplorati, inizializzato sull'intero insieme. Ad ogni passaggio, facciamo quanto segue:
Scegli un vertice cui multiset M ( x ) è minimo (nell'ordine multiset);
Aggiornare alle attuali contatore loop e rimuovere x da R .
Questo algoritmo può essere utilizzato per il tuo problema o per qualche altra applicazione?