Sto lavorando a un algoritmo che deve calcolare la dimensione di un set generato dalle intersezioni di almeno 2 set. Più specificamente:
Gli insiemi che si intersecano sono generati da query SQL e, nel tentativo di mantenere le cose velocemente, ottengo un conteggio di ogni query in anticipo, quindi prendo l'insieme con il conteggio più basso ( ) e uso quegli ID come limiti su il resto delle grandi query, quindi l'intersezione diventa effettivamente:
Anche questa strategia mi lascia con alcune domande piuttosto grandi da eseguire, poiché a volte può essere grande. La mia idea per affrontare questo è prendere un campione casuale di A 0 e intersecarlo con il resto degli insiemi prima di estrapolare di nuovo una stima corretta di z . La mia domanda è: qual è il modo migliore per eseguire il campionamento e quindi l'estrapolazione per tornare a un valore di z che, se non del tutto accurato, ha un intervallo di errori prevedibile?
Ecco cosa ho provato finora (in pseudocodice, una sorta di):
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)
Questo codice funziona, ma sembra sopravvalutare costantemente z, con una dimensione del campione inferiore che produce una stima più elevata. Inoltre, non sono sicuro di come questo si ridimensionerebbe con più di due set da intersecare.
Spero che questa domanda abbia un senso, fammi sapere se posso chiarire qualcosa di più. Inoltre, se questa domanda è fuori tema o appartiene a qualche altra parte, per favore fatemi sapere e sono felice di spostarla.
Per il commento di Bill , ho eseguito alcune prove rapide per mostrare la dimensione del campione contro l'errore. Ogni bucket di dimensioni del campione è stato eseguito 20 volte e come puoi vedere c'è una tendenza abbastanza chiara:

ORDER BY RAND(), il che non è perfetto ma dovrebbe essere adatto a questo compito.
