Tôi đang làm việc trên một thuật toán cần tính toán kích thước của một tập hợp được tạo bởi các giao điểm của ít nhất 2 bộ. Cụ thể hơn:
Các bộ được giao nhau được tạo bởi các truy vấn SQL và trong nỗ lực giữ mọi thứ nhanh, tôi nhận được số lượng của từng truy vấn trước, sau đó lấy bộ có số đếm thấp nhất ( ) và sử dụng các ID đó làm giới hạn phần còn lại của các truy vấn lớn, do đó giao lộ có hiệu quả trở thành:
Ngay cả chiến lược này cũng để lại cho tôi một số truy vấn khá lớn để chạy, vìđôi khi có thể lớn Ý tưởng của tôi để giải quyết vấn đề đó là lấy một mẫu ngẫu nhiên và giao nó với phần còn lại của các bộ trước khi ngoại suy trở lại ước tính chính xác của . Câu hỏi của tôi là: cách tốt nhất để lấy mẫu và sau đó ngoại suy để lấy lại giá trị , nếu không hoàn toàn chính xác, có phạm vi lỗi có thể dự đoán được không?
Đây là những gì tôi đã thử cho đến nay (trong mã giả, loại):
sample_threshold := 10000
factor := 1
if (len(A0) > sample_treshold) {
factor = sample_threshold / len(A0)
}
// Take a random sample of size 10000 from A0
// Intersect all the other sets with the A0 sample, then with each other
working_set := A0
for i, a := range A {
a = intersect(A0, a)
working_set = intersect(working_set, a)
}
z := len(working_set) * (1 / factor)
Mã này hoạt động, nhưng dường như luôn đánh giá quá cao z
, với cỡ mẫu thấp hơn mang lại ước tính cao hơn. Ngoài ra, tôi không chắc làm thế nào điều này sẽ mở rộng với hơn hai bộ để giao nhau.
Tôi hy vọng câu hỏi này có ý nghĩa, cho tôi biết nếu tôi có thể làm rõ thêm bất cứ điều gì. Ngoài ra, nếu câu hỏi này không có chủ đề hoặc thuộc về nơi nào khác, vui lòng cho tôi biết và tôi rất vui khi chuyển nó.
Theo nhận xét của Bill , tôi đã chạy một số thử nghiệm nhanh để hiển thị cỡ mẫu so với lỗi. Mỗi thùng cỡ mẫu được chạy 20 lần và như bạn có thể thấy có một xu hướng khá rõ ràng:
ORDER BY RAND()
, không hoàn hảo nhưng phải phù hợp với nhiệm vụ này.