Le principe et la réalisation du filtre Bloom

1. Concepts de base

Bloom Filter (Bloom Filter) a été proposé par Bloom en 1970. Il s'agit en fait d'un très long vecteur binaire et d'une série de fonctions de mappage aléatoire . Les filtres Bloom peuvent être utilisés pour récupérer si un élément est dans une collection.
Son avantage est que l'efficacité de l'espace et le temps de requête dépassent de loin l'algorithme général, mais l'inconvénient est qu'il a un certain taux de méconnaissance et une difficulté de suppression.
Les robots d'exploration de Google doivent juger. Quelles pages ont été explorées.
Si vous voulez juger si un élément fait partie d'un ensemble, l'idée générale est d'enregistrer tous les éléments, puis de déterminer par comparaison. Les listes liées, les arbres et autres structures de données sont tous de cette façon de penser, mais à mesure que les éléments de la collection augmentent, nous avons besoin de plus en plus d'espace de stockage, et la vitesse de récupération devient de plus en plus lente (O (n), O (logn)) .
Cependant, il existe également une structure de données (un tableau dynamique + une fonction de hachage) appelée table de hachage (également appelée table de hachage) dans le monde. Il peut mapper un élément à un point dans un tableau de bits via une fonction Hash. De cette façon, il suffit de voir si ce point vaut 1 pour savoir s'il est dans l'ensemble. C'est l'idée de base du filtre Bloom.
Le problème auquel Hash est confronté est le conflit. En supposant que la fonction Hash est bonne, si la longueur de notre tableau de bits est de m points, alors si nous voulons réduire le taux de collision à, par exemple, 1%, cette table de hachage ne peut contenir que m / 100 éléments. De toute évidence, cela ne s'appelle pas à efficacité spatiale. La solution est également simple, consiste à utiliser plusieurs Hash, si l'un d'eux dit que l'élément n'est pas dans l'ensemble, il ne doit pas y être. S'ils disent tous oui, bien qu'il y ait une certaine possibilité qu'ils mentent, la probabilité de juger intuitivement de telles choses est relativement faible.
Bloom Filter est une structure de données aléatoires avec une efficacité spatiale très élevée. Il utilise des tableaux de bits pour exprimer un ensemble de manière très concise et peut juger si un élément appartient à cet ensemble. L'efficacité de Bloom Filter a un certain prix: lorsqu'on juge si un élément appartient à un certain ensemble, il est possible de confondre des éléments qui n'appartiennent pas à cet ensemble comme appartenant à cet ensemble (faux positif). Par conséquent, Bloom Filter n'est pas adapté à ces applications «sans erreur». Dans les applications où un faible taux d'erreur peut être toléré, Bloom Filter a réalisé de grandes économies d'espace de stockage avec très peu d'erreurs.
Pour résumer:
bloomfilter, bloom filter: déterminez rapidement si un élément est dans un ensemble énorme, mais il a une
faiblesse: il a un certain taux d'erreurs de jugement. Taux d'erreurs de jugement: des éléments qui n'existent pas à l'origine dans l'ensemble, Le filtre Bloom peut juger qu'il existe, mais si le filtre Bloom juge qu'un élément n'existe pas dans l'ensemble, alors l'élément ne doit pas être dans l'ensemble.

Deuxièmement, les avantages et les inconvénients des filtres de floraison

1. Avantages

Par rapport à d'autres structures de données, les filtres Bloom présentent d'énormes avantages dans l'espace et dans le temps.
(1) L'espace de stockage du filtre Bloom et le temps d'insertion / requête sont constants.
(2) De plus, les fonctions de hachage n'ont aucune relation les unes avec les autres, ce qui est pratique pour une implémentation parallèle par matériel.
(3) Le filtre Bloom n'a pas besoin de stocker l'élément lui-même, ce qui présente des avantages dans certaines occasions avec des exigences de confidentialité très strictes.
(4) Les filtres Bloom peuvent représenter l'ensemble complet, mais aucune autre structure de données;
(5) k et m sont identiques, et les opérations d'intersection et de différence de deux filtres Bloom utilisant le même ensemble de fonctions de hachage peuvent utiliser des opérations sur bits.
(6) Il peut déterminer rapidement la présence ou l'absence d'un élément, ce qui réduit considérablement l'échelle des données stockées.

