Thuật toán nhanh nhất để tìm tất cả các đường dẫn ngắn nhất trong một biểu đồ thưa thớt là gì?


24

Trong một đồ thị không có trọng số, không bị chặn với các đỉnh và các cạnh sao cho , cách nhanh nhất để tìm tất cả các đường đi ngắn nhất trong biểu đồ là gì? Nó có thể được thực hiện nhanh hơn Floyd-Warshall là nhưng rất nhanh mỗi lần lặp không?E 2 V > E O ( V 3 )VE2V>EO(V3)

Làm thế nào về nếu đồ thị có trọng số?

Câu trả lời:


32

Vì đây là biểu đồ không có trọng số, bạn có thể chạy Tìm kiếm đầu tiên theo chiều rộng (BFS) từ mọi đỉnh v trong biểu đồ. Mỗi lần chạy BFS cung cấp cho bạn khoảng cách (và đường dẫn) ngắn nhất từ ​​đỉnh bắt đầu đến mọi đỉnh khác. Độ phức tạp thời gian cho một BFS là Ôi(V+E)= =Ôi(V)E= =Ôi(V) trong biểu đồ thưa thớt của bạn. Chạy nó V lần mang lại cho bạn độ phức tạp thời gian Ôi(V2) .

Đối với biểu đồ có hướng có trọng số, thuật toán của Johnson theo đề xuất của Yuval là nhanh nhất đối với các biểu đồ thưa thớt. Phải mất mà trong trường hợp của bạn hóa ra là O ( V 2 log V ) . Đối với một đồ thị vô hướng có trọng số, bạn có thể chạy thuật toán của DijkstraÔi(V2đăng nhậpV+VE)Ôi(V2đăng nhậpV)từ mỗi nút hoặc thay thế mỗi cạnh không được định hướng bằng hai cạnh đối diện và chạy thuật toán của Johnson. Cả hai điều này sẽ cho thời gian vô trùng giống như thuật toán của Johnson ở trên cho trường hợp thưa thớt của bạn. Cũng lưu ý rằng phương pháp BFS mà tôi đề cập ở trên hoạt động cho cả đồ thị có hướng và không có hướng.



7

Bạn có thể thử tạo một phiên bản Floyd-Warshall nhanh hơn trên các ma trận thưa thớt.

Đầu tiên, chúng ta hãy nhớ lại những gì thuật toán này làm:

Gọi là ma trận khoảng cách. Khi bắt đầu thuật toán M i , j là trọng số của cạnh i j . Nếu cạnh này không tồn tại sau đó M i , j = .MMi,jijMi,j=

Thuật toán có bước. Trong bước k của thuật toán, với mỗi cặp nút i , j chúng ta đặtVki,j

Mi,jmin{Mi,j,Mi,k+Mk,j}.

Rõ ràng nếu hoặc M k , j = thì không cần cập nhật. Do đó, trong các bước đầu tiên của thuật toán, chúng ta chỉ cần thực hiện khoảng d e g i n ( k ) d e g o u t ( k ) so sánh trong đó d e g i n ( k )d e g o u t (Mi,k=Mk,j=degin(k)degout(k)degin(k) biểu thị số lượng các cạnh đến và đi củanút thứ k tương ứng. Khi thuật toán tiến triển, ngày càng có nhiều mục nhập của ma trận M được điền vào. Do đó, các bước cuối cùng có thể mất nhiều thời gian hơn.degout(k)kM

Lưu ý rằng chúng ta cần một cách hiệu quả để chỉ lặp lại trên các ô không vô hạn trong hàng thứ và cột của ma trận. Điều này có thể được thực hiện bằng cách giữ một tập hợp các cạnh đến và đi cho mỗi nút.k

Dường như các bước đầu tiên của thuật toán có thể được hưởng lợi rất nhiều từ sự thưa thớt. Ví dụ, một biểu đồ được xây dựng ngẫu nhiên với cho thấy rằng lần lặp đầu tiên ( k = 0 ) chỉ là các bước O ( 1 ) . Nếu đồ thị được chia thành nhiều thành phần được kết nối thì ma trận M sẽ vẫn tương đối thưa thớt trong suốt thuật toán và tổng thời gian chạy có thể thấp bằng O ( V ) . Mặt khác, nếu đồ thị chỉ chứa một thành phần được kết nối, thì lần lặp cuối k = | V |E=O(V)k= =0Ôi(1)MÔi(V)k= =|V|dự kiến ​​sẽ thực hiện các bước . Trong trường hợp này, tổng thời gian chạy có thể là O ( V 3 ) . Lớn như phiên bản không thưa thớt.Ôi(V2)O(V3)

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.