Sau khi viết câu trả lời này, tôi có lẽ nên đánh dấu câu hỏi là quá rộng - chúng ta có thể nói chuyện lâu dài về các chiến lược khác nhau, cuối cùng, một điểm chuẩn sẽ phải được chạy với dữ liệu của bạn.
Mỗi thẻ có thể được biểu diễn một cách hiệu quả bởi một số nguyên. Mỗi thực thể có một bộ thẻ. Chọn cách thực hiện tập hợp chính xác là rất quan trọng - cả hai cây B và các mảng được sắp xếp đều có thể. Với bộ này, chúng tôi sẽ chỉ làm các bài kiểm tra thành viên. Vì cả hai cấu trúc làm điều này trong O (log t) (với các thẻ t trên mỗi thực thể), tôi sẽ thích các mảng do biểu diễn dày đặc hơn của chúng.
Bây giờ chúng ta có thể lọc qua tất cả các thực thể trong một hoạt động O (n · log t · p) , trong đó p là độ dài đường dẫn trung bình trong cây quyết định vị ngữ. Cây quyết định này có thể được đặt hàng để có thể nhanh chóng đưa ra quyết định. Không có dữ liệu thống kê, chỉ có thể tạo ra yếu tố phụ phổ biến.
Thứ tự mà các thực thể được tìm kiếm không thực sự quan trọng. Mặt khác, có thể thuận lợi khi sắp xếp nó sao 0
cho i
tất cả các thực thể tại các chỉ mục đều có một thẻ nhất định, trong khi phần còn lại thì không. Điều này làm giảm n khi tìm kiếm thẻ cụ thể này (trong cây quyết định, đây sẽ là thử nghiệm đầu tiên). Điều này có thể được mở rộng thành nhiều cấp độ, nhưng điều này làm phức tạp mọi thứ và chiếm bộ nhớ O (2 k ) với kcấp độ. Với nhiều cấp độ, các thẻ có mức tăng cao nhất phải được quyết định trước, trong đó mức tăng là số lượng thực thể không phải tìm kiếm nhiều lần xác suất loại bỏ chúng. Mức tăng trở thành tối đa cho 50:50 cơ hội hoặc khi 50% thực thể có thẻ cụ thể này. Điều này sẽ cho phép bạn tối ưu hóa ngay cả khi các mẫu truy cập không được biết đến.
Bạn cũng có thể tạo các bộ chỉ mục các thực thể theo từng thẻ được sử dụng - một bộ với tất cả các thực thể cho T1
, tiếp theo cho T2
. Tối ưu hóa rõ ràng (không gian và thời gian) là dừng khi một bộ chứa hơn một nửa tất cả các yếu tố và để lưu các yếu tố không có thẻ này - theo cách này, việc tạo các chỉ mục cho tất cả các thẻ sẽ mất ít hơn ½ · n · t
không gian (với tổng số thẻ t ). Lưu ý rằng việc lưu các bộ bổ sung có thể làm cho việc tối ưu hóa khác trở nên khó khăn hơn. Một lần nữa, tôi sẽ (sắp xếp) mảng cho các bộ.
Nếu bạn cũng đại diện cho các thực thể của mình thông qua một phạm vi số nguyên, bạn có thể nén không gian được sử dụng cho các bộ chỉ mục bằng cách chỉ lưu trữ thành viên bắt đầu và kết thúc của một phạm vi liên tục. Thực hiện khôn ngoan điều này có thể sẽ được thực hiện với một bit cao để cho biết liệu một mục nhập là một phạm vi ràng buộc hoặc mục thường xuyên.
Nếu bây giờ chúng ta có các bộ chỉ mục (và do đó thống kê trên các thẻ), chúng ta có thể tối ưu hóa các vị từ để các thuộc tính không chắc chắn được kiểm tra trước (chiến lược không nhanh). Điều này có nghĩa là nếu T1
phổ biến và T2
hiếm, thì T1 & T2
nên đánh giá vị ngữ bằng cách lặp qua tất cả các T2
mục nhập của bộ chỉ mục và kiểm tra từng phần tử T1
.
Nếu chúng ta sử dụng các mảng được sắp xếp để thực hiện các bộ chỉ mục, thì nhiều bước đánh giá có thể được thực hiện như các hoạt động hợp nhất. T1 & T2
có nghĩa là chúng ta lấy T1
và T2
liệt kê, phân bổ một mảng mục tiêu kích thước của các đầu vào lớn hơn và thực hiện thuật toán sau cho đến khi cả hai đầu vào đều trống: If T1[0] < T2[0]
, sau đó T1++
(loại bỏ đầu). Nếu T1[0] > T2[0]
sau đó T2++
. Nếu cả hai người đứng đầu đều bình đẳng, sau đó sao chép số đó giao cho mảng mục tiêu, và tăng cả ba con trỏ ( T1
, T2
, mục tiêu). Nếu vị ngữ là T1 | T2
, thì không có phần tử nào bị loại bỏ mà phần tử nhỏ hơn được sao chép. Một vị từ của biểu mẫu T1 & ¬T2
cũng có thể được thực hiện bằng cách sử dụng chiến lược hợp nhất, nhưng ¬T1
hoặc T1 | ¬T2
không thể.
Điều này cần được xem xét khi đặt hàng cây quyết định vị ngữ: Việc bổ sung sẽ xảy ra trên RHS của một &
hoặc cuối cùng, khi số lượng cuối cùng được xác định và các yếu tố thực tế không phải xem xét.
Không sử dụng các bộ chỉ mục, mỗi luồng có thể lọc qua một phần của các thực thể và trả về số lượng phần tử khớp với vị từ, có thể được tóm tắt. Khi sử dụng các bộ chỉ mục, thì mỗi luồng sẽ được gán một nút trong cây quyết định. Phải mất hai luồng đầu vào tương ứng với các bộ được đặt hàng và trả về một luồng đã hợp nhất. Lưu ý rằng mỗi nút trong cây quyết định có một tập hợp tương ứng đại diện cho tất cả các thực thể thực hiện biểu thức con đó và do thứ tự của các tập hợp, không cần thiết phải biết toàn bộ tập hợp cùng một lúc để hợp nhất chúng .
Các chiến lược khác nhau như hợp nhất các bộ được lập chỉ mục hoặc lọc qua danh sách các thực thể có thể được kết hợp ở một mức độ nhất định. Lọc có hiệu suất rất dễ đoán. Nếu một truy vấn rất cụ thể để việc sử dụng các bộ chỉ mục làm giảm đáng kể không gian tìm kiếm, thì các hoạt động hợp nhất có thể tốt hơn. Điều quan trọng cần lưu ý là việc hợp nhất nhiều bộ đầu vào lớn có thể dẫn đến hiệu suất kém hơn nhiều so với tìm kiếm vũ phu. Một thuật toán rất tối ưu sẽ chọn một chiến lược phù hợp dựa trên kích thước đầu vào, cấu trúc truy vấn và các chỉ số thống kê.
Bên cạnh đó, kết quả bộ nhớ đệm có thể có lợi nếu dự kiến các truy vấn tương tự sẽ được chạy trong tương lai, mặc dù chúng không tăng tốc độ chạy bộ.
T1
tài liệu tham khảo đối tượng tương tự choE1
,E2
, vv?