Ho letto la terza edizione di [Algorithms] [1] di Cormen, Leiserson, Rivest e Stein. Per DFS e BFS il loro algoritmo scorre dapprima tutti i vertici e li colora di bianco.
1) Se l'attributo color fosse parte del nodo / vertice dovresti attraversare il grafico prima di attraversare il grafico. E se colori ogni vertice bianco e il tuo grafico è ciclico, avresti un ciclo infinito.
Chiarificazione: l'algoritmo CLRS per DFS è
for each vertex u 'in' G.V
u.color = WHITE
u.Parent = NIL
time = 0
for each vertex u 'in' G.V
if u.color == WHITE
DFS-VISIT(G.u)
Se u.color fa parte del nodo nel grafico, come si fa effettivamente quel loop? Avete informazioni su tutti i nodi memorizzati altrove? E se hai un elenco di adiacenze come un elenco collegato con oltre un miliardo di nodi, non ci vorrà troppo tempo per scorrere l'elenco collegato ogni volta che cerchi un vertice adiacente?
2) Quando ho pensato di archiviare gli attributi in una matrice di adiacenza o in un elenco di adiacenze, ho difficoltà a pensare a quale sia la struttura dei dati. Almeno in C posso solo fare array così grandi. E se io uso una lista collegata, non potrei indicizzarla. Dovrei attraversare una lista potenzialmente enorme per ottenere un attributo vertice. Ho difficoltà a pensare a come Facebook memorizzerebbe 1 miliardo di utenti o Google che memorizzerà tutti gli indirizzi di Maps.
3) Come seguito delle riflessioni su Facebook e Google, supponendo che le informazioni siano memorizzate in un grafico, immagino che non attraversino l'intero grafico ogni volta che qualcuno cerca un indirizzo o una persona. Per esempio se inserisco il mio indirizzo e una destinazione per le indicazioni, in qualche modo penso che trovino l'indirizzo e ottengano un puntatore al vertice nel grafico che rappresenta il mio indirizzo. Da lì avrebbero fatto un BFS o qualcosa per calcolare il mio indirizzo. Non iniziarebbero attraversando l'intera mappa del mondo per trovare il mio indirizzo.
*) Mi scuso se questo non è il modo corretto di porre le mie domande. In realtà questi sono solo concetti che sto avendo difficoltà a capire. Spero di aver comunicato ciò di cui sono confuso e di ottenere ulteriori chiarimenti. Grazie!
modifica: leggendo esempi di codice di DFS ho notato che le persone non implementano nemmeno il grafico. Implementano la matrice di adiacenza o la lista e la attraversano. In un albero posso avere una struttura con un puntatore "a sinistra" e "a destra" ai suoi figli. Anche se ho sempre pensato che i nodi del grafico avrebbero contenuto collegamenti ad altri nodi (bordi) suppongo che i nodi potrebbero essere più semplici (basta contenere i dati) e che i bordi siano SOLO memorizzati nella matrice o lista di adiacenza. È un modo comune per implementare i grafici?