Tìm tập hợp con của tập hợp trong tập hợp các tập hợp


8

Bạn muốn giới thiệu dữ liệu gì cấu trúc đại diện cho một bộ sưu tập các tập con của và hỗ trợ các hoạt động sau đây?{1,,n}

  • : chèn S vào bộ sưu tập.insert(S)S
  • : trả về true nếu có tồn tại S ' trong bộ sưu tập mà S 'S , false.query(S)SSS

Tiêu chí chính của tôi sẽ là hiệu quả thời gian thực tế.


3
Khuyến nghị yêu cầu tiêu chí. Tiêu chí của bạn là gì? Ví dụ, sự đơn giản, không gian hay thời gian? Bạn càng cụ thể, bạn càng có nhiều khả năng nhận được câu trả lời hữu ích cho bạn.
Tsuyoshi Ito

Bạn nói đúng, cảm ơn bạn đã chỉ ra. Tiêu chí chính của tôi sẽ là hiệu quả thời gian thực tế.
Caleb Poucher

1
nSO(n)mO(nm)

100{0,1}nnnm

nm

Câu trả lời:


1

Vấn đề của bạn nghe với tôi rất nhiều như Truy xuất thông tin (IR). Ở đó bạn có một bộ các từ (còn được gọi là tài liệu) và bạn muốn tìm không chỉ sự tồn tại, mà tất cả các bộ / tài liệu thỏa mãn điều kiện truy vấn.

Vì các phần tử được đặt là số, bạn có thể tận dụng cấu trúc rõ ràng, do đó, một chỉ mục chữ ký sẽ được sử dụng nhiều.

Tôi khuyên bạn nên xem qua các tài liệu IR, đặc biệt liên quan đến cấu trúc từ điển, như cây cối, nhưng lưu ý rằng không gian thường là vấn đề đối với các hệ thống đó, trong khi đó có thể không phải là vấn đề đối với trường hợp của bạn.


Điểm hay, điều này thực sự rất giống với việc tìm kiếm các thuật ngữ trong tài liệu và cách giải quyết phổ biến nhất đó là sử dụng một tệp được gọi là tệp đảo ngược , hoạt động giống như chỉ mục của một cuốn sách. Bạn tìm kiếm từng thuật ngữ trong truy vấn của mình trong tệp đảo ngược và nhận danh sách / bộ tài liệu có chứa thuật ngữ đó. Sau đó, bạn giao cắt các danh sách này để có được kết quả. (Ví dụ: bạn có thể sử dụng ID vật phẩm ánh xạ bảng băm để sắp xếp danh sách ID bộ; sắp xếp giúp giao lộ.)
Magnus Lie Hetland

0

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.

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.