Un HyperLogLog est une structure de données probabiliste . Il compte le nombre d'éléments distincts dans une liste. Mais par rapport à une manière simple de le faire (avoir un ensemble et ajouter des éléments à l'ensemble), il le fait de manière approximative.
Avant de regarder comment l'algorithme HyperLogLog fait cela, il faut comprendre pourquoi vous en avez besoin. Le problème avec un moyen simple est qu'il consomme O(distinct elements)
de l'espace. Pourquoi y a-t-il une grosse notation O ici au lieu de seulement des éléments distincts? En effet, les éléments peuvent être de différentes tailles. Un élément peut être 1
un autre élément "is this big string"
. Donc, si vous avez une liste énorme (ou un énorme flux d'éléments), cela prendra beaucoup de mémoire.
Comptage probabiliste
Comment peut-on obtenir une estimation raisonnable d'un certain nombre d'éléments uniques? Supposons que vous ayez une chaîne de longueur m
composée de {0, 1}
avec une probabilité égale. Quelle est la probabilité qu'il commence par 0, avec 2 zéros, avec k zéros? C'est 1/2
, 1/4
et 1/2^k
. Cela signifie que si vous avez rencontré une chaîne avec des k
zéros, vous avez approximativement parcouru les 2^k
éléments. C'est donc un bon point de départ. Avoir une liste d'éléments qui sont répartis uniformément entre 0
et 2^k - 1
vous pouvez compter le nombre maximum du plus grand préfixe de zéros dans la représentation binaire et cela vous donnera une estimation raisonnable.
Le problème est que l'hypothèse d'avoir des nombres uniformément répartis à partir de 0
t 2^k-1
est trop difficile à réaliser (les données que nous avons rencontrées ne sont généralement pas des nombres, presque jamais uniformément distribuées, et peuvent être entre toutes les valeurs. Mais en utilisant une bonne fonction de hachage, vous pouvez supposer que les bits de sortie seraient uniformément répartis et la plupart des fonctions de hachage ont des sorties entre 0
et 2^k - 1
( SHA1 vous donne des valeurs entre 0
et 2^160
). Donc, ce que nous avons réalisé jusqu'à présent, c'est que nous pouvons estimer le nombre d'éléments uniques avec la cardinalité maximale de k
bits en ne stockant que un certain nombre de log(k)
bits de taille . L'inconvénient est que nous avons un énorme écart dans notre estimation. Une chose cool que nous avons presque crééePapier de comptage probabiliste de 1984 (c'est un peu plus intelligent avec l'estimation, mais nous sommes quand même proches).
LogLog
Avant d'aller plus loin, nous devons comprendre pourquoi notre première estimation n'est pas si bonne. La raison en est qu'une occurrence aléatoire d'un élément de préfixe 0 haute fréquence peut tout gâcher. Une façon de l'améliorer est d'utiliser de nombreuses fonctions de hachage, de compter au maximum pour chacune des fonctions de hachage et à la fin de les faire la moyenne. C'est une excellente idée, qui améliorera l'estimation, mais le papier LogLog a utilisé une approche légèrement différente (probablement parce que le hachage est assez cher).
Ils ont utilisé un hachage mais l'ont divisé en deux parties. L'un s'appelle un seau (le nombre total de seaux est 2^x
) et l'autre - est fondamentalement le même que notre hachage. J'ai eu du mal à comprendre ce qui se passait, alors je vais donner un exemple. Supposons que vous ayez deux éléments et votre fonction de hachage qui donne la forme de valeurs 0
aux 2^10
2 valeurs produites: 344
et 387
. Vous avez décidé d'avoir 16 seaux. Donc vous avez:
0101 011000 bucket 5 will store 1
0110 000011 bucket 6 will store 4
En ayant plus de seaux, vous diminuez la variance (vous utilisez un peu plus d'espace, mais il est encore minuscule). En utilisant des compétences en mathématiques, ils ont pu quantifier l'erreur (ce qui est 1.3/sqrt(number of buckets)
).
HyperLogLog
HyperLogLog n'introduit aucune nouvelle idée, mais utilise principalement beaucoup de mathématiques pour améliorer l'estimation précédente. Les chercheurs ont constaté que si vous supprimez 30% des plus grands nombres des seaux, vous améliorez considérablement l'estimation. Ils ont également utilisé un autre algorithme pour calculer la moyenne des nombres. Le papier est lourd en mathématiques.
Et je veux terminer avec un article récent, qui montre une version améliorée de l'algorithme hyperLogLog (jusqu'à présent, je n'ai pas eu le temps de le comprendre pleinement, mais peut-être que plus tard j'améliorerai cette réponse).