Come si utilizza un BFS bidirezionale per trovare il percorso più breve? Diciamo che c'è una griglia 6x6. Il punto iniziale è in (0,5) e il punto finale è in (4,1). Qual è il percorso più breve che utilizza il bfs bidirezionale? Non ci sono costi di percorso. Ed è diretto.Come si usa un BFS bidirezionale per trovare il percorso più breve?
risposta
Come funziona il BFS bidirezionale?
Esegui simultaneamente due BFS da entrambi i vertici di origine e di destinazione, terminando quando viene scoperto un vertice comune a entrambe le esecuzioni. Questo vertice sarà a metà strada tra la fonte e il bersaglio.
Perché è meglio di BFS?
BFS bidirezionale produrrà risultati molto migliori rispetto al semplice BFS nella maggior parte dei casi. Si supponga che la distanza tra la sorgente e il target sia k
e che il fattore di diramazione sia B
(ogni vertice ha in media bordi B).
- BFS attraverserà i vertici
1 + B + B^2 + ... + B^k
. - BFS bidirezionale attraverserà i vertici
2 + 2B^2 + ... + 2B^(k/2)
.
Per il grande B
e k
, il secondo è ovviamente molto più veloce del primo.
Nel tuo caso:
Per semplicità ho intenzione di assumere che non vi siano ostacoli nella matrice. Ecco cosa accade:
iteration 0 (init):
front1 = { (0,5) }
front2 = { (4,1) }
iteration 1:
front1 = { (0,4), (1,5) }
front2 = { (4,0), (4,2), (3,1), (5,1) }
iteration 2:
front1 = { (0,3), (1,4), (2,5) }
front2 = { (3,0), (5,0), (4,3), (5,2), (3,2), (2,1) }
iteration 3:
front1 = { (0,2), (1,3), (2,4), (3,5) }
front2 = { (2,0), (4,4), (3,3), (5,3), (2,2), (1,1), }
iteration 4:
front1 = { (0,1), (1,2), .... }
front2 = { (1,2) , .... }
Ora, abbiamo scoperto che i fronti si intersecano in (1,2), insieme con i percorsi per arrivare dai vertici origine e di destinazione:
path1: (0,5) -> (0,4) -> (0,3) -> (0,2) -> (1,2)
path2: (4,1) -> (3,1) -> (2,1) -> (1,1) -> (1,2)
ora solo bisogno di invertire il percorso 2 e aggiungerlo al percorso 1 (rimozione di uno dei vertici che si intersecano comuni ovviamente), a noi dare il nostro percorso completo:
(0,5) -> (0,4) -> (0,3) -> (0,2) -> (1,2) -> (1,1) -> (2,1) -> (3,1) -> (4,1)
- 1. Percorso più breve: DFS, BFS o entrambi?
- 2. Trovare il percorso più breve con FGL
- 3. Come posso trovare il percorso effettivo trovato da BFS?
- 4. Il modo migliore per trovare un percorso più breve tra due nodi in Tinkerpop 3.1
- 5. Trovare il percorso più breve usando l'algoritmo Dijkstra
- 6. Come trovare il percorso più breve in un grafico ponderato usando networkx?
- 7. Come trovare il percorso più breve con il numero minimo di hop in Neo4j?
- 8. Calcolare il percorso più breve attraverso un negozio di alimentari
- 9. Trovare il percorso più breve tra due nodi appartenenti a due sottoinsiemi disgiunti di un grafico
- 10. Il percorso più breve per visitare tutti i nodi
- 11. Percorso più breve per trasformare una parola in un'altra
- 12. Qualsiasi algoritmo per trovare il percorso/distanza più breve in Android?
- 13. : percorso più breve tra tutti i punti
- 14. come salvare il percorso più breve nell'algoritmo dijkstra
- 15. Come trovare il div più breve con JQuery
- 16. Esempio bfs semplice ... Non capisco
- 17. Percorso più breve dopo il raddoppio dei pesi dei contorni
- 18. Quale algoritmo posso utilizzare per trovare il percorso più breve tra i tipi di nodo specificati in un grafico?
- 19. Ottimizzazione dell'algoritmo: percorso più breve tra più punti
- 20. Come trovare il percorso URL per un database postgres locale?
- 21. Il modo più breve per compilare ArrayList
- 22. Trovare il percorso ciclabile minimo in un grafico diretto dinamicamente
- 23. Qual è l'algoritmo/soluzione più semplice per un singolo percorso più breve attraverso un grafico non orientato ponderato reale?
- 24. Algoritmo del percorso più breve usando i dizionari [Python]
- 25. Esempio di percorso più breve di Giraph ClassNotFoundException
- 26. Percorso più breve con numero pari di spigoli
- 27. Spiegate BFS e DFS in termini di backtracking
- 28. Come calcolare il percorso più breve tra due punti in una griglia
- 29. Come ottenere il percorso più breve tra due punti in google maps
- 30. Perl usa/richiede il percorso di abolizione?
bella spiegazione. Ti chiedi come memorizzeresti tutti i percorsi per risalire quando c'è un'intersezione tra le code? Ci vorrebbe molto spazio per ogni nodo se memorizziamo tutti i percorsi. –
@newbie_old [Simile al normale BFS] (http://stackoverflow.com/q/9590299/572670), ogni nodo scoperto, contrassegni come lo scopri. (In BFS bidirezionale si presta particolare attenzione al nodo intersecante che dovrebbe avere due genitori). Quindi, si torna dal nodo fino alla radice. Il requisito di spazio è lineare nel numero di vertici, che è comunque lo spazio richiesto per BFS (per l'insieme 'visited'tato e per la coda). – amit
Così la complessità temporale è ridotta dalla radice quadrata; mentre la complessità spaziale è la stessa? – user815408