Permettez-moi d'essayer de donner un coup à ceci pour voir combien je peux l'abattre. :-)
Donc, pour commencer, vous devez être en mesure de créer un filtre de floraison régulier qui permet un nombre fini d'éléments avec une probabilité maximale de faux positif. L'ajout de ces fonctionnalités à votre filtre de base est requis avant de tenter de créer une implémentation évolutive.
Avant d'essayer de contrôler et d'optimiser la probabilité, voyons quelle est la probabilité pour une taille de filtre de floraison donnée.
D'abord, nous divisons le champ binaire par le nombre de fonctions de hachage que nous avons (nombre total de bits / nombre de fonctions de hachage = tranches) pour obtenir k tranches de bits qui représentent chaque fonction de hachage afin que chaque élément soit toujours décrit par k bits.
Si vous augmentez le nombre de tranches ou le nombre de bits par tranche, la probabilité de faux positifs diminue.
Il s'ensuit également qu'à mesure que des éléments sont ajoutés, plus de bits sont mis à 1, donc les faux positifs augmentent. Nous appelons cela le "taux de remplissage" de chaque tranche.
Lorsque le filtre contient une grande quantité de données, nous pouvons supposer que la probabilité de faux positifs pour ce filtre est le rapport de remplissage élevé au nombre de tranches (si nous devions réellement compter les bits au lieu d'utiliser un rapport, cela se simplifie en une permutation avec problème de répétition).
Alors, comment pouvons-nous comprendre comment choisir une probabilité de faux positifs dans un filtre de bloom? Nous pouvons modifier le nombre de tranches (ce qui affectera le taux de remplissage).
Pour déterminer le nombre de tranches que nous devrions avoir, nous commençons par déterminer le taux de remplissage optimal pour une tranche. Étant donné que le taux de remplissage est déterminé par le nombre de bits dans une tranche qui sont 1 par rapport au nombre de bits qui sont 0, nous pouvons déterminer que chaque bit restera non défini avec une probabilité de (100% - (1 / bits dans une tranche) ). Puisque nous allons avoir plusieurs éléments insérés, nous avons une autre permutation avec un problème de réputation et nous étendons les choses au taux de remplissage attendu, qui est (100% - ((100% - (1 / bits dans une tranche)) ^ "éléments insérés")). Eh bien, il s'avère que c'est très similaire à une autre équation. Dans l'article, ils relient le taux de remplissage à une autre équation, de sorte qu'il s'intègre bien dans une série de taylor (1-e ^ (- n / m)). Après un peu de futzing avec cela, il s'avère que le taux de remplissage optimal est toujours d'environ 50%,
Donc, comme la probabilité d'un filtre est le rapport de remplissage élevé au nombre de tranches, nous pouvons remplir 50% et obtenir P = (50%) ^ k ou k = log_2 (1 / P). Nous pouvons ensuite utiliser cette fonction pour calculer le nombre de tranches que nous devons générer pour un filtre donné dans la liste des filtres pour un filtre de bloom évolutif.
def slices_count(false_positive_probability):
return math.ceil(math.log(1 / false_positive_probability, 2))
Edit: Après avoir écrit ceci, je suis tombé sur une mention de la "règle des cinquante pour cent" lors de la lecture de l'allocation de mémoire dynamique basée sur le système de copains dans TAoCP Vol 1, pp 442-445 avec un raisonnement beaucoup plus propre que l'ajustement de la courbe à (1 -e ^ (- n / m)). Knuth fait également référence à un article "La règle des cinquante pour cent revisité" avec un peu de contexte sur le concept ( pdf disponible ici ).