Theo trang này , thuật toán của Dijkstra chỉ là BFS với hàng đợi ưu tiên. Là nó thực sự là đơn giản? Tôi nghĩ là không.
Theo trang này , thuật toán của Dijkstra chỉ là BFS với hàng đợi ưu tiên. Là nó thực sự là đơn giản? Tôi nghĩ là không.
Câu trả lời:
Bạn có thể triển khai thuật toán của Dijkstra dưới dạng BFS với hàng đợi ưu tiên (mặc dù đó không phải là triển khai duy nhất).
Thuật toán của Dijkstra dựa vào thuộc tính rằng đường đi ngắn nhất từ đến t cũng là đường đi ngắn nhất tới bất kỳ đỉnh nào dọc theo đường dẫn. Đây chính xác là những gì BFS làm.
Hoặc ở một góc nhìn khác: thuật toán của Dijkstra sẽ hoạt động như thế nào nếu tất cả các trọng số là 1? Chính xác như BFS.
Đầu tiên, làm thế nào chúng ta có thể điều chỉnh BFS thành đồ thị có trọng số tổng quát hơn ?
Đây là một ý tưởng từ cuốn sách "Thuật toán (Phần 4.4)" của Dasgupta et al:
Đối với bất kỳ cạnh của E (có trọng lượng l e ), hãy thay thế nó bằng l e cạnh có độ dài 1 , bằng cách thêm l e - 1 nút giả giữa u và v .
Kết quả là, các cạnh của đồ thị kết quả đều có đơn vị chiều dài. Do đó, chúng ta có thể tính toán khoảng cách trong G bằng cách chạy BFS trên G ' .
Thứ hai, thuật toán Dijkstra trên đánh bại BFS trên đồ thị biến đổi G như thế nào?
BFS trên có thể được thực sự chậm nếu một số l e là lớn vì nó lãng phí quá nhiều thời gian trên máy tính khoảng cách với những nút giả mà chúng ta không quan tâm đến gì cả. Thuật toán Dijkstra tránh điều này bằng cách đặt khoảng cách ước tính cho các nút và thư giãn chúng bất cứ khi nào có thể.
Thứ ba, thuật toán Dijkstra hành xử như thế nào trên các biểu đồ không trọng số?
Nó hoạt động giống hệt như BFS. Chúng tôi xây dựng điều này từ hai điểm chính.
Về "thư giãn".
Đối với thuật toán Dijkstra trên đồ thị có trọng số chung, sự thư giãn là
for all edges (u,v) in E:
if dist(v) > dist(u) + w(u,v)
dist(v) = dist(u) + w(u,v)
for all edges (u,v) in E:
if dist(v) = \infty
dist(v) = dist(u) + 1
Trên "hàng đợi ưu tiên".
Khi thuật toán Dijkstra được chạy trên biểu đồ không trọng số, bất cứ lúc nào, hàng ưu tiên chứa tối đa hai giá trị (khoảng cách) riêng biệt. Do đó, một hàng đợi BFS của FIFO đủ.