Tôi có đúng về sự khác biệt giữa các thuật toán Floyd-Warshall, Dijkstra và Bellman-Ford không?


16

Tôi đã nghiên cứu ba và tôi nói rằng những suy luận của tôi từ họ bên dưới. Ai đó có thể cho tôi biết nếu tôi đã hiểu họ đủ chính xác hay không? Cảm ơn bạn.

  1. Thuật toán Dijkstra chỉ được sử dụng khi bạn có một nguồn duy nhất và bạn muốn biết đường dẫn nhỏ nhất từ ​​nút này sang nút khác, nhưng không thành công trong trường hợp như thế này .

  2. Thuật toán Floyd-Warshall được sử dụng khi bất kỳ nút nào trong số tất cả các nút có thể là nguồn, vì vậy bạn muốn khoảng cách ngắn nhất để đến bất kỳ nút đích nào từ bất kỳ nút nguồn nào. Điều này chỉ thất bại khi có chu kỳ tiêu cực.

  3. Bellman-Ford được sử dụng như Dijkstra, khi chỉ có một nguồn. Điều này có thể xử lý các trọng số âm và hoạt động của nó giống như Floyd-Warshall ngoại trừ một nguồn, phải không? (Đây là cái tôi ít chắc chắn nhất.)


Chào mừng bạn Tôi đã chỉnh sửa các phần mã dự phòng; mọi người có thể tự mình nhấp vào Wikipedia hoặc kiểm tra các thuật toán trong sách giáo khoa yêu thích của họ. Lưu ý rằng câu hỏi của bạn là một câu hỏi kỳ lạ, bởi vì câu trả lời "có" có thể không có gì hơn.
Raphael

Câu trả lời:


23

Thuật toán của Dijkstra chỉ được sử dụng khi bạn có một nguồn duy nhất và bạn muốn biết đường dẫn nhỏ nhất từ ​​nút này sang nút khác, nhưng không thành công [trong biểu đồ có cạnh âm]

Thuật toán Dijkstra là một ví dụ về một con đường ngắn nhất là một nguồn đơn hoặc SSSP thuật toán. Mỗi thuật toán SSSP tính khoảng cách đường đi ngắn nhất từ ​​một nút nguồn được chọn đến mọi nút khác trong biểu đồ. Hơn nữa, nó tính toán một biểu diễn nhỏ gọn của tất cả các đường dẫn ngắn nhất từ s đến mọi nút khác, dưới dạng một cây gốc. Trong mã Wikipedia, là cha mẹ của v trong cây này.SSprevious[v]v

Hành vi của thuật toán Dijkstra trong các biểu đồ có các cạnh âm phụ thuộc vào biến thể chính xác đang được thảo luận. Một số biến thể của thuật toán, như biến thể trong Wikipedia, luôn chạy nhanh nhưng không tính toán chính xác các đường dẫn ngắn nhất khi có các cạnh âm. Các biến thể khác, như một trong các ghi chú bài giảng này luôn tính toán các đường đi ngắn nhất một cách chính xác (trừ khi có một chu kỳ âm có thể tiếp cận được từ nguồn) nhưng có thể yêu cầu thời gian theo cấp số nhân trong trường hợp xấu nhất nếu có các cạnh âm.

Thuật toán của Floyd-Warshall được sử dụng khi bất kỳ nút nào trong số tất cả các nút có thể là nguồn, vì vậy bạn muốn khoảng cách ngắn nhất để đến bất kỳ nút đích nào từ bất kỳ nút nguồn nào. Điều này chỉ thất bại khi có chu kỳ tiêu cực.

Đúng rồi. Floyd-Warshall là một ví dụ về thuật toán đường dẫn ngắn nhất của tất cả các cặp , có nghĩa là nó tính toán các đường dẫn ngắn nhất giữa mỗi cặp nút. Một ví dụ khác là "đối với mỗi nút v, hãy chạy Dijkstra với v là nút nguồn". Có một vài người khác.

