Bạn có thể sử dụng cây tìm kiếm. Không phải là một tiêu chuẩn, một loại được sử dụng cho các vũ trụ có thứ tự (số thực, chuỗi,) mà là một loại tổng quát hơn, chẳng hạn như các loại được gợi ý bởi dự án GiST . Có các cây tìm kiếm cho các truy vấn không gian, cũng như các cây dựa trên các tiên đề số liệu , để lập chỉ mục không gian (khoảng cách) số liệu. Ý tưởng chung (trong đó các nhánh tìm kiếm nhỏ hơn / lớn hơn, cách tiếp cận theo định hướng của các cây tìm kiếm theo thứ tự thông thường là một chuyên môn hóa) là phân tách tập dữ liệu thành các tập hợp con, thường là theo thứ bậc. Hệ thống phân cấp các tập hợp con này (rõ ràng) được đại diện bởi một cây, trong đó các phần tử con của mỗi nút đại diện cho các tập hợp con và mỗi nút có một số dạng vị ngữ, cho phép bạn kiểm tra xem có sự trùng lặp giữa tập hợp (khái niệm) của các đối tượng có liên quan đến truy vấn của bạn không và những đối tượng được tìm thấy trong cây con đó (tức là tập hợp con).
Ví dụ, đối với một cây không gian trong mặt phẳng Euclide, mỗi đối tượng có thể là một điểm và các vị từ có thể là các hình chữ nhật giới hạn , chứa tất cả các điểm được tìm thấy trong hoặc bên dưới nút đó. Nếu một truy vấn là một hình chữ nhật (và bạn muốn tìm tất cả các điểm trong hình chữ nhật đó), bạn có thể loại bỏ đệ quy các cây con có hình chữ nhật giới hạn không trùng với truy vấn của bạn.
Trong trường hợp của bạn, bạn có thể xây dựng một cây trong đó mỗi nút chứa một số cấu trúc được thiết lập cho phép bạn phát hiện xem truy vấn của bạn có phải là tập hợp con hay không. Nếu không, toàn bộ cây con đó có thể được loại bỏ, vì truy vấn của bạn không bao giờ có thể là tập hợp con của bất kỳ nút con nào (và chắc chắn không phải là lá, có thể đại diện cho dữ liệu thực).
Trái ngược với các cây tìm kiếm thông thường, không có sự đảm bảo về thời gian tìm kiếm nói chung ở đây, bạn có thể sẽ ghé thăm một số chi nhánh, vì vậy ngay cả khi bạn có một cây cân bằng hoàn hảo, bạn có thể sẽ có thời gian chạy siêu bội. Đây là một cách tiếp cận heuristic, nhưng nó có thể có hiệu quả ngay cả như vậy.
Những gì bạn cần, để xây dựng cây này, sẽ là một dạng phương thức phân cụm phân cấp phù hợp với dữ liệu của bạn. Dự án GiST thực sự có một cây rất giống với những gì bạn cần, với triển khai C (mặc dù nó kiểm tra xem truy vấn có trùng nhau không, nếu đó là tập hợp con; nên dễ sửa đổi). Tuy nhiên, cây cân bằng kiểu B-cây dựa trên đĩa có thể là quá mức cần thiết. Bạn có thể chỉ muốn phân cụm các bộ tương tự lại với nhau, theo thứ bậc và bạn có thể làm điều đó bằng cách sử dụng bất kỳ thuật toán phân cụm ngoài luồng nào, sử dụng thứ gì đó như khoảng cách Hamming (hoặc thứ gì đó lạ mắt hơn). Các nút anh chị em càng giống nhau, thì càng chặt chẽ, các vị từ giới hạn của cha mẹ (nghĩa là tập hợp đại diện cho liên kết của chúng) sẽ là tập tin và do đó, việc tìm kiếm của bạn sẽ hiệu quả hơn.
Tóm lại, đề nghị của tôi là:
- Trình bày các bộ của bạn để bạn có thể kiểm tra sự trùng lặp với truy vấn (vectơ bit, bảng băm).
- Phân cụm các bộ của bạn theo thứ bậc, sử dụng khoảng cách phù hợp (ví dụ: Hamming) và thuật toán ngoài giá.
- Trong mỗi nút nội bộ, lưu trữ liên kết của các tập hợp nút con.
- Trong quá trình tìm kiếm, duyệt qua đệ quy, cắt tỉa / bỏ qua các cây con có gốc có các bộ không trùng với truy vấn của bạn.
Nếu bạn cần cây năng động, có rất nhiều cách để làm điều đó là tốt. Ví dụ: bạn có thể đi qua cây theo cách đệ quy, tìm vị trí phù hợp nhất (bằng cách đi qua các nút có khoảng cách Hamming chồng chéo / nhỏ nhất cao nhất), cập nhật các hiệp hội (vị ngữ giới hạn) khi bạn đi. Xóa là một chút khó khăn hơn, có lẽ; bạn chỉ có thể đánh dấu các đối tượng bị thiếu, sau đó xây dựng lại các cây con (hoặc toàn bộ cấu trúc) khi số lượng các đối tượng được đánh dấu đạt đến một ngưỡng nhất định.
Cho dù điều này hoạt động tốt cho ứng dụng của bạn có thể khó nói một tiên nghiệm, nhưng nên dễ dàng kiểm tra bằng thực nghiệm. Ngoài ra, có rất nhiều chỗ để điều chỉnh.