Thuật toán của Dijkstra chỉ là BFS với hàng đợi ưu tiên?


21

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.


1
Tại sao bạn nghĩ vậy?
Raphael

@Raphael Bởi vì nó có vẻ quá đơn giản và đó là: Tôi đã nghiên cứu lại và tôi thấy bây giờ nó không theo dõi khoảng cách giữa các nút, vì vậy nó thực sự là một BFS, không phải Dijkstra.
Barry Fruitman

1
Chà, Dijkstra không thay đổi các giá trị mà hàng đợi được "sắp xếp" với (thường được gọi là "thư giãn"); nếu bạn cấm điều đó, nó không giống nhau, đúng.
Raphael

Câu trả lời:


19

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.st

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.


4

Đầ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 ?G=(V,E)

Đâ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 uv .e=(u,v)Elele1le1uv

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 ' .GGG

Thứ hai, thuật toán Dijkstra trên đánh bại BFS trên đồ thị biến đổi G như thế nào?GG

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ể.Gle

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)
    

    dist(v)=w(u,v)=1

    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 đủ.

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.