Attualmente sto lavorando a una struttura di dati del grafico diretto in C++ (nessun Boost GL per questo progetto). L'applicazione principale identificherà i componenti e i sink collegati. Ci si aspetta che i grafici siano sparsi (limite superiore di E ~ 4 V sui bordi numerici) e saranno tutti di peso uniforme. Sto cercando di decidere tra la lista di adiacenze, la lista di incidenza o forse qualche altra rappresentazione che non ho ancora sentito (matrice matriciale non un'opzione bc di sparsità). Il collo di bottiglia sarà probabilmente lo spazio complessivo e la velocità di inizializzazione del grafico: i grafici saranno inizializzati da array potenzialmente enormi in modo tale che ogni elemento dell'array finirà per essere un vertice con un bordo diretto a uno dei suoi elementi vicini. Per ottenere i bordi per ogni vertice, è necessario confrontare prima tutti gli elementi adiacenti.Implementazione di grafici sparsi e prestazioni in C++
Le mie domande sono: (1) Quale rappresentazione è in genere più veloce da inizializzare e anche veloce per BFS traversal, (2) Quali algoritmi (diversi da BFS vaniglia) esistono per trovare i componenti connessi? So che è O (V + E) che usa BFS (che è ottimale, penso) ma sono preoccupato per la dimensione della coda intermedia mentre la larghezza del grafico cresce esponenzialmente con l'altezza.
Non ho troppa esperienza con le implementazioni di grafici, quindi sarei grato per eventuali suggerimenti.
C'è anche DFS vaniglia per trovare i componenti;) Ma in generale, non è possibile fare più velocemente di quelli; dovrai esaminare ogni lato per decidere se è necessario connettere alcuni vertici o meno. Prendiamo ad esempio una stella, una cometa (che significa una stella con un sentiero come coda) o un albero; ogni lato è necessario per connettere tutti i vertici. Non c'è niente di più veloce di BFS/DFS per quanto ne so (!), E questo include algoritmi in O (| E | + | V |) con coefficienti diversi. –
Immagino che DFS potrebbe effettivamente essere migliore poiché lo stack intermedio è implicito e non sarà tanto alto quanto la coda sarà lunga in BFS. – compandu
Dipende interamente dal grafico; per un percorso, la coda sarà sempre 1 elemento, mentre lo stack raggiungerà la lunghezza del percorso. Dal momento che i tuoi grafici sono sparsi, potresti avere sottografi molto simili ai percorsi o almeno qualcosa che ha meno elementi in ogni limite di un BFS rispetto al percorso più lungo. –