Ein HyperLogLog ist eine probabilistische Datenstruktur . Es zählt die Anzahl der verschiedenen Elemente in einer Liste. Aber im Vergleich zu einer einfachen Methode (eine Menge zu haben und Elemente zur Menge hinzuzufügen) geschieht dies ungefähr.
Bevor Sie sich ansehen, wie der HyperLogLog-Algorithmus dies tut, müssen Sie verstehen, warum Sie ihn benötigen. Das Problem mit einem einfachen Weg ist, dass es Platz verbraucht O(distinct elements)
. Warum gibt es hier eine große O-Notation statt nur bestimmter Elemente? Dies liegt daran, dass Elemente unterschiedliche Größen haben können. Ein Element kann ein 1
anderes Element sein "is this big string"
. Wenn Sie also eine große Liste (oder einen großen Strom von Elementen) haben, wird viel Speicherplatz benötigt.
Probabilistisches Zählen
Wie kann man eine vernünftige Schätzung einer Reihe einzigartiger Elemente erhalten? Angenommen, Sie haben eine Zeichenfolge mit einer Länge, m
die {0, 1}
mit gleicher Wahrscheinlichkeit besteht. Wie groß ist die Wahrscheinlichkeit, dass es mit 0, mit 2 Nullen, mit k Nullen beginnt? Es ist 1/2
, 1/4
und 1/2^k
. Dies bedeutet, dass Sie, wenn Sie auf eine Zeichenfolge mit k
Nullen gestoßen sind, ungefähr 2^k
Elemente durchgesehen haben . Das ist also ein guter Ausgangspunkt. Wenn Sie eine Liste von Elementen haben, die gleichmäßig verteilt sind, 0
und 2^k - 1
Sie die maximale Anzahl des größten Präfixes von Nullen in der Binärdarstellung zählen können, erhalten Sie eine vernünftige Schätzung.
Das Problem ist, dass die Annahme, gleichmäßig verteilte Zahlen von 0
t zu haben, 2^k-1
zu schwer zu erreichen ist (die Daten, auf die wir gestoßen sind, sind meist keine Zahlen, fast nie gleichmäßig verteilt und können zwischen beliebigen Werten liegen. Mit einer guten Hashing-Funktion können Sie dies jedoch annehmen Die Ausgangsbits wären gleichmäßig verteilt und die meisten Hashing-Funktionen hätten Ausgänge zwischen 0
und 2^k - 1
( SHA1 gibt Werte zwischen 0
und an 2^160
). Bisher haben wir also erreicht, dass wir die Anzahl der eindeutigen Elemente mit der maximalen Kardinalität der k
Bits nur durch Speichern abschätzen können Eine Anzahl von log(k)
Größenbits. Der Nachteil ist, dass wir eine große Abweichung in unserer Schätzung haben. Eine coole Sache, die wir fast geschaffen habenDas probabilistische Zählpapier von 1984 (es ist ein bisschen schlauer mit der Schätzung, aber wir sind immer noch nah dran).
LogLog
Bevor wir weitermachen, müssen wir verstehen, warum unsere erste Schätzung nicht so gut ist. Der Grund dafür ist, dass ein zufälliges Auftreten eines hochfrequenten 0-Präfix-Elements alles verderben kann. Eine Möglichkeit, dies zu verbessern, besteht darin, viele Hash-Funktionen zu verwenden, das Maximum für jede der Hash-Funktionen zu zählen und sie am Ende zu mitteln. Dies ist eine ausgezeichnete Idee, die die Schätzung verbessern wird, aber LogLog-Papier verwendete einen etwas anderen Ansatz (wahrscheinlich, weil Hashing ziemlich teuer ist).
Sie verwendeten einen Hash, teilten ihn aber in zwei Teile. Einer wird als Bucket bezeichnet (die Gesamtzahl der Buckets ist 2^x
) und ein anderer - entspricht im Grunde unserem Hash. Es war schwer für mich zu verstehen, was los war, also werde ich ein Beispiel geben. Angenommen , Sie haben zwei Elemente und Ihre Hash - Funktion , die Werte Form gibt 0
zu 2^10
2 erzeugten Werte: 344
und 387
. Sie haben sich für 16 Eimer entschieden. Also hast du:
0101 011000 bucket 5 will store 1
0110 000011 bucket 6 will store 4
Wenn Sie mehr Eimer haben, verringern Sie die Varianz (Sie verbrauchen etwas mehr Platz, aber es ist immer noch winzig). Mit mathematischen Fähigkeiten konnten sie den Fehler quantifizieren (was ist 1.3/sqrt(number of buckets)
).
HyperLogLog
HyperLogLog führt keine neuen Ideen ein, verwendet jedoch meistens viel Mathematik, um die vorherige Schätzung zu verbessern. Forscher haben herausgefunden, dass Sie die Schätzung erheblich verbessern, wenn Sie 30% der größten Zahlen aus den Eimern entfernen. Sie verwendeten auch einen anderen Algorithmus zur Mittelung von Zahlen. Das Papier ist mathematisch schwer.
Und ich möchte mit einem kürzlich erschienenen Artikel abschließen , der eine verbesserte Version des hyperLogLog-Algorithmus zeigt (bis jetzt hatte ich keine Zeit, ihn vollständig zu verstehen, aber vielleicht werde ich diese Antwort später verbessern).