2010-08-30 16 views
10

Ho un grafico ciclico diretto. Partendo dalle foglie, desidero propagare i dati collegati a ciascun nodo a valle a tutti i nodi raggiungibili da quel nodo. In particolare, ho bisogno di continuare a spingere i dati attorno a tutti i cicli che vengono raggiunti fino a quando i cicli si stabilizzano.Traversal of cyclic direct graph

Sono assolutamente sicuro che si tratti di un problema di attraversamento del grafico azionario. Tuttavia, sto avendo un bel po 'di difficoltà nel cercare di trovare un algoritmo adatto --- Penso che manchi alcune parole chiave cruciali per la ricerca.

Prima di tentare di scrivere il mio algoritmo O (n^3) semi-assente, qualcuno può indicarmi una soluzione adeguata? E cosa è chiamato ?

+0

Questo è probabilmente un problema di comunicazione tutto-a-tutti (o tutto-a-tutti). Potrebbe aiutare se si cerca con queste parole chiave. – PeterK

+2

Forse queste cose sono chiare per tutti gli altri, ma cosa intendi iniziando dalle foglie e propagando i dati a valle? Una foglia non sarebbe un nodo senza nodi a valle? Inoltre, cosa significa per un ciclo stabilizzarsi? – ESRogs

+1

Penso che quello che sto definendo "lascia" sia più chiaramente descritto come "radici", anche se dato che è un grafico ciclico, il termine è particolarmente intuitivo, intendo un nodo senza genitori. A valle è nella direzione dei bambini. Poiché l'attraversamento di un ciclo può rivelare più informazioni che potrebbero dover essere propagate ai nodi già visitati, alcuni nodi potrebbero dover essere visitati più di una volta, il che significa decidere quando terminare può essere complicato; quindi stabilizzazione. In realtà, si scopre che c'è un modo molto più semplice per farlo: vedere la risposta. –

risposta

19

Poiché il grafico è ciclico (vale a dire può contenere cicli), vorrei prima scomporlo in componenti fortemente connessi. Un strongly connected component di un grafo orientato è un sottografo in cui ogni nodo è raggiungibile da ogni altro nodo nello stesso sottografo. Ciò produrrebbe una serie di sottografi. Si noti che un componente fortemente connesso di più di un nodo è effettivamente un ciclo.

Ora, in ogni componente, qualsiasi informazione in un nodo finirà per finire in ogni altro nodo del grafico (dato che sono tutti raggiungibili). Quindi per ogni sottografo possiamo semplicemente prendere tutti i dati da tutti i nodi in esso e fare in modo che ogni nodo abbia lo stesso insieme di dati. Non c'è bisogno di continuare a superare i cicli. Inoltre, alla fine di questo passaggio, tutti i nodi nello stesso componente contengono esattamente gli stessi dati.

Il prossimo passo sarebbe quello di collassare ogni componente fortemente connesso in un singolo nodo. Poiché i nodi all'interno dello stesso componente hanno tutti gli stessi dati e sono quindi fondamentalmente gli stessi, questa operazione non modifica realmente il grafico. Il "super nodo" appena creato erediterà tutti i bordi che escono o entrano nei nodi del componente da nodi esterni al componente.

alt text

Poiché abbiamo collassato componenti tutti fortemente collegati, non ci saranno cicli nel grafico risultante (perché? Perché se ci fosse stato un ciclo formata dai nodi derivano, sarebbero tutti sono stati messi in stesso componente in primo luogo). Il grafico risultante ora è un Directed Acyclic Graph. Non ci sono cicli e una semplice prima attraversamento di profondità da tutti i nodi con indegree = 0 (cioè nodi che non hanno bordi in entrata), la propagazione dei dati da ciascun nodo ai nodi adiacenti (cioè i suoi "figli"), dovrebbe portare a termine il lavoro .

+1

Perfetto. Ciò rende molti altri problemi su cui ho lavorato anche molto più trattabili. Grazie! –