Jak korzystać z dwukierunkowego BFS, aby znaleźć najkrótszą ścieżkę? Załóżmy, że istnieje siatka 6x6. Punkt początkowy znajduje się w (0,5), a punkt końcowy jest w (4,1). Jaka jest najkrótsza ścieżka przy użyciu dwukierunkowych plików bf? Nie ma kosztów ścieżki. I jest nieukierunkowany.Jak korzystać z dwukierunkowego BFS, aby znaleźć najkrótszą ścieżkę?
Odpowiedz
Jak działa BFS dwukierunkowy?
Jednocześnie uruchom dwa BFS z obu wierzchołków źródłowego i docelowego, kończąc po wykryciu wierzchołka wspólnego dla obu przebiegów. Ten wierzchołek będzie w połowie drogi między źródłem a celem.
Dlaczego jest lepszy niż BFS?
Dwukierunkowy BFS przyniesie znacznie lepsze wyniki niż prosty BFS w większości przypadków. Załóżmy, że odległość między źródłem i celem to k
, a współczynnik rozgałęzienia to B
(każdy wierzchołek ma przeciętnie krawędzie B).
- BFS będzie przechodzić przez wierzchołki o wartościach
1 + B + B^2 + ... + B^k
. - Dwukierunkowe BFS będzie przechodzić przez wierzchołki o wartościach
2 + 2B^2 + ... + 2B^(k/2)
.
Dla dużych B
i k
drugi jest oczywiście znacznie szybszy od pierwszego.
W twoim przypadku:
Dla uproszczenia będę zakładać, że nie ma żadnych przeszkód w matrycy. Oto co się dzieje:
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) , .... }
Teraz odkryliśmy, że fronty przecinają się (1,2), wraz ze ścieżkami podjętych tam od wierzchołków źródłowych i docelowych:
path1: (0,5) -> (0,4) -> (0,3) -> (0,2) -> (1,2)
path2: (4,1) -> (3,1) -> (2,1) -> (1,1) -> (1,2)
Teraz musimy tylko odwrócić ścieżkę 2 i dołączyć ją do ścieżki 1 (usuwając jeden z powszechnych przecinających się wierzchołków oczywiście), aby dać nam pełną ścieżkę:
(0,5) -> (0,4) -> (0,3) -> (0,2) -> (1,2) -> (1,1) -> (2,1) -> (3,1) -> (4,1)
- 1. Jak znaleźć najkrótszą ścieżkę w dynamicznej sytuacji
- 2. Jak znaleźć najkrótszą ścieżkę na ważonym wykresie za pomocą networkx?
- 3. Jak uzyskać najkrótszą ścieżkę w Flightroutes-Table
- 4. Jak znaleźć najkrótszą div z JQuery
- 5. Zmodyfikuj algorytm Dijkstry, aby uzyskać najkrótszą ścieżkę między dwoma węzłami.
- 6. Jak korzystać z LINQ, aby znaleźć kwotę?
- 7. Najkrótsza ścieżka: DFS, BFS lub obie?
- 8. Jaki jest cel BFS i DFS?
- 9. Jak korzystać z re, aby znaleźć kolejne, powtarzające się znaki
- 10. Jak korzystać z jQuery .each(), aby znaleźć dzieci dziecka?
- 11. Jak korzystać z SequenceMatcher, aby znaleźć podobieństwo między dwoma ciągami?
- 12. Jak korzystać z mapy źródłowej, aby znaleźć błąd zminimalizowania
- 13. Jak ustawić ścieżkę Cygwin PATH, aby znaleźć javac?
- 14. Jak znaleźć najdłuższą i najkrótszą długość wartości pola w mongoDb?
- 15. gcc - jak znaleźć ścieżkę nagłówka to plik
- 16. Jak znaleźć ścieżkę pobierania Chrome w Javie
- 17. Jak korzystać z przekierowania .htaccess na częściową ścieżkę?
- 18. potrzebują pomocy w algorytm, aby znaleźć maksymalną ścieżkę DAG
- 19. Biorąc pod uwagę początek i cel, jak znaleźć najkrótszą drogę w siatce nawigacji?
- 20. jak znaleźć ścieżkę do zaufanego certyfikatu openssl?
- 21. Zwiększenie dijkstra shortest_path - jak uzyskać najkrótszą ścieżkę, a nie tylko odległość?
- 22. Jak znaleźć ścieżkę instalacji biblioteki Python?
- 23. javaw.exe nie może znaleźć ścieżkę
- 24. Java - Znajdź najkrótszą ścieżkę między 2 punktami na mapie ważonej na odległość
- 25. Jak korzystać z LINQ, aby znaleźć wszystkie kombinacje n pozycji z zestawu liczb?
- 26. Jeśli jednostka organizacyjna zawiera 3000 użytkowników, jak korzystać z usługi DirectorySearcher, aby znaleźć wszystkie z nich?
- 27. Uzyskiwanie dwukierunkowego wiązania danych $ wewnątrz szablonu
- 28. Przegrupuj listę punktów, aby osiągnąć najkrótszą odległość między nimi
- 29. Google MAP API: Jak narysować najkrótszą ścieżkę samolotu między dwoma punktami geograficznymi?
- 30. Stosując BFS do ważonych wykresy
Niezłe wyjaśnienie. Zastanawiasz się, w jaki sposób przechowywać wszystkie ścieżki, aby prześledzić powrót, gdy istnieje skrzyżowanie kolejek? Zajmie to dużo miejsca dla każdego węzła, jeśli przechowamy wszystkie ścieżki. –
@newbie_old [Podobny do zwykłego BFS] (http://stackoverflow.com/q/9590299/572670), każdy wykryty węzeł oznacza, że go odkrywasz. (W dwukierunkowym BFS szczególna troska o przecinający się węzeł, który powinien mieć dwóch rodziców). Następnie wracasz z węzła do katalogu głównego. Wymagana ilość miejsca jest liniowa w liczbie wierzchołków, co i tak jest wymagane dla BFS (dla zestawu 'odwiedzonego' i dla kolejki). – amit
Zatem złożoność czasu jest zmniejszana o kwadrat pierwiastkowy; a złożoność przestrzeni jest taka sama? – user815408