2. Inconvénients

Mais les inconvénients et avantages des filtres Bloom sont tout aussi évidents.
(1) Le taux d'erreurs de calcul en fait partie. Lorsque le nombre d'éléments stockés augmente, le taux d'erreurs de calcul augmente. Mais si le nombre d'éléments est trop petit, une table de hachage est suffisante.
(2) De plus, en général, les éléments ne peuvent pas être supprimés du filtre Bloom. Il est facile pour nous de penser à transformer le tableau de bits en un tableau d'entiers, en ajoutant 1 au compteur correspondant à chaque élément inséré, pour que le compteur soit décrémenté lorsque l'élément est supprimé. Cependant, garantir une suppression sûre des éléments n'est pas si simple. Tout d'abord, nous devons nous assurer que l'élément supprimé est bien dans le filtre Bloom, ce qui n'est pas garanti par ce filtre seul.
(3) De plus, le contre-emballage posera également des problèmes. En termes de réduction du taux d'erreurs de calcul, de nombreux travaux ont conduit à l'émergence de nombreuses variantes de filtres Bloom.

3. Utiliser les considérations de scénario

(1) Il y a un certain taux d'erreur de jugement, donc si vous ne pouvez pas tolérer le taux d'erreur, le filtre Bloom n'est pas applicable;
(2) Le filtre Bloom ne prend pas en charge les opérations de suppression

Troisièmement, principe de réalisation

