Exemple d'application: Le filtre de Bloom
. Les tables de hachage sont utiles dans bien des cas. Si le
nombre de cles a stocker est tres grand (comme, par
exemple dans la cas d’une base de donnees) alors la taille
de la table est telle qu’il est necessaire de la stocker sur le
disque.
. L’inconvenient a cela est que si on doit de nombreuses
fois tester l’existence d’un element dans la table cela peut
devenir tres lourd en terme de temps d'acces.
. Le filtre de Bloom permet d'eviter des appels inutiles a
une tres grande base de donnees en verifiant tout de suite
qu'un element recherchee n'y est pas present.
. Le filtre n'etant pas parfait, la recherche inutile aura
toutefois lieu dans certains cas, mais une grande partie sera
neanmoins evitee (faux positif).
. Cette methode est utilisee par exemple par Google dans
leur base de donnees distribuees.
Principe de fonctionnement du Filtre de Bloom
. Le filtre de Bloom est une structure de donnees qui a pour
but de limiter les requetes inutiles : pour tester la presence
d’un element dans la base de donnees (disque) on interroge
l’oracle (le Filtre de Bloom) avant d’interroger la base de
donnees.
. L’objectif est de concevoir un oracle qui reponde
rarement oui lorsque l’element n’est pas dans la table.
. Le type d’oracle que nous allons implanter est lui-meme
une table de hachage : il s’agit du filtre de Bloom.
. L’idee est la suivante : On cree une table B de booleens.
On dispose pour les elements que nous avons a ranger d’un
certain nombre k de fonctions de hachage hi,0≤i≤k−1.
. Pour chaque element e a ajouter a B, au lieu de se
contenter de mettre a vrai la case B(h(e)) comme on le ferait
classiquement, on va mettre a vrai les k cases B(hi(e)).
. Le principe etant que la probabilite que deux elements
differentes aient les memes k valeurs pour leurs fonctions
de hachage, soit faible.
. Par exemple, supposons que nous souhaitions entrer
l'element “machin” dans la table B de taille 24 et que nous
disposons de quatre fonctions de hachage avec :
h0("machin")=2
h1("machin")=12
h2("machin")=3
h3("machin")=20
L’etat de la table B apres l’insertion sera de:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
Une case à 1=vrai et faux si la case est à 0.
. Pour savoir si un élément n’est pas présent il suffit qu’une
au moins des k cases de la table B correspondant aux
valeurs des k fonctions de hachage soit positionné a faux.
. Pour savoir si un élément est présent, on s’assurera que les
k cases de la table B correspondant aux valeurs des k
fonctions de hachage sont positionnées a vrai.
. Mais dans ce cas il peut y avoir « collision », c’est a dire
qu’il existe (avec une certaine probabilite) une cle
differente pour laquelle les k cases de la table B
correspondant aux valeurs des k fonctions de hachage
soient positionnees a vrai aussi :
C’est ce qu’on appelle : « un faux positif »
Estimation des faux positifs
.Le filtre de Bloom ne fournit aucun faux negatifs, mais
seulement des faux positifs.
. Pour compenser ce probleme, nous pouvons creer le filtre
de façon a minimiser le nombre de faux positifs via les trois
parametres suivants :
n = La taille du vecteur de booléen
m = Le nombre d'éléments stockés dans la base de données
k = Le nombre de fonction de hachage
. Considerons une position j dans le filtre de Bloom :
– La probabilite qu'une fonction de hachage fasse passer
la valeur de j de 0 a 1 est de 1/n.
– Par consequent, la probabilite que la valeur de j ne
change pas est donc de:
(1-1/n)
. Apres avoir rempli le vecteur booleen, avec m elements
et k fonctions de hachage, la probabilite de ne pas
changer j est de :
(1-1/n)km
. Cette equation peut se reduire en considerant l'egalite
approximative suivante:
(1-1/n)n = 1/e = e-1
. L'equation precedente peut se reduire alors :
(1-1/n)km = e-km/n
. Au final, la probabilite d'avoir des faux positifs equivaut
a la probabilite d'avoir toutes les positions du vecteur
booleen a 1 pour les k fonctions de hachage. On obtient
ainsi la formule finale suivante:
Pfaux_positif=(1−e-km/n)k
Exemple
Si nous souhaitons mettre en place un filtre de Bloom pour
une base de donnee stockee sur disque avec le risque d'une
fausse consultation estimee p=0.1, (une chance sur 10
d'avoir un faux positif), alors il faut choisir les parametres
n, k et m tel que :
(1−e-km/n)k <= 0,1