Estoy trabajando en un algoritmo que necesita calcular el tamaño de un conjunto generado por las intersecciones de al menos 2 conjuntos. Más específicamente:
Los conjuntos que se entrecruzan son generados por consultas SQL, y en un esfuerzo por mantener las cosas rápidas, obtengo un recuento de cada consulta con anticipación, luego tomo el conjunto con el recuento más bajo ( ) y uso esas ID como límites en el resto de las grandes consultas, por lo que la intersección se convierte efectivamente:
Incluso esta estrategia me deja con algunas consultas bastante grandes para ejecutar, ya queA veces puede ser grande. Mi idea para lidiar con eso es tomar una muestra aleatoria de e intersecarla con el resto de los conjuntos antes de extrapolar nuevamente a una estimación adecuada de . Mi pregunta es: ¿cuál es la mejor manera de tomar muestras y luego extrapolar para volver a un valor de que, si no es del todo exacto, tiene un rango de error predecible?
Esto es lo que he probado hasta ahora (en pseudocódigo, más o menos):
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)
Este código funciona, pero parece sobreestimar constantemente z
, con un tamaño de muestra más bajo que produce una estimación más alta. Además, no estoy seguro de cómo esto se escalaría con más de dos conjuntos para cruzarse.
Espero que esta pregunta tenga sentido, avíseme si puedo aclarar algo más. Además, si esta pregunta está fuera de tema o pertenece a otro lugar, por favor avíseme y me complace moverla.
Según el comentario de Bill , realicé algunas pruebas rápidas para mostrar el tamaño de la muestra frente al error. Cada segmento de tamaño de muestra se ejecutó 20 veces y, como puede ver, hay una tendencia bastante clara:
ORDER BY RAND()
, lo que no es perfecto, pero debería ser adecuado para esta tarea.