Bellman-Ford được sử dụng như Dijkstra, khi chỉ có một nguồn. Điều này có thể xử lý các trọng số âm và hoạt động của nó giống như của Floyd-Warshall ngoại trừ một nguồn, phải không?

Bellman-Ford là một ví dụ khác về thuật toán đường dẫn ngắn nhất một nguồn , như Dijkstra. Bellman-Ford và Floyd-Warshall là ví dụ tương tự , ví dụ, cả hai đều là thuật toán lập trình động, nhưng Floyd-Warshall không phải là thuật toán giống như "đối với mỗi nút v, hãy chạy Bellman-Ford với v là nút nguồn". Cụ thể, Floyd-Warshall chạy trong thời gian , trong khi lặp lại-Bellman-Ford chạy trong thời gian O ( V 2 E ) ( O ( V E ) cho mỗi đỉnh nguồn).Ôi(V3)Ôi(V2E)Ôi(VE)

Để biết thêm chi tiết, tham khảo sách giáo khoa thuật toán yêu thích của bạn. (Bạn sách giáo khoa thuật toán yêu thích không?)


bạn có phiền khi chia sẻ sách giáo khoa thuật toán yêu thích của bạn?
Abdul

2
@Abdul Thuật
JeffE

@Abdul mồi. - Sách giáo khoa được sử dụng tại MIT / Stanford là T. Cormen, et al. Giới thiệu về thuật toán. Sách giáo khoa được sử dụng tại Cornell là J. Kleinberg, et al Al Thuậtm Design. cs.sjtu.edu.cn/~jiangli/teaching/CS222/files/m vật liệu / từ
AffluentOwl

2

Tất cả ba thuật toán được trình bày trong các bài giảng của Giáo sư Jaehyun Park (Đại học Stanford). Đây là liên kết Thuật toán đường dẫn ngắn nhất


Điều này không trả lời câu hỏi về sự khác biệt và không khép kín, chỉ là một liên kết không có tóm tắt không được tính là câu trả lời tốt. Ngoài ra, nó có vẻ dư thừa, vì nó không bao gồm nhiều hơn các câu trả lời hiện có.
Ác

1

Các trang Wikipedia trên bài toán đường đi ngắn nhất mô tả hai vấn đề khác nhau: SSSP và APSP.

Đường dẫn ngắn nhất nguồn đơn (SSSP):

  • Thuật toán của Dijkstra: giải quyết vấn đề đường dẫn ngắn nhất nguồn đơn.
    • Các ràng buộc: Chỉ các cạnh âm mà nó không thể xử lý.
    • Đồ thị không trọng số: Dijkstra giống như BFS.
  • Thuật toán BellmanTHER Ford: giải quyết vấn đề nguồn đơn nếu trọng số cạnh có thể âm. Đây là sự cải tiến trên Dijkstra, nơi giờ đây nó cũng có thể xử lý các trọng số âm.

Tất cả các cặp đường dẫn ngắn nhất (APSP):

  • Thuật toán FloydTHER Warshall: giải quyết tất cả các cặp đường dẫn ngắn nhất. Xử lý cả hai cạnh tích cực và tiêu cực.
    • Ràng buộc: Không thể xử lý các chu kỳ tiêu cực.

Do đó, Floyd Gian Warshall không giống như BFS, mặc dù phương pháp cơ bản là giống nhau, lập trình động.


1

Có lẽ đây nên là một nhận xét chứ không phải là một câu trả lời, nhưng nó là một sự khác biệt giữa các thuật toán mà các câu trả lời khác không đề cập.

Mọi người có xu hướng gọi thuật toán của Floyd là Floyd-Warshall , nhưng thuật toán của Floyd và Warshall không giống nhau.

Bài viết của Warshall quan sát rằng nếu bạn sử dụng thuật toán của Floyd trên ma trận tỷ lệ nhị phân, thì điều bạn đang làm là nhân ma trận; do đó, nó thực sự có thể được thực hiện theo cách đó, và ví dụ nếu bạn có thể thực hiện phép nhân vectơ trongÔi(1), thuật toán của bạn trở thành Ôi(n2).

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.