Sono in procinto di implementare un filtro Bloom conteggio. Questa struttura dati è definita come un array di bit e un parametro "width", W .
L'array di bit memorizza numeri interi senza segno, la cui dimensione è determinata da W , in un array di uint64
s. Pertanto, ci si aspetta che la dimensione dei numeri interi non sia multiplo di 8 . Ad esempio, W = 4 (valore massimo = 15) è una scelta popolare. Inoltre, ci si aspetta che gli interi non rispettino necessariamente i confini dei byte . W = 3, è anche un valore accettabile. La dimensione massima per W , tuttavia è 8.
Quindi, un array di bit con W = 4 deve essere interpretato come tale:
+----+----+----+----+----+----+----+----+----+----+----+----+----+----
| uint4 | uint4 | uint4 | ...
+----+----+----+----+----+----+----+----+----+----+----+----+----+----
Allo stesso modo, un array di bit con W = 2 deve essere interpretato come:
+----+----+----+----+----+----+----+----+----+----+----+----+----+----
| uint2 | uint2 | uint2 | uint2 | uint2 | uint2 | ...
+----+----+----+----+----+----+----+----+----+----+----+----+----+----
Questa struttura dati deve supportare tre operazioni distinte:
- Leggi i-th uintW
- Incrementa l'i-th uintW
- Riduci l'i-es uWW
Il decremento di un uintW sotto 0 è un comportamento indefinito. L'incremento di un valore uint sopra il valore massimo è anch'esso un comportamento indefinito.
Domande
- Quale algoritmo può implementare queste operazioni su un array di bit supportato da un array di
uint64
s? - Esiste una soluzione senza allocazione e / o senza filiali? L'idea qui è di avere la soluzione più performante possibile, dal momento che i filtri Bloom hanno una brutta abitudine di essere chiamati miliardi di volte in loop stretti.