Esiste un algoritmo online per tenere traccia dei componenti in un grafico non indirizzato che cambia?


12

Problema

Ho un grafico non orientato (con bordi multipli), che cambierà nel tempo, nodi e bordi possono essere inseriti ed eliminati. Ad ogni modifica del grafico, devo aggiornare i componenti collegati di questo grafico.

Proprietà

Ulteriori proprietà sono che non verranno mai ricollegati due componenti. Ovviamente, il grafico può avere cicli fino a un importo arbitrario (altrimenti la soluzione sarebbe banale). Se un bordo non contiene un nodo n , non adotterà mai quel nodo. Tuttavia, se n e , può cambiare in n e .ennene

approcci

Finora ho due possibili approcci, ma come vedrai sono orribili:

Senza stato lento

Posso cercare (dfs / bfs) il grafico a partire dagli elementi modificati ogni volta. Ciò consente di risparmiare spazio, ma è lento poiché abbiamo O (n + m) per ogni modifica.

Approccio rapido (-er) (?) Con stato

Posso memorizzare tutti i percorsi possibili per ciascun nodo verso tutti i nodi possibili, ma se lo vedo correttamente, questo richiederà memoria O (n ^ 4). Ma non sono sicuro di come sia il miglioramento del runtime (se ce n'è uno, perché devo mantenere aggiornate le informazioni per ogni nodo nello stesso componente).

Domanda

Hai qualche suggerimento, come posso saperne di più su quel problema o forse su alcuni algoritmi su cui posso basarmi?

Nota

Se ci fosse un grande miglioramento in runtime / memoria potrei vivere con una soluzione non ottimale che a volte dice che due componenti sono uno, ma ovviamente preferirei una soluzione ottimale.


Se ho letto bene le tue ultime due frasi in "Proprietà", allora sembra che tu sia interessato solo al problema decrementale. In tal caso, assicurati di controllare il lavoro di Thorup sulla connettività dinamica decrementale. (Puoi trovare la citazione tramite i puntatori di JeffE, che sono per la versione completamente dinamica del problema.)
Maverick Woo,

@Maverick Woo: possono sempre esserci nuovi bordi / nodi. Penso che l'ultima proprietà non sia molto forte, proprio per questo motivo. Si qualifica ancora come decrementale?
Maschera di bit

Oops, non so come ho perso la prima frase ... Vedi la "risposta" di seguito.
Maverick Woo,

Risposte:


17

Esistono diverse strutture di dati che supportano inserimenti di bordi, eliminazioni di bordi e query di connettività (questi due vertici si trovano nello stesso componente collegato?) In tempo polillogaritmico.


Sembra fantastico, una volta che ho finito i giornali, molto probabilmente lo accetterò.
maschera di bit

6

Penso che tu stia cercando quello che viene chiamato l'algoritmo del grafico dinamico per la decomposizione dei componenti collegati. L'algoritmo di Holm, de Lichtenberg e Thorup [HLT01] ha ammortizzato il tempo pollogaritmico su ogni aggiornamento dei bordi. È passato molto tempo dall'ultima volta che ho esaminato il problema, quindi probabilmente ci sono progressi più recenti.

[HLT01] Jacob Holm, Kristian de Lichtenberg e Mikkel Thorup. Algoritmi completamente dinamici deterministici poliarlogaritmici per connettività, minimo spanning tree, 2-edge e biconnectivity. Journal of the ACM , 48 (4): 723–760, luglio 2001. http://doi.acm.org/10.1145/502090.502095


Jinx. Mi devi una coca.
Jeffε

@JeffE: non sapevo di quel gioco . Ma secondo le regole, non ho perso il gioco (sono solo nello stato "jinxed"), quindi non ti devo una coca se non parlo più ... oh, aspetta un momento.
Tsuyoshi Ito,

se solo potessi scambiare punti reputazione :)
Suresh Venkat,

5

(Per ora lasciatemi attenermi alle query di connettività, che purtroppo potrebbero non essere sufficienti per la vostra applicazione.)

Molti dei lavori precedenti sul problema della connettività dinamica sono nel modello di aggiornamento dei bordi: si presume che il numero di vertici sia fisso e si possono inserire e / o eliminare i bordi mentre si eseguono query. Se puoi solo inserire (eliminare), questo è incrementale (decrementale). Se riesci a fare entrambe le cose, è completamente dinamico. Il lavoro di Thorup, come sottolineato da JeffE (e da me stesso nel commento), è tutto per gli aggiornamenti dei bordi.

AFAIK, la comunità della teoria CS sta solo iniziando a esaminare gli aggiornamenti dei vertici per i grafici generali. C'è stato un lavoro rivoluzionario su questo fatto da Chan, Pătraşcu e Roditty in FOCS 2008. Vedi questo link per una revisione molto recente (settembre 2010) e i riferimenti all'interno.


Perché pensi che Holm et. al. approccio non funziona per il mio problema? Lo avrei adottato.
Maschera di bit

1
Se il tuo grafico ha un grado limitato, in teoria puoi emulare un aggiornamento del vertice usando una serie di aggiornamenti del bordo. Altrimenti, un singolo aggiornamento del vertice (ad esempio, la rimozione del centro di un grafico a stella) può cambiare drasticamente la connettività del grafico e in tal caso è necessario il risultato di Chan et al.
Maverick Woo,

Vedo. Avrei dovuto dichiarare nella domanda originale che le rimozioni di vertici sono rare, quindi posso permettermi di farlo bordo per bordo.
Maschera di bit
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.