2014-05-05 14 views
5

Non riesco a trovare una risposta a questo in linea, e in altre risposte a domande simili a questo sembra solo un dato di fatto che un vantaggio di DFS è che utilizza meno memoria di DFS.Perché una ricerca per ampiezza utilizza prima più memoria che profondità?

Per me questo sembra l'opposto di quello che mi aspetterei. Un BFS deve solo memorizzare l'ultimo nodo visitato. Per esempio, se stiamo cercando il numero 7 nella struttura sottostante:

enter image description here

cercherà il nodo con valore 8, poi 3, 10, 1, 6, 14, 4, quindi Finaly 7. Per un DFS cercherà il nodo con valore 8, quindi 3, 1, 6, 4 e infine 7.

Se ciascun nodo è archiviato nella memoria, con informazioni sul suo valore, i suoi figli e la posizione nell'albero quindi un programma BFS dovrà solo memorizzare le informazioni sulla posizione dell'ultimo nodo visitato, quindi controllare l'albero e trovare il prossimo nodo nell'albero. Un programma DFS deve memorizzare l'ultimo nodo in cui si trovava, così come tutti i nodi che ha già visitato, quindi non li controlla di nuovo e passa in rassegna tutti i nodi foglia che escono da uno dei nodi di seconda o ultima generazione.

Quindi perché un BFS utilizza effettivamente meno memoria?

+0

Un albero completo sarà in genere più largo di quanto sia alto. Se il tuo albero di esempio fosse pieno, avresti 8 nodi al livello inferiore. In DFS, avresti bisogno solo di uno stack profondo quanto il livello più profondo. In BFS, hai bisogno di una coda larga quanto il livello più ampio. –

+1

La complessità spaziale di DFS è O (d) dove d è il [diametro] (http://en.wikipedia.org/wiki/Distance_ (graph_theory) #Related_concepts) del grafico. Quello di BFS è O (w), dove w è il numero massimo di vertici che hanno la stessa distanza dal nodo iniziale. Dipende dalla struttura del grafo che dei due è più efficiente. –

risposta

9

Entrambi i metodi di ricerca possono essere scritti in modo tale da tenere traccia del nodo precedente, ma il DFS è più efficiente di BFS.

Il DFS deve viaggiare solo un livello alla volta per scoprire se ci sono più nodi nelle vicinanze. Sarebbe muoversi attraverso i nodi in questo ordine di cercare attraverso tutti loro:

8-3-1-3-6-4-6-7-6-3-8-10-14-13-14-10-8 

La BFS deve viaggiare su e giù per l'albero fino alla cima ogni volta che va a l'altra metà dell'albero. Sarebbe muoversi attraverso i nodi in questo ordine:

8-3-8-10-8-3-1-3-6-3-8-10-14-10-8-3-1-6-4-6-7-6-3-8-10-14-13-14-10-8 

(io non sono certo se questo è completo, però, forse ha persino viaggiare su e giù per un paio di volte per scoprire che non ci sono più nodi nell'ultimo livello.)

Come vedete, il BFS è molto meno efficiente se si desidera implementare un algoritmo che utilizza un minimo di memoria.

Se si desidera utilizzare più memoria per rendere più efficienti gli algoritmi, si finisce per avere approssimativamente la stessa efficienza, in pratica solo passando attraverso ogni nodo una volta. Il DFS ha bisogno di meno memoria in quanto deve solo tenere traccia dei nodi in una catena dall'alto verso il basso, mentre il BFS deve tenere traccia di tutti i nodi sullo stesso livello.

Ad esempio, in un albero (bilanciato) con 1023 nodi, il DFS deve tenere traccia di 10 nodi, mentre il BFS deve tenere traccia di 512 nodi.

+2

Perché il downvote? Se non spieghi cosa pensi che sia sbagliato, non può migliorare la risposta. – Guffa

2

In generale può dipendere o meno a seconda del particolare grafico.

Una ricerca in profondità utilizza una pila, che contiene nodi dalla radice al nodo in ricerca. Quindi al massimo il raggio del grafico.

Una ricerca di larghezza utilizza una coda, che contiene nodi nella parte anteriore della ricerca. Quindi al massimo tutti i nodi a distanza d.

Nel grafico generale tutto quello che si può dire è che in entrambi i casi è al massimo tutti i nodi dell'albero.

Ma se si dispone di un equilibrato (o per lo più in modo) k albero ario, è la profondità, cioè il raggio, sarà solo O (log (n)), mentre il livello più basso conterrà O (n) nodi (n/2 per l'albero binario e ancora di più per gradi superiori).

ricerca Così in profondità userà solo O (log (n )) Memoria e ricerca in ampiezza utilizzerà O (n ). Per bilanciato k -albero; per altri casi sono possibili risultati diversi (ma per i grafi più comuni il diametro sarà ancora significativamente inferiore alla circonferenza).

14

BFS non sempre utilizzare più memoria. L'albero che hai, in particolare, è un esempio in cui non lo è.

Considerate questo albero: (source)

Con BFS, a un certo punto, tutti i nodi da 8-15 saranno in memoria.

Con DFS, non dovrete mai più di 4 nodi in memoria (pari alla altezza dell'albero).

La differenza diventa molto peggio, come l'albero va più grande (fintanto che rimane abbastanza pieno).

In particolare, BFS utilizza la memoria O(branchingFactor^maxDepth) o O(maxWidth), dove, come DFS, utilizza solo O(maxDepth).

Se maxWidth < maxDepth, BFS dovrebbe utilizzare meno memoria (presupponendo che si utilizzino rappresentazioni simili per entrambi), ma raramente è vero.

Problemi correlati