2009-03-18 9 views
12

Wikipedia sagt:Wie viele Hash-Funktionen benötigt mein Bloom-Filter?

Ein leerer Bloom-Filter ist ein Bit-Array von m Bits, die alle auf 0 gesetzt gibt auch verschiedene Hash-Funktionen definiert sein muss, k, von denen jede Karte oder Hashes einige Satzelement nach einem der das M-Array positioniert mit einer gleichmäßigen Zufallsverteilung.

Ich habe den Artikel gelesen, aber was ich nicht verstehe, ist, wie k bestimmt wird. Ist es eine Funktion der Tabellengröße?

Außerdem habe ich in Hashtabellen, die ich geschrieben habe, einen einfachen, aber effektiven Algorithmus verwendet, um automatisch die Hash-Größe zu vergrößern. Grundsätzlich, wenn mehr als 50% der Eimer in der Tabelle gefüllt waren, würde ich die Größe des Tisches verdoppeln. Ich vermute, dass Sie dies vielleicht noch mit einem Bloom-Filter tun möchten, um falsche Positive zu reduzieren. Richtig?

Antwort

17

Wenn Sie weiter unten in der Wikipedia article about Bloom filters lesen, dann finden Sie einen Abschnitt Wahrscheinlichkeit von Fehlalarmen. In diesem Abschnitt wird erläutert, wie die Anzahl der Hash-Funktionen die Wahrscheinlichkeiten von Fehlalarmen beeinflusst, und Sie erhalten die Formel, um k aus dem gewünschten erwarteten Prob zu bestimmen. von falsch positiven.


Zitat von Wikipedia:

Offensichtlich ist die Wahrscheinlichkeit einer falsch Positiven nimmt ab, wenn M (die Anzahl von Bits in dem Array) zunimmt, und zunimmt, wenn n (die Anzahl von eingefügten Elementen) erhöht. Für eine gegebene m und n, der Wert von k (die Anzahl von Hash- Funktionen), die die Wahrscheinlichkeit minimiert ist

formula

37

Gegeben:

  • n: wie viele Elemente Sie in Ihrem Filter erwarten (z. 216,553)
  • p: Ihre akzeptable falsch positive Rate {0..1} (z.B.0.01 → 1%)

wollen wir berechnen:

  • m: die Anzahl der Bits in dem Bloom-Filter benötigt
  • k: die Anzahl der Hash-Funktionen sollten wir anwenden

Die Formeln:

m = -n*ln(p)/(ln(2)^2)die Anzahl der Bits
k = m/n * ln(2)die Anzahl der Hash-Funktionen

In unserem Fall:

  • m = -216553*ln(0.01)/(ln(2)^2) = 997263/0.48045 = 2,075,686 Bits (253 kB)
  • k = m/n * ln(2) = 2075686/216553 * 0.693147 = 6.46 Hash-Funktionen (7 Hash-Funktionen)

Hinweis: Jeder in Public Domain freigegeben Code. Keine Zuordnung erforderlich.

+0

einfach perfekt. danke –

+0

Beachten Sie, dass aufgrund von Rundungs ​​/ Abschneidungsunterschieden und/oder der Genauigkeit der Logarithmusfunktion möglicherweise nicht die exakt gleichen Zahlen für das Beispiel angezeigt werden, wenn Sie diese Gleichungen in der Sprache Ihrer Wahl ausführen. Für mich sind 'm = 2075674' und' k = 6.64'. So oder so, runden Sie beide Werte auf die nächste ganze Zahl auf, und Ihre falsche positive Rate ist nahe genug. Es wäre interessant, die Gleichung zu haben, um den * tatsächlichen * Wert von 'p' neu zu berechnen, indem man die berechneten/gerundeten 'm' und' k' Werte verwendet. Auch hier sollte man sich keine Sorgen machen müssen, genaue Werte zu haben. Baseballstadion ist gut genug. –

+0

Die Gleichung gefunden, um den tatsächlichen Wert von 'p' zu berechnen, wenn man' m' und 'k' berechnet - interessant zu vergleichen, um zu sehen, wie eine Rundung Ihre annehmbare falsche positive Rate beeinflusst haben könnte. 'e' ist die mathematische Konstante, kein dynamischer Wert. 'p = e^(- (m/n) * (ln (2)^2))' - Danke an http://stackoverflow.com/a/24071581/2609094 –

Verwandte Themen