Estou trabalhando em um algoritmo que precisa calcular o tamanho de um conjunto gerado pelas interseções de pelo menos 2 conjuntos. Mais especificamente:
Os conjuntos que são cruzados são gerados por consultas SQL e, em um esforço para manter as coisas rápidas, recebo uma contagem de cada consulta com antecedência, depois pego o conjunto com a contagem mais baixa ( ) e utilizo esses IDs como limites no restante das grandes consultas, para que a interseção se torne efetivamente:
Até essa estratégia me deixa com algumas consultas muito grandes para executar, poisàs vezes pode ser grande. Minha idéia para lidar com isso é pegar uma amostra aleatória de e -la com o restante dos conjuntos antes de extrapolar para uma estimativa adequada de . Minha pergunta é: qual é a melhor maneira de realizar amostragem e extrapolar para retornar a um valor de que, se não for totalmente preciso, tem um intervalo de erro previsível?A 0 z z
Aqui está o que eu tentei até agora (em pseudocódigo, mais ou 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)
Esse código funciona, mas parece superestimar consistentemente z
, com um tamanho de amostra menor produzindo uma estimativa mais alta. Além disso, não tenho certeza de como isso seria dimensionado com mais de dois conjuntos para interseção.
Espero que essa pergunta faça sentido, deixe-me saber se posso esclarecer mais alguma coisa. Além disso, se esta questão estiver fora do tópico ou pertencer a outro lugar, entre em contato. Fico feliz em movê-la.
Pelo comentário de Bill , fiz alguns testes rápidos para mostrar o tamanho da amostra versus o erro. Cada balde de tamanho de amostra foi executado 20 vezes e, como você pode ver, há uma tendência bastante clara:
ORDER BY RAND()
, o que não é perfeito, mas deve ser adequado para esta tarefa.