Filtre de Bloom

Structure de données probabiliste, utilisant des fonctions de hachage pour enregistrer un ensemble d’éléments dans un espace mémoire limité, et permettant de vérifier si un élément donné appartient à l’ensemble.

En informatique, et plus précisément en algorithmique, un filtre de Bloom est une structure de données inventée par Burton Howard Bloom en 1970. C'est une implémentation du type abstrait Ensemble. Cette structure est probabiliste, c'est-à-dire qu'elle utilise des probabilités, et que sa correction est probabiliste. Plus précisément, lors du test de la présence d'un élément dans un ensemble, un filtre de Bloom permet de savoir :

  • avec certitude l'absence d'un élément (il ne peut pas y avoir de faux négatif) ;
  • avec une certaine probabilité la présence d'un élément (il peut y avoir des faux positifs).

La taille d'un filtre de Bloom est fixe et indépendante du nombre d'éléments contenus, ce qui en fait une structure très compacte. L'inconvénient est toutefois qu'il y a d'autant plus de faux positifs qu'il y a d'éléments dans la structure. Le principe du filtre est le même que pour le hachage.

DescriptionModifier

 
Un exemple de filtre de Bloom de l'ensemble (x, y, z). Les flèches de couleurs indiquent les bits qui correspondent à cet élément. On peut tester le fait que l'élément w n'appartient pas à l'ensemble, car tous ses bits ne sont pas à 1.

Un filtre de Bloom est constituée d'un tableau de bits de taille m, ainsi qu'une collection de k fonctions de hachage  . Chaque fonction de hachage associe tout élément à une case du tableau[1]. En général, k est une constante qui dépend du taux de faux positifs souhaité, tandis que m est proportionnel à k et au nombre d'éléments à ajouter.

Description formelleModifier

Soit U l'univers de tous les éléments que pourrait contenir l'ensemble considéré. Par exemple, U est l'ensemble des entiers sur 32 bits, ou un ensemble de mots. Le filtre a deux composantes[2] :

  • T : un tableau de bits de taille m dont chaque case est initialisée à 0. (indexé de 1 à m)
  •   : k fonctions de hachage de  .

OpérationsModifier

Pour ajouter un élément  , on met des 1 dans les cases d'indice  .

Pour tester si un élément   est présent, on vérifie que les cases d'indice   contiennent toutes un 1. Il se peut que le test d'appartenance renvoie vrai alors que l'élément est absent, c'est un faux positif.

Les éléments ne peuvent pas être retirés de l'ensemble (bien que cela soit possible avec certaines variantes telles que les filtres de Bloom par comptage (en)).

PropriétésModifier

Espace mémoireModifier

Le filtre de Bloom utilise un espace constant. C'est son principal intérêt.

Proportion de faux-positifsModifier

Il est possible d'évaluer la proportion de faux-positifs en fonction de divers paramètres. Ainsi, si l'on considère une fonction de hachage qui choisit un élément de l'ensemble de manière équiprobable, et que m représente le nombre de bits dans le tableau, alors la probabilité qu'un bit donné soit laissé à 0 par une fonction de hachage donnée lors de l'insertion d'un élément vaut  .

Généralisons ceci à un ensemble contenant exactement k fonctions de hachage. La probabilité qu'un bit donné soit laissé à 0 par l'une des fonctions de hachage lors de l'insertion d'un élément est  .

Si l'on considère à présent que l'on insère n éléments (par exemple des chaînes de caractères, etc.), la probabilité qu'un bit donné vaille 0 vaut  . On en déduit que la probabilité que ce bit vaille 1 est  

Ainsi, si l'on teste la probabilité de présence d'un élément qui n'est pas dans l'ensemble, chaque position k possède la probabilité ci-dessus de valoir 1. Si l'on suppose (et cette supposition est fausse) que ces événements sont indépendants, la probabilité que tous les k vaillent 1 (déclenchant un faux-positif) découle des calculs précédents :  

La formule ci-dessus suppose que la probabilité que chaque bit vaille 1 est indépendante des autres bits, ce qui est faux, et peut mener à des résultats significativement différents quand   est élevé[3]. Au contraire, quand le rapport   est faible, le taux d'erreur tend effectivement vers la valeur ci-dessus.

La formule exacte est plus complexe, et vaut :

 

Cette valeur peut être calculée récursivement. Cependant, il est simple d'utiliser l'encadrement suivant, donné par Bose et al. [4] :

 

UtilisationsModifier

Bases de donnéesModifier

Un filtre de Bloom permet d'éviter des appels inutiles à une très grande base de données en vérifiant tout de suite l'absence d'une ligne recherchée. Le filtre n'étant pas parfait, la recherche inutile aura toutefois lieu dans certains cas, mais une grande partie sera néanmoins évitée, multipliant ainsi le nombre de requêtes utiles possibles à matériel donné. Cette méthode est utilisée par Google dans leur base de données distribuées, BigTable[5].

Bio-informatiqueModifier

Les filtres de Bloom sont utilisés en bio-informatique pour la recherche rapide de motifs dans des larges jeux de données génomiques[6].

Inspection de paquetsModifier

Ce type de filtre est également utilisé pour réaliser de l'inspection de paquets en profondeur[7][Quoi ?], en vertu des raisons citées plus haut. Leur implémentation au niveau matériel a permis de réaliser de l'inspection de paquets en profondeur à la vitesse du réseau.

Flux pair à pairModifier

Elle permet aussi d'optimiser les flux entre pairs[Quoi ?] dans un réseau informatiques pairs à pairs, comme Gnutella[8].

Rendu HTMLModifier

Ce filtre est utilisé dans les moteurs de rendu HTML pour augmenter les performances des sélecteurs CSS[9].

RéférencesModifier

  1. « Bloom filters, streaming algorithms, the count-min sketch », sur Université d'Illinois, .
  2. Antoine Genitrini, « Algorithmique avancée : Méthode de hachage », sur Université Pierre-et-Marie-Curie, .
  3. (en) Ken Christensen, Allen Roginsky, Miguel Jimeno, « A new analysis of the false positive rate of a Bloom filter », Information Processing Letters, vol. 110, no 21,‎ , p. 944-949 (lire en ligne).
  4. (en) Prosenjit Bose, Hua Guo, Evangelos Kranakis, Anil Maheshwari, Pat Morin, Jason Morrison, Michiel Smid, Yihui Tang, « On the false-positive rate of Bloom filters », Information Processing Letters, vol. 108, no 4,‎ , p. 210-213 (lire en ligne).
  5. Fay Chang, Jeffrey Dean, Sanjay Ghemawat, Wilson C Hsieh, Deborah A Wallach, Mike Burrows, Tushar Chandra, Andrew Fikes  et Robert E Gruber, « Bigtable: A distributed storage system for structured data, », ACM Transactions on Computer Systems (TOCS), ACM, vol. 26, no 2,‎ , p. 4 (lire en ligne)
  6. Camille Marchet, « Data structures based on k-mers for querying large collections of sequencing datasets »,
  7. Deep packet Inspection using parallel Bloom Filters
  8. Sasu Tarkoma, « Overlay and P2P Networks Unstructured networks », .
  9. (en) Nicole Sullivan, « CSS Selector Performance has changed! (For the better) », sur Performance Calendar, .

BibliographieModifier

  • Burton H. Bloom, « Space/Time Trade-offs in Hash Coding with Allowable Errors », Commun. ACM, vol. 13, no 7,‎ , p. 422-426 (présentation en ligne)

Liens externesModifier