Thuật toán hiệu quả để truy xuất đóng cửa bắc cầu của đồ thị chu kỳ có hướng


14

Tôi đang cố gắng giải quyết vấn đề đồ thị (không phải để làm bài tập về nhà, chỉ để rèn luyện kỹ năng của tôi). Một DAG được đưa ra, trong đó V là tập hợp các đỉnh và E các cạnh. Biểu đồ được biểu diễn dưới dạng danh sách kề, vì vậy A v là tập hợp chứa tất cả các kết nối của v . Nhiệm vụ của tôi là phải tìm mà đỉnh có thể truy cập từ mỗi đỉnh v V . Giải pháp tôi sử dụng có độ phức tạp là O ( V 3 )G(V,E)VEAvvvVO(V3), với tính năng đóng bắc cầu, nhưng tôi đọc được rằng trong một blog nó có thể nhanh hơn, mặc dù nó không tiết lộ làm thế nào. Ai đó có thể cho tôi biết một cách khác (với độ phức tạp tốt hơn) để giải quyết vấn đề đóng cửa bắc cầu trong DAG không?




Tuy nhiên, đề nghị của tôi là giữ . nhưng chỉ cần cố gắng làm giảm số lượng so sánh trung bình. Đó là, đoán và thêm các quy tắc đơn giản vào thuật toán của bạn. Bạn có thể sử dụng phép nhân ma trận - nhưng nếu bạn đang sử dụng nó cho các biểu đồ nhỏ - thì đó chỉ là một mớ hỗn độn và trên thực tế trong thực tế phương pháp của bạn tốt hơn. O(|V|3)
AJed

@AJed Trong vấn đề cụ thể này, sẽ vượt quá giới hạn thời gian. O(V3)
Rontogianni Aristofanis

2
@RondogiannisAristophanes Khi bạn nói giới hạn thời gian, bạn có nghĩa rằng đây là một vấn đề trong một số thách thức lập trình / thuật toán như topcoder, v.v.? Nếu vậy, và nếu bạn chắc chắn rằng bạn đã thực hiện đúng giải pháp , bạn có thể muốn xem xét lại vấn đề. Có thể có một số thuộc tính ẩn khác có thể đơn giản hóa mọi thứ hoặc có thể có một cách tốt hơn để diễn đạt vấn đề để không cần phải đóng cửa bắc cầu. Bởi vì đóng cửa bắc cầu cũng khó như nhân ma trận. Đọc student.cs.uwaterloo.ca/~cs466/Old_cifts/F08/oryO(V3)
Paresh

Câu trả lời:


8

Thực tế là đồ thị của chúng tôi là chu kỳ làm cho vấn đề này đơn giản hơn nhiều.

Loại topo có thể cung cấp cho chúng tôi một Trật tự của các đỉnh như vậy mà, nếu i < j , sau đó không có cạnh từ v j trở lại v i . Chúng tôi đã liệt kê các đỉnh sao cho tất cả các cạnh đi "về phía trước" trong danh sách của chúng tôi.v1,v2,,vni<jvjvi

(chỉnh sửa để sửa phân tích và đưa ra thuật toán nhanh hơn một chút)

Bây giờ chúng ta chỉ cần đi ngược qua danh sách này, bắt đầu từ đỉnh cuối cùng . đóng cửa bắc cầu của v n chỉ là chính nó. Ngoài ra, thêm v n vào bao đóng bắc cầu của mọi đỉnh có cạnh với v n .vnvnvnvn

Đối với các đỉnh , đi từ cuối trở về trước, trước tiên hãy thêm v i vào bao đóng bắc cầu của chính nó, sau đó thêm mọi thứ trong bao đóng bắc cầu của v i vào bao đóng bắc cầu của tất cả các đỉnh có cạnh với v i .vivivivi

Thời gian chạy là trong trường hợp xấu nhất, với n số đỉnh và m O ( n 2 ) số cạnh. Sắp xếp topo mất thời gian O ( n + m ) . Sau đó, chúng tôi thực hiện một công việc O ( m n ) khác trong đường chuyền ngược: Khi chúng tôi đi ngược qua danh sách, với mỗi cạnh, chúng tôi phải thêm tới nO(n+m+nm)=O(n3)nmO(n2)O(n+m)O(mn)n đỉnh để đóng cửa bắc cầu của ai đó.

Lưu ý rằng bạn có thể tăng tốc độ yếu tố không đổi tốt bằng cách biểu diễn việc đóng tạm thời của mọi người bằng các mảng bit. Giả sử bạn chỉ có ; sau đó bạn sẽ sử dụng một int 64 bit trong đó bit i là 1 nếu tôi ở trạng thái đóng bắc cầu và 0 nếu không. Sau đó, một phần, nơi chúng ta thêm tất cả mọi thứ trong tôi 's bắc cầu đóng cửa để j ' s thực sự là nhanh: Chúng tôi chỉ mất c j | = c i . (Hoạt động nhị phân HOẶC.)n=64iiijcjcTôi

Đối với , bạn phải giữ chúng trong mảng và thực hiện một số số học, nhưng nó sẽ nhanh hơn nhiều so với một bộ Object.n>64

Ngoài ra, tôi biết big- trong trường hợp xấu nhất vẫn là O ( n 3 ) , nhưng để đánh bại điều này trong thực tế, bạn phải có một thứ gì đó phức tạp hơn nhiều. Thuật toán này cũng làm rất tốt trên các biểu đồ thưa thớt.ÔiÔi(n3)


1
Bạn có thể có thể sử dụng một đại diện danh sách được liên kết cho các bộ và cuối cùng họ sẽ chia sẻ các đuôi chung.
Kyle Mông
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.