Đây là một ý tưởng để giải quyết vấn đề, đưa ra 2 bộ:
Bạn có thể giữ "bộ" bằng một cây đen đỏ. Ngoài ra, với mỗi nút trong cây, chúng tôi liên kết một bit để xác định xem cây con của nó có chứa một phần tử trong cả hai bộ không. Để trình bày, nó được gọi là bit chèn . Tôi giả sử cây đen đỏ sắp xếp các yếu tố từ trái sang phải.
Khi chèn một phần tử vào cây, thuật toán sẽ kiểm tra xem phần tử đó có tồn tại trong cây không (tức là trong phần còn lại của tập hợp). Nếu không- chúng ta chèn phần tử như bình thường. Nếu không, bằng cách di chuyển từ gốc đến lá chứa phần tử, thuật toán sẽ bật bit chèn của các nút tương ứng. Trong trường hợp xấu nhất phải mấtO(logn).
Khi xóa một phần tử, thuật toán sẽ kiểm tra xem phần tử đó có tồn tại trong cây không và nếu bit chèn được bật. Nếu phần tử không tồn tại trong cây- chúng ta sẽ trả về lỗi. Nếu phần tử tồn tại và bit chèn bị tắt, thì chúng ta xóa phần tử như trong thuật toán cây Đen Đen. Mặt khác, bằng cách di chuyển từ gốc đến lá chứa phần tử, thuật toán sẽ tắt bit chèn của các nút tương ứng. Xóa mấtO(logn).
Cuối cùng, thuật toán tìm phần tử tối thiểu được chia sẻ bởi cả hai bộ bắt đầu bằng thư mục gốc. Nếu bit chèn của root bị tắt- thì các tập hợp bị tách rời, thuật toán trả về lỗi. Mặt khác, thuật toán di chuyển đệ quy đến con trái nếu bit chèn của nó được bật và nếu không nó sẽ di chuyển sang con phải. Thuật toán dừng lại ở phần tử có giá trị tối thiểu. Thuật toán chạy ởO(logn).
Tôi đang cố gắng nghĩ làm thế nào để khái quát hóa cho số lượng lớn hơn các bộ ...