Hãy xem xét một đồ thị có hướng mà người ta có thể tự động thêm các cạnh và thực hiện một số truy vấn cụ thể.
Ví dụ: khu rừng tách rời
Hãy xem xét các nhóm truy vấn sau:
arrow(u, v)
equiv(u, v)
find(u)
cái đầu tiên thêm một mũi tên vào biểu đồ, cái thứ hai quyết định nếu , cái cuối cùng tìm thấy một đại diện chính tắc của lớp tương đương , tức là một sao cho ngụ ý .u ↔ ∗ v ↔ ∗ r ( u ) u ↔ ∗ v r ( v ) = r ( u )
Có một thuật toán nổi tiếng sử dụng cấu trúc dữ liệu rừng tập hợp rời rạc thực hiện các truy vấn này với độ phức tạp khấu hao gần như không đổi, cụ thể là . Lưu ý rằng trong trường hợp này được thực hiện bằng cách sử dụng .equiv
find
Biến thể phức tạp hơn
Bây giờ tôi quan tâm đến một vấn đề phức tạp hơn trong đó các hướng dẫn quan trọng:
arrow(u, v)
confl(u, v)
find(u)
đầu tiên thêm một mũi tên , giây quyết định nếu có một nút có thể truy cập từ cả và , tức là . Người cuối cùng sẽ trả về một đối tượng sao cho ngụ ý trong đó nên dễ dàng tính toán. (Để, nói, tính toán ). Mục tiêu là tìm ra một cấu trúc dữ liệu tốt để các thao tác này được nhanh chóng.confl
Chu kỳ
Biểu đồ có thể chứa chu kỳ.
Tôi không biết có cách nào để tính toán hiệu quả và tăng dần các thành phần được kết nối mạnh mẽ hay không, để chỉ xem xét các DAG cho vấn đề chính.
Tất nhiên tôi cũng sẽ đánh giá cao một giải pháp cho DAGs. Nó sẽ tương ứng với một tính toán gia tăng của tổ tiên ít phổ biến nhất.
Cách tiếp cận ngây thơ
Cấu trúc dữ liệu rừng tách rời không hữu ích ở đây, vì nó không quan tâm đến hướng của các cạnh. Lưu ý rằng không thể là một nút đơn, trong trường hợp đồ thị không hợp lưu.
Người ta có thể định nghĩa và để xác định là khi . Nhưng làm thế nào để tính toán này tăng dần?
Có lẽ việc tính toán một tập lớn như vậy là không hữu ích, một tập nhỏ hơn sẽ thú vị hơn, như trong thuật toán tìm liên kết thông thường.