Vorrei provare a provarlo per vedere quanto posso macellarlo. :-)
Quindi, per iniziare, devi essere in grado di creare un filtro di fioritura regolare che consenta un numero finito di elementi con una probabilità massima di un falso positivo. L'aggiunta di queste funzionalità al filtro di base è necessaria prima di tentare di creare un'implementazione scalabile.
Prima di provare a controllare e ottimizzare la probabilità, cerchiamo di capire qual è la probabilità per una determinata dimensione del filtro di fioritura.
Innanzitutto dividiamo il campo di bit per quante funzioni hash abbiamo (numero totale di bit / numero di funzioni hash = sezioni) per ottenere k sezioni di bit che rappresentano ogni funzione di hash, quindi ogni elemento è sempre descritto da k bit.
Se si aumenta il numero di sezioni o il numero di bit per sezione, la probabilità di falsi positivi diminuirà.
Ne consegue anche che quando vengono aggiunti elementi, vengono impostati più bit su 1, quindi aumentano i falsi positivi. Ci riferiamo a questo come al "rapporto di riempimento" di ogni sezione.
Quando il filtro contiene una grande quantità di dati, possiamo supporre che la probabilità di falsi positivi per questo filtro sia il rapporto di riempimento elevato al numero di sezioni (se dovessimo contare effettivamente i bit invece di utilizzare un rapporto, questo semplifica in una permutazione con problema di ripetizione).
Quindi, come possiamo capire come scegliere una probabilità di falsi positivi in un filtro di fioritura? Possiamo modificare il numero di sezioni (che influenzeranno il rapporto di riempimento).
Per capire quante fette dovremmo avere, iniziamo con il capire il rapporto di riempimento ottimale per una fetta. Poiché il rapporto di riempimento è determinato dal numero di bit in una sezione che sono 1 rispetto al numero di bit che sono 0, possiamo determinare che ciascun bit rimarrà non impostato con probabilità di (100% - (1 / bit in una sezione) ). Poiché avremo più elementi inseriti, abbiamo un'altra permutazione con problemi di reputazione ed espandiamo le cose al rapporto di riempimento previsto, che è (100% - ((100% - (1 / bit in una sezione)) ^ "elementi inseriti")). Bene, si scopre che questo è molto simile a un'altra equazione. Nel documento, mettono in relazione il rapporto di riempimento con un'altra equazione, quindi si adatta perfettamente a una serie di Taylor (1-e ^ (- n / m)). Dopo un po 'di inutilità con questo, si scopre che il rapporto di riempimento ottimale è sempre di circa il 50%,
Quindi, poiché la probabilità di un filtro è il rapporto di riempimento elevato al numero di sezioni, possiamo riempire il 50% e ottenere P = (50%) ^ k oppure k = log_2 (1 / P). Possiamo quindi utilizzare questa funzione per calcolare il numero di sezioni che dovremmo generare per un determinato filtro nell'elenco di filtri per un filtro bloom scalabile.
def slices_count(false_positive_probability):
return math.ceil(math.log(1 / false_positive_probability, 2))
Modifica: dopo aver scritto questo, mi sono imbattuto in una menzione della "regola del cinquanta per cento" quando ho letto sull'allocazione dinamica della memoria basata sul sistema amico in TAoCP Vol 1, pp 442-445 con un ragionamento molto più pulito rispetto al montaggio della curva (1 -e ^ (- n / m)). Knuth fa anche riferimento a un articolo "La regola del cinquanta per cento rivisitata" con un po 'di background sul concetto ( pdf disponibile qui ).