Saya sedang mengerjakan suatu algoritma yang perlu menghitung ukuran satu set yang dihasilkan oleh persimpangan setidaknya 2 set. Lebih spesifik:
Set yang berpotongan dihasilkan oleh query SQL, dan dalam upaya untuk menjaga hal-hal cepat, saya mendapatkan hitungan setiap query sebelumnya, kemudian mengambil set dengan jumlah terendah ( ) dan menggunakan ID tersebut sebagai batas pada sisa pertanyaan besar, sehingga persimpangan secara efektif menjadi:
Bahkan strategi ini membuat saya dengan beberapa pertanyaan yang cukup besar untuk dijalankan, karena terkadang bisa besar. Ide saya untuk berurusan dengan itu adalah mengambil sampel acak A 0 dan memotongnya dengan sisa set sebelum mengekstrapolasi kembali ke perkiraan z yang tepat . Pertanyaan saya adalah: apa cara terbaik untuk melakukan pengambilan sampel dan kemudian memperkirakan untuk kembali ke nilai z yang, jika tidak sepenuhnya akurat, memiliki rentang kesalahan yang dapat diprediksi?
Inilah yang saya coba sejauh ini (dalam kodesemu, semacam):
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)
Kode ini berfungsi, tetapi tampaknya secara konsisten melebih-lebihkan z
, dengan ukuran sampel yang lebih rendah menghasilkan perkiraan yang lebih tinggi. Selain itu, saya tidak yakin bagaimana ini akan skala dengan lebih dari dua set untuk berpotongan.
Saya harap pertanyaan ini masuk akal, beri tahu saya jika saya dapat mengklarifikasi lebih lanjut. Juga, jika pertanyaan ini di luar topik atau berada di tempat lain, beri tahu saya dan saya senang memindahkannya.
Per komentar Bill , saya menjalankan beberapa percobaan cepat untuk menunjukkan ukuran sampel vs kesalahan. Setiap ember ukuran sampel dijalankan 20 kali, dan seperti yang Anda lihat ada tren yang cukup jelas:
ORDER BY RAND()
, yang tidak sempurna tetapi harus cocok untuk tugas ini.