적어도 2 세트의 교집합에 의해 생성 된 세트의 크기를 계산 해야하는 알고리즘을 연구 중입니다. 더 구체적으로:
교차 된 집합은 SQL 쿼리에 의해 생성되며, 빠른 속도를 유지하기 위해 각 쿼리 수를 미리 얻은 다음 가장 낮은 수 ( )로 집합을 가져 와서 해당 ID를 경계로 사용합니다. 나머지 큰 쿼리이므로 교차로가 효과적으로됩니다.
이 전략조차도때로는 클 수 있습니다. 그것을 다루기위한 나의 생각은 의 무작위 샘플을 취하여 그것을 의 적절한 추정치로 외삽하기 전에 나머지 세트와 교차시키는 것입니다 . 내 질문은 : 샘플링과 외삽을 수행하여 값으로 되돌릴 수있는 가장 좋은 방법은 무엇 입니까? 즉, 완전히 정확하지는 않지만 예측 가능한 오류 범위가 있습니까?
여기 내가 지금까지 시도한 것이 있습니다 (의사 코드에서 일종의).
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)
이 코드는 작동하지만 z
표본 크기가 작을수록 추정치가 높아져 지속적으로 과대 평가되는 것 같습니다 . 또한, 이것이 두 개 이상의 세트로 어떻게 확장되는지 잘 모르겠습니다.
이 질문이 이해되기를 바랍니다. 더 명확하게 할 수 있으면 알려주세요. 또한이 질문이 다른 주제이거나 다른 곳에 속한 경우 알려 주시면 기꺼이 도와 드리겠습니다.
당 빌의 코멘트 , 내가 샘플 크기 대 오류를 보여주기 위해 몇 가지 빠른 시험을 달렸다. 각 샘플 크기 버킷은 20 회 실행되었으며 알 수 있듯이 꽤 명확한 추세가 있습니다.
ORDER BY RAND()
은 완벽하지는 않지만이 작업에 적합해야합니다.