È possibile farlo con overhead spazio costante.
BFS ha la proprietà che i nodi non visitati nella coda hanno tutti profondità che non diminuiscono mai e aumentano di un massimo di 1. Quindi mentre leggete i nodi dalla coda BFS, potete tenere traccia della profondità attuale in un singolo depth
variabile, che è inizialmente 0.
Tutto quello che devi fare è registrare quale nodo nella coda corrisponde al successivo aumento di profondità. È possibile farlo semplicemente utilizzando una variabile timeToDepthIncrease
per registrare il numero di elementi già presenti nella coda quando si inserisce questo nodo e diminuendo questo contatore ogni volta che si inserisce un nodo dalla coda.
Quando si raggiunge lo zero, il nodo successivo si pop dalla coda sarà a un nuovo, più grande (da 1) la profondità, in modo da:
- Incremento
depth
- Impostare
pendingDepthIncrease
true
Ogni volta che si preme un nodo figlio sulla coda, verificare innanzitutto se pendingDepthIncrease
è vero. Se lo è, questo nodo avrà una profondità maggiore, quindi imposta timeToDepthIncrease
sul numero di nodi nella coda prima di eseguirlo, quindi reimposta pendingDepthIncrease
su falso.
Infine, interrompere quando depth
supera la profondità desiderata! Ogni nodo non visitato che potrebbe apparire in seguito deve essere a questa profondità o maggiore.
[EDIT:. Grazie commentatore Keyser]
fonte
2012-10-31 02:25:56
Basta interrompere la ricerca quando hai raggiunto la profondità massima? – Mat
mantenere solo un parametro di profondità è la tua routine bfs in modo che quando raggiungi il valore massimo non continui a cercare più in profondità – ControlAltDel
Puoi spiegare con un exmaple? – user1220022