Tại sao lại sử dụng Thuật toán Dijkstra nếu Tìm kiếm thứ nhất theo chiều rộng (BFS) có thể làm điều tương tự nhanh hơn?


109

Cả hai đều có thể được sử dụng để tìm đường đi ngắn nhất từ ​​một nguồn duy nhất. BFS chạy vào O(E+V), trong khi Dijkstra chạy vào O((V+E)*log(V)).

Ngoài ra, tôi đã thấy Dijkstra được sử dụng rất nhiều trong các giao thức định tuyến.

Vì vậy, tại sao lại sử dụng thuật toán Dijkstra nếu BFS có thể làm điều tương tự nhanh hơn?

Câu trả lời:


156

Dijkstra cho phép ấn định các khoảng cách khác 1 cho mỗi bước. Ví dụ: trong định tuyến, khoảng cách (hoặc trọng số) có thể được chỉ định theo tốc độ, chi phí, sở thích, v.v. Sau đó, thuật toán cung cấp cho bạn đường dẫn ngắn nhất từ ​​nguồn của bạn đến mọi nút trong biểu đồ được duyệt.

Trong khi đó, BFS về cơ bản chỉ mở rộng tìm kiếm theo một “bước” (liên kết, cạnh, bất kỳ thứ gì bạn muốn gọi nó trong ứng dụng của mình) trên mỗi lần lặp, điều này có tác dụng tìm số bước nhỏ nhất mà nó cần để đạt được bất kỳ nút đã cho từ nguồn của bạn (“gốc”).


1
Cả hai sẽ mang lại kết quả như nhau, tức là một đường đi giữa hai đỉnh, nhưng chỉ dijkstra mới đảm bảo đường đi ngắn nhất.
Edwin

Xem câu trả lời được chấp nhận, bình luận thứ hai. Cách rất tốt đẹp của giải thích tại sao mức độ phức tạp tính toán là khác nhau: stackoverflow.com/questions/25449781/...
jmcarter9t

23

Nếu bạn xem xét các trang web du lịch, các trang web này sử dụng thuật toán Dijkstra vì trọng số (khoảng cách) trên các nút.

Nếu bạn sẽ xem xét khoảng cách giống nhau giữa tất cả các nút, thì BFS là lựa chọn tốt hơn.

Ví dụ, hãy xem xét A -> (B, C) -> (F)với trọng số các cạnh được cho bởi A->B= 10, A->C= 20, B->F= C->F= 5.

Ở đây, nếu chúng ta áp dụng BFS, câu trả lời sẽ là ABF hoặc ACF, vì cả hai đều là đường đi ngắn nhất (liên quan đến số cạnh), nhưng nếu chúng ta áp dụng Dijstra, câu trả lời sẽ chỉ là ABF vì nó xem xét trọng số trên các con đường.



4

Từ quan điểm triển khai, thuật toán Dijkstra có thể được thực hiện chính xác như BFS bằng cách hoán đổi dấu queuevới a priority queue.

Nguồn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.