2009-03-18 17 views
12

Wikipedia mówi:Ile funkcji mieszania wymaga mój filtr kwitnienia?

Pusta filtr Bloom jest tablicą nieco bitów m, ustawiony na 0. Nie może być również k różne funkcje hash zdefiniowane, z których każdy mapy lub skróty pewien zbiór elementów do jednego z pozycje m tablicy z jednolitym rozkładem losowym.

Przeczytałem artykuł, ale nie rozumiem, w jaki sposób k jest określony. Czy jest to funkcja rozmiaru stołu?

Ponadto w tablicach hashowych napisałem, że użyłem prostego, ale efektywnego algorytmu automatycznego zwiększania rozmiaru hasza. Zasadniczo, jeśli zostało wypełnione więcej niż 50% kubełków w tabeli, podwoiłbym rozmiar stołu. Podejrzewam, że nadal możesz chcieć to zrobić z filtrem bloom, aby zmniejszyć liczbę fałszywych alarmów. Poprawny?

Odpowiedz

17

Jeśli przeczytacie w dalszej części Wikipedia article about Bloom filters, a następnie znaleźć sekcja Prawdopodobieństwo fałszywych alarmów. W tej sekcji wyjaśniono, w jaki sposób liczba funkcji skrótu wpływa na prawdopodobieństwo fałszywych trafień i podaje formułę do określenia wartości k z żądanego oczekiwanego prob. fałszywych alarmów.


żądanie z Wikipedia:

Oczywiście, prawdopodobieństwo fałszywych alarmów zmniejsza się o (numer bitów w tablicy) zwiększa się, a zwiększa się n (liczba wstawionych elementów ) wzrasta. Dla danego mi n, wartość k (liczba hash funkcji), która minimalizuje prawdopodobieństwo jest

formula

37

Dane:

  • n: Ile elementów oczekujesz w filtrze (np. 216,553)
  • p: akceptowalna liczba fałszywych trafień {0..1} (np.0.01 → 1%)

chcemy obliczyć:

  • m: liczba bitów potrzebnych w filtrze rozkwicie
  • k: liczba funkcji skrótu powinniśmy zastosować

Formuły:

m = -n*ln(p)/(ln(2)^2)liczba bitów
k = m/n * ln(2)liczba funkcji mieszających

W naszym przypadku

  • m = -216553*ln(0.01)/(ln(2)^2) = 997263/0.48045 = 2,075,686 bitów (253 kB)
  • k = m/n * ln(2) = 2075686/216553 * 0.693147 = 6.46 funkcje skrótu (hash) 7 funkcji

Note: każdy kod wydany w domenie publicznej. Atrybucja nie jest wymagana.

+0

idealny. dziękuję –

+0

Zauważ, że ze względu na zaokrąglenia/ścięcie różnic i/lub precyzję funkcji logarytmicznej, możesz nie uzyskać dokładnie tych samych liczb dla przykładu, jeśli uruchomisz te równania przez wybrany przez ciebie język. Dla mnie "m = 2075674" i "k = 6,64". Tak czy inaczej, zaokrąglij obie wartości do najbliższej liczby całkowitej, a twoja liczba fałszywych trafień będzie wystarczająco bliska. Byłoby interesujące, gdyby równanie ponownie obliczyło * rzeczywistą * wartość 'p', używając obliczonych/zaokrąglonych wartości' m' i 'k'. Ponownie, nie powinno być potrzeby martwić się o dokładne wartości; Ballpark jest wystarczająco dobry. –

+0

Znalazłem równanie, aby obliczyć rzeczywistą wartość 'p' podaną przez obliczone' m' i 'k' - interesujące do porównania, aby sprawdzić, jak zaokrąglenie mogło mieć wpływ na akceptowalną liczbę fałszywych trafień. 'e' jest stałą matematyczną, a nie wartością dynamiczną. 'p = e^(- (m/n) * (ln (2)^2))' - dzięki http://stackoverflow.com/a/24071581/2609094 –

Powiązane problemy