私は、少なくとも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
で、サンプルサイズが小さいほど、推定値が高くなります。さらに、交差する2つ以上のセットでこれがどのようにスケーリングされるかはわかりません。
この質問が理にかなっているといいのですが、さらに明確にすることができるかどうか知らせてください。また、この質問がトピックから外れている場合、または別の場所にある場合は、お知らせください。移動させていただきます。
パービルのコメント、私はサンプルサイズの対エラーを表示するためにいくつかの簡単な裁判を走りました。各サンプルサイズのバケットは20回実行されました。ご覧のとおり、かなり明確な傾向があります。
ORDER BY RAND()
。これは完全ではありませんが、このタスクに適しています。