Le filtre Bloom nécessite un tableau de bits (similaire à bitmap (bitmap), un tableau d'octets) et des fonctions de mappage K (similaire à la table de hachage). Dans l'état initial, pour un tableau de bits de longueur m, son Tous les bits sont mis à 0.
Le principe et la réalisation du filtre Bloom

1. Ajouter des éléments au filtre Bloom

(1) Pour un ensemble S = {S1, S2 ... Sn} à n éléments, à travers k fonctions de mappage {f1, f2, ... fk};
(2) Mettre chacun des ensembles S Les éléments Sj (1 <= j <= n) sont mis en correspondance avec k valeurs {g1, g2 ... gk},
(3) puis le tableau correspondant [g1], tableau [g2] dans le tableau de bits. ..... array [gk] est défini sur 1.

2. Élément de requête du filtre Bloom

(1) Lors de l'interrogation de l'existence d'éléments W dans l'ensemble, passez W à travers la fonction de mappage de hachage {f1, f2, ... fk} pour obtenir l'ensemble g
(2) Obtenir les K valeurs de l'ensemble g {g1, g2 ... gk}, correspondant à k points sur le tableau de bits.
(3) Si l'un des k points n'est pas 1, on peut juger que l'élément ne doit pas exister dans l'ensemble. Inversement, si tous les k points sont 1, l'élément peut exister dans l'ensemble.
Remarque: Il n'est pas possible de juger si l'élément doit exister dans la collection, et il peut y avoir un certain taux d'erreurs d'appréciation. On peut le voir sur la figure: Supposons qu'un certain élément corresponde aux trois points 4, 5 et 6 du mappage. Bien que ces 3 points soient tous 1, il est évident que ces 3 points sont les positions obtenues en hachant différents éléments. Par conséquent, cette situation montre que bien que les éléments ne soient pas dans l'ensemble, ils peuvent correspondre à tous 1. C'est le taux d'erreurs de jugement La raison de l'existence.

3. Que faut-il faire lors de la personnalisation d'un filtre Bloom?

(1) initialisation d'un tableau de bits
(2) réalisation d'une fonction de hachage K
(3) opération d'insertion pour la requête et la
requête et les opérations d'insertion doivent être effectuées: les calculs de valeur de hachage insérés entrants, il y a plusieurs fonctions de hachage, calcule quelques Deuxièmement, la valeur de résultat calculée à chaque fois est basée sur cette valeur et la position correspondante dans le tableau de bits est remplacée par 1;
pour les opérations de requête, il vous suffit d'exécuter k fonctions de hachage sur la valeur de clé à interroger Appelez, puis jugez si l'une des valeurs calculées sur le tableau de dimensions correspondant aux k valeurs est 0, si l'une est 0, cela signifie que la clé n'est pas dans cet ensemble.

Quatre, fonction de hachage / table de hachage

1. Concept

Les éléments de la table de hachage sont déterminés par la fonction de hachage. La clé K de l'élément de données est utilisée comme variable indépendante. Grâce à une certaine relation fonctionnelle (appelée fonction de hachage), la valeur calculée est l'adresse de stockage de l'élément, c'est-à-dire que la position d'un élément dans la table de hachage est déterminée par Déterminé par la fonction de hachage.

2. Caractéristiques

(1) Si les deux valeurs de hachage ne sont pas les mêmes (selon la même fonction), alors l'entrée d'origine des deux valeurs de hachage n'est pas non plus la même.
(2) L'entrée et la sortie de la fonction de hachage ne correspondent pas uniquement. Si les deux valeurs de hachage sont identiques, les deux valeurs d'entrée sont probablement identiques. Mais cela peut aussi être différent. Cette situation est appelée "collision de hachage" (ou "collision de hachage").

3. Méthode de construction par hachage

(1) La méthode d'adressage direct
prend le mot-clé ou une valeur de fonction linéaire du mot-clé comme adresse de hachage. Autrement dit, H (clé) = clé ou H (clé) = akey + b (a, b sont des constantes).
(2) Méthode d'analyse numérique
Si le mot-clé est un nombre basé sur r (comme un nombre décimal basé sur 10), et que les mots-clés pouvant apparaître dans la table de hachage sont connus à l'avance, plusieurs mots-clés peuvent être utilisés Les chiffres forment une adresse de hachage.
(3) Mettre
au carré la méthode du milieu et prendre les chiffres du milieu après le mot-clé square est l'adresse de hachage, qui est plus couramment utilisée.
(4) La méthode de pliage
divise le mot-clé en plusieurs parties avec le même nombre de bits (le nombre de bits dans la dernière partie peut être différent), puis prend la somme superposée de ces parties (arrondie vers le haut) comme adresse de hachage. Il convient lorsque le mot-clé comporte un grand nombre de chiffres et que les chiffres de chaque chiffre du mot-clé sont à peu près uniformément répartis.
(5) En plus de la méthode du reste, la
clé est divisée par un nombre p non supérieur à la longueur m de la table de hachage, et le reste est l'adresse de hachage (p est un nombre premier)
H (clé) = clé MOD p, p <= m (Le plus simple et le plus couramment utilisé) Le choix de p est très important. En
général, p peut être choisi comme un nombre premier ou un nombre composé qui ne contient pas un facteur premier inférieur à 20 (les nombres composés se réfèrent à des entiers naturels qui peuvent être intégrés par 1 et lui-même, mais peuvent aussi être autres Numéro (sauf 0).

(6) La méthode des nombres aléatoires
sélectionne une fonction aléatoire et prend la valeur de la fonction aléatoire du mot-clé comme adresse de hachage. Autrement dit, H (clé) = rando (clé), où aléatoire est une fonction aléatoire. Applicable lorsque les mots clés sont de longueur différente.

Récapitulatif: dans le travail réel, différentes fonctions de hachage sont sélectionnées en fonction de différentes situations. En général, les facteurs suivants sont pris en compte:

(1) Le temps nécessaire pour calculer la fonction de hachage (y compris les facteurs d'instructions matérielles)

(2) Longueur des mots clés

(3) La taille de la table de hachage

(4) Répartition des mots-clés

(5) Fréquence de recherche d'enregistrement

4. Collision de hachage

Concept: Deux mots-clés différents ont la même valeur de résultat calculée par la même fonction de hachage.

5. Résoudre la collision de hachage

(1) La méthode de fermeture à glissière
extrait une liste liée dynamique au lieu d'une structure de stockage séquentielle statique, ce qui peut éviter le conflit de la fonction de hachage, mais l'inconvénient est que la conception de la liste liée est trop lourde, ce qui augmente la complexité de la programmation. Cette méthode peut éviter complètement le conflit de la fonction de hachage.
(2) La méthode
multi-hachage qui conçoit deux ou plusieurs fonctions de hachage peut éviter les conflits, mais il y a toujours des risques de conflits. Plus la fonction est conçue, meilleure ou plus, la probabilité peut être minimisée (sauf si le caractère est trop mauvais, sinon Presque impossible de conflit).
(3) Méthode d'adresse ouverte La méthode d'adresse
ouverte a une formule: Hi = (H (clé) + di) MOD mi = 1,2, ..., k (k <= m-1)
où m est une table de hachage La table est longue. di est la séquence incrémentielle lorsqu'un conflit survient.
Si la valeur de di peut être 1, 2, 3, ... m-1, appelez la détection linéaire, puis le hachage.
Si di prend 1, puis après chaque conflit, reculez d'une position.
Si la valeur de di peut être 1, -1,4, -4,9, -9,16, -16, ... kk, -kk (k <= m / 2), on appelle cela la deuxième détection puis le hachage.
Si la valeur de di peut être une séquence de nombres pseudo-aléatoires, on parle de détection pseudo-aléatoire puis de hachage.
(4) La méthode de construction de domaine
suppose que la plage de valeurs de la fonction de hachage est [0, m-1], puis le vecteur HashTable [0..m-1] est défini comme table de base, et le vecteur d'espace de stockage OverTable [0..v] est également configuré Utilisé pour stocker des enregistrements en conflit.

5. Estimation du taux de faux positifs

Maintenant que nous comprenons le principe de fonctionnement général du filtre Bloom, calculons le taux de faux positifs.

数组的大小:m 
总共的数据大小为:n 
hash函数的个数为:k

Supposons que la fonction de hachage dans le filtre Bloom satisfait l'hypothèse de hachage uniforme simple: chaque élément est haché avec une probabilité égale à l'un des m emplacements, et lequel des autres éléments est haché Slot n'a rien à voir. Si m est le nombre de bits, alors:
pour un certain bit, après qu'une certaine fonction de hachage est appelée sur un élément, la probabilité qu'elle passe à 1 est:
Le principe et la réalisation du filtre Bloom
pour un certain bit, une certaine fonction de hachage dans un élément La probabilité de ne pas être mis à 1 lors de l'insertion est: la probabilité
Le principe et la réalisation du filtre Bloom
qu'aucune des k fonctions de hachage ne soit mise à 1, c'est-à-dire la probabilité que le bit reste 0 après k fois de hachage:
Le principe et la réalisation du filtre Bloom

Si n éléments sont insérés, mais qu'ils ne sont pas mis à 1, c'est-à-dire après l'insertion de tous les éléments, la probabilité qu'un certain bit n'ait pas été changé en 1:
Le principe et la réalisation du filtre Bloom
alors cette position est mise à 1. La probabilité de (changé en 1), c'est-à-dire la probabilité qu'un certain bit soit changé en 1 après que tous les éléments sont insérés:
Le principe et la réalisation du filtre Bloom

Vérifiez maintenant si un élément est dans l'ensemble. Indique si un élément fait partie de l'ensemble. Les k positions requises sont définies sur "1" selon la méthode ci-dessus, mais cette méthode peut faire croire par erreur à l'algorithme qu'un élément qui ne fait pas partie de l'ensemble est détecté comme faisant partie de l'ensemble. Moyenne (faux positifs), c'est-à-dire que la probabilité que toutes les k positions soient égales à 1 est déterminée par la formule suivante:

Le principe et la réalisation du filtre Bloom

En fait, les résultats ci-dessus sont calculés en supposant que les positions des bits à définir calculées par chaque hachage sont indépendantes les unes des autres. Il n'est pas difficile de voir que lorsque m (taille du tableau de bits) augmente, les faux positifs (Faux La probabilité de positifs) diminuera, et à mesure que le nombre d'éléments insérés n augmentera, la probabilité de faux positifs augmentera à nouveau, pour un m, n donné.
(1) Le choix du nombre k de fonctions de hachage est déterminé par la formule suivante:

Le principe et la réalisation du filtre Bloom
Processus de dérivation:
À partir des résultats calculés ci-dessus, calculez maintenant la valeur de k pour les m et n donnés, ce qui peut minimiser le taux d'erreurs de jugement. Soit la fonction du taux d'erreurs de jugement k:
Le principe et la réalisation du filtre Bloom
traduire, c'est-à-dire que lorsque m et n sont déterminés, combien devrions-nous fixer k pour minimiser le taux d'erreurs de jugement?
Lorsque m et n sont déterminés, nous demandons a k pour minimiser la valeur de f (k).
Après avoir déterminé la relation entre k, m et n, nous pouvons nous assurer que le taux d'erreurs de jugement est le plus petit.
Premièrement, supposons que
Le principe et la réalisation du filtre Bloom
la formule ci-dessus soit simplifiée comme suit:
Le principe et la réalisation du filtre Bloom
Prenez le logarithme des deux côtés et obtenez: les
Le principe et la réalisation du filtre Bloom
deux côtés prennent la dérivée de k , déduit:
Le principe et la réalisation du filtre Bloom

Ensuite, pour trouver la meilleure valeur:
Le principe et la réalisation du filtre Bloom

et donc:
Le principe et la réalisation du filtre Bloom

Donc:
Le principe et la réalisation du filtre Bloom
Donc:
Le principe et la réalisation du filtre Bloom

Le taux d'erreurs de jugement à ce moment: On
Le principe et la réalisation du filtre Bloom
peut voir que si le taux d'erreurs de jugement doit être ≤1 / 2, alors:
Le principe et la réalisation du filtre Bloom

(2) Pour une probabilité p donnée de faux positifs, la formule de sélection de la taille optimale du tableau de bits m est:
Le principe et la réalisation du filtre Bloom

La formule ci-dessus montre que la taille du tableau de bits est préférable pour avoir une relation linéaire avec le nombre d'éléments insérés. Pour un m, n, k donné, la probabilité maximale de faux positifs est:

Le principe et la réalisation du filtre Bloom

6. Mise en œuvre du code

(1) Implémentation de code Python


import mmh3
from bitarray import bitarray

# zhihu_crawler.bloom_filter

# Implement a simple bloom filter with murmurhash algorithm.
# Bloom filter is used to check wether an element exists in a collection, and it has a good performance in big data situation.
# It may has positive rate depend on hash functions and elements count.

BIT_SIZE = 5000000

class BloomFilter:

    def init(self):
        # Initialize bloom filter, set size and all bits to 0
        bit_array = bitarray(BIT_SIZE)
        bit_array.setall(0)

        self.bit_array = bit_array

    def add(self, url):
        # Add a url, and set points in bitarray to 1 (Points count is equal to hash funcs count.)
        # Here use 7 hash functions.
        point_list = self.get_postions(url)

        for b in point_list:
            self.bit_array[b] = 1

    def contains(self, url):
        # Check if a url is in a collection
        point_list = self.get_postions(url)

        result = True
        for b in point_list:
            result = result and self.bit_array[b]

        return result

    def get_postions(self, url):
        # Get points positions in bit vector.
        point1 = mmh3.hash(url, 41) % BIT_SIZE
        point2 = mmh3.hash(url, 42) % BIT_SIZE
        point3 = mmh3.hash(url, 43) % BIT_SIZE
        point4 = mmh3.hash(url, 44) % BIT_SIZE
        point5 = mmh3.hash(url, 45) % BIT_SIZE
        point6 = mmh3.hash(url, 46) % BIT_SIZE
        point7 = mmh3.hash(url, 47) % BIT_SIZE

        return [point1, point2, point3, point4, point5, point6, point7]```

# 7、总结
在计算机科学中,我们常常会碰到时间换空间或者空间换时间的情况,即为了达到某一个方面的最优而牺牲另一个方面。Bloom Filter在时间空间这两个因素之外又引入了另一个因素:错误率。在使用Bloom Filter判断一个元素是否属于某个集合时,会有一定的错误率。也就是说,有可能把不属于这个集合的元素误认为属于这个集合(False Positive),但不会把属于这个集合的元素误认为不属于这个集合(False Negative)。在增加了错误率这个因素之后,Bloom Filter通过允许少量的错误来节省大量的存储空间。
自从Burton Bloom在70年代提出Bloom Filter之后,Bloom Filter就被广泛用于拼写检查和数据库系统中。近一二十年,伴随着网络的普及和发展,Bloom Filter在网络领域获得了新生,各种Bloom Filter变种和新的应用不断出现。可以预见,随着网络应用的不断深入,新的变种和应用将会继续出现,BloomFilter必将获得更大的发展。

Je suppose que tu aimes

Origine blog.51cto.com/12824426/2555710
conseillé
Classement