ฉันกำลังทำงานกับอัลกอริทึมที่ต้องการคำนวณขนาดของชุดที่สร้างโดยจุดตัดของชุดอย่างน้อย 2 ชุด โดยเฉพาะอย่างยิ่ง:
ชุดที่ถูก intersected สร้างขึ้นโดยแบบสอบถาม SQL และในความพยายามที่จะทำให้สิ่งต่าง ๆ รวดเร็วฉันได้รับการนับของแต่ละแบบสอบถามก่อนเวลาแล้วนำชุดที่มีจำนวนต่ำสุด ( ) และใช้ ID เหล่านั้นเป็นขอบเขตบน ข้อความค้นหาขนาดใหญ่ที่เหลือดังนั้นการแยกจึงมีประสิทธิภาพ:
แม้แต่กลยุทธ์นี้ก็ทำให้ฉันมีข้อความค้นหาที่น่าสนใจจำนวนมากที่จะเรียกใช้ตั้งแต่บางครั้งอาจมีขนาดใหญ่ ความคิดของฉันสำหรับการรับมือกับที่มีการสุ่มตัวอย่างของและตัดกับส่วนที่เหลือของชุดก่อนที่จะกลับไปคะเนการประมาณการที่เหมาะสมของZคำถามของฉันคือ: วิธีที่ดีที่สุดในการสุ่มตัวอย่างแล้วคาดการณ์ว่าจะกลับไปสู่ค่าของนั่นคือถ้าไม่ถูกต้องทั้งหมดมีช่วงข้อผิดพลาดที่คาดเดาได้?
นี่คือสิ่งที่ฉันได้ลองมาแล้ว (ใน pseudocode เรียงลำดับ):
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
โดยมีขนาดตัวอย่างที่ต่ำกว่าซึ่งให้ผลการประมาณที่สูงขึ้น นอกจากนี้ฉันไม่แน่ใจว่าจะขยายขนาดได้มากกว่าสองชุดเพื่อตัดกันอย่างไร
ฉันหวังว่าคำถามนี้สมเหตุสมผลโปรดแจ้งให้เราทราบหากฉันสามารถชี้แจงเพิ่มเติมได้ นอกจากนี้หากคำถามนี้ไม่ได้อยู่ในหัวข้อหรืออยู่ที่อื่นโปรดแจ้งให้เราทราบและฉันยินดีที่จะย้าย
ต่อความคิดเห็นของ Billฉันใช้การทดลองอย่างรวดเร็วเพื่อแสดงขนาดตัวอย่างและข้อผิดพลาด ที่เก็บตัวอย่างแต่ละขนาดทำงาน 20 ครั้งและอย่างที่คุณเห็นมีแนวโน้มที่ชัดเจน:
ORDER BY RAND()
ซึ่งไม่สมบูรณ์ แต่ควรเหมาะสำหรับงานนี้