Обчислення приблизної сукупності фільтра цвітіння


12

Дано фільтр розпускання розміром N-біт і K хеш-функцій, з яких встановлено M-біти (де M <= N) фільтра.

Чи можна наблизити кількість елементів, вставлених у фільтр розпускання?

Простий приклад

Я роздумував над наступним прикладом, припускаючи BF зі 100-бітових та 5 хеш-функцій, де встановлено 10-бітові ...

Найкращий сценарій: якщо припустити, що хеш-функції справді ідеальні та унікально відображають трохи значень X кількості значень, то задані 10-бітові значення можна сказати, що у BF було вставлено лише 2 елементи

Найгірший сценарій: якщо припустити, що хеш-функції погано і послідовно відображаються в одному і тому ж біті (все-таки унікальному між собою), то можна сказати, що 10 елементів було вставлено в BF

Діапазон, здається, є [2,10], де відставання в цьому діапазоні, ймовірно, визначається хибнопозитивною ймовірністю фільтра - я застряг у цій точці.


4
Чому б не зберегти лічильник кількості вставлених елементів? Це займе лише додаткові біти , якщо ви вставили n елементів. O(logn)n
Джо

@Joe, хоча це гарна ідея, але це руйнує справді цікаве питання.
dan_waterworth

Зауваживши лише, що з дублікатами, метод Джо матиме невелику помилку, оскільки ми завжди не можемо точно сказати при додаванні елемента, чи він вже присутній (і, отже, ми повинні збільшувати кількість чи ні).
usul

Відповіді:


5

Так. З Вікіпедії :

Якщо ви вставили елементи у фільтр розміром n за допомогою k- хеш-функцій, ймовірність того, що певний біт все ще дорівнює 0, дорівнюєink

z=(11n)ki

Ви можете виміряти цю ймовірність як пропорцію 0 біт у вашому фільтрі. Рішення для даєi

i=ln(z)kln(11n)

Я використовував це на практиці, і поки ваш фільтр не перевищує його ємність, помилка, як правило, менше 0,1% для фільтрів до мільйонів біт. Оскільки фільтр перевищує його ємність, помилка звичайно збільшується.


3

Якщо ви припускаєте, що для кожної хеш-функції для кожного об’єкта біт встановлюється рівномірно випадково, і у вас є підрахунок кількості встановлених бітів, ви повинні мати можливість обмежити ймовірність того, що кількість вставлених об'єктів було в певному діапазоні, можливо, використовуючи рецептуру кульок і бункерів. Кожен біт - це бін, і він встановлюється, якщо в ньому є щонайменше 1 куля, кожен вставлений об'єкт кидає куль, де k - кількість хеш-функцій, а n k - кількість кульок, викинутих після того, як було вставлено n об’єктів . З огляду на те, що b bins має принаймні 1 кульку, яка ймовірність того, що принаймні т кульок було кинуто? Я думаю, що тут ви можете використовувати той факт, що: kknknbt Але проблема з цією формулюванням полягає в тому, що я не бачу прямого способу обчислити P ( t ) або P ( b ) , але знайти значення t, яке максимально збільшує цю ймовірність, не повинно бути занадто важким.

P(t balls|b bins)=P(b bins|t balls)P(t)/P(b)
P(t)P(b)т

2

Цікаве запитання, давайте розглянемо деякі конкретні випадки.

Нехай будуть клавіші, n o n бітів, n t o t a l бітів усього та m елементів вставлено. Спершу спробуємо знайти функцію P ( k , n o n , n t o t a l , m ), яка є ймовірністю виникнення стану.knonntotalmP(k,non,ntotal,m)

Якщо , то P ( k , n o n , n t o t a l , m ) повинно бути 0 , тобто це неможливість.km<nonP(k,non,ntotal,m)0

Якщо , то ми шукаємо ймовірність того, що до м хеші потрапляють в одне відро, то перший можна відзначити , де інші повинні йти. Отже, ми хочемо знайти ймовірність того, що к m - 1 хешів потрапляє у певне відро.non=1kmkm1

P(k,1,ntotal,m)=(1/ntotal)(km1)

Ось справді прості випадки закінчилися. Якщо то ми хочемо знайти ймовірність того, що k m омиває землю у двох різних відрах і щонайменше 1 падіння в кожне. Є n t o t a l ( n t o t a l - 1 ) пари відер і ймовірність того, що земля хешу в будь-якій конкретній 2 дорівнює ( 2 / n t o t a l ) k mnon=2km21ntotal(ntotal1)2(2/ntotal)kmтому ймовірність того, що хеші потраплять до відрів, така:2

ntotal(ntotal1)(2/ntotal)km

Ми вже знаємо ймовірність того, що вони потраплять у відро, тому давайте віднімемо це, щоб дати ймовірність, що вони потраплять рівно за 2 .12

P(k,2,ntotal,m)=ntotal(ntotal1)(2/ntotal)km(1/ntotal)(km1)

Я думаю, ми можемо це узагальнити зараз.

P(k,non,ntotal,m)=(ntotalnon)(noн/нтотал)км-i=1i<нонП(к,i,нтотал,м)

Я не зовсім впевнений, як зробити цю формулу більш прихильною до обчислень. Наївно реалізовано, це призведе до експоненціального часу виконання, хоча тривіально за допомогою запам'ятовування досягти лінійного часу. Тоді це лише випадок знаходження найбільш ймовірного . Мій інстинкт говорить, що буде один пік, тому його можна буде знайти дуже швидко, але наївно, ви можете точно знайти найвірогідніший m в O ( n 2 ) .мО(н2)


Я думаю, що ваша формула скасовується до (ігнорування постійних факторів). Ви можете обчислити максимум цього аналітично: розгорніть перший коефіцієнт другого члена і видаліть постійні фактори, щоб позбутися від усіх, і тоді ваша формула стане дуже простою. (нтоталнон)нонкм-(нтоталнон-1)(нон-1)кмn choose k
Жуль

@Jules, чудово, я був впевнений, що щось подібне станеться, але не встиг це зрозуміти.
dan_waterworth

Ви також можете прийти до цієї формули безпосередньо таким чином: . Потім підключіть ( n t o t a lP(non=x)=P(nonx)P(non<x)=P(nonx)P(nonx1)дляP(nonx). (ntotalx)(x/ntotal)kmP(nonx)
Жуль

2

Припустимо, хеші розподілені рівномірно.

Нехай - кількість вставлених хешей. Так як у нас є я хеш в м бункера , якщо є я - 1 хеши в м бункера , а наступний хеш переходить в один з тих м з п бункерів або якщо у нас я - 1 хеши Into м - 1 Лари і наступний хеш йде в один з інших n - ( m - 1 ) бункерів, ми маємо:iimi1mmni1m1n(m1)

P(m,i)=P(m,i1)(m/n)+P(m1,i1)(n(m1))/n

Переписування:

P(m,i)=1n(mP(m,i1)+(nm+1)P(m1,i1))

Маємо також і P ( m , 0 ) = 0, коли m 0 і P ( 0 , i ) = 0, коли i 0 . Це дає вам алгоритм динамічного програмування O ( m i ) для обчислення P. Обчислення i, що максимізує P ( m , i )P(0,0)=1P(m,0)=0m0P(0,i)=0i0O(mi)iP(m,i) дає максимальну оцінку ймовірності.

Якщо ми знаємо , що ми хешіруемся в цьому цвітіння фільтрувального раз і ми маємо K хеш за одиницю, то число елементів є я / к .iki/k

Щоб пришвидшити це, ви можете зробити кілька речей. Коефіцієнт не можна залишати, оскільки це не змінює положення максимуму. Ви можете поділитись таблицями динамічного програмування з кількома викликами наP(m,i),щоб зменшити (асимптотичний) час роботи доO(nm). Якщо ви готові вірити, що існує єдиний максимум, ви можете зупинити ітерацію наiрано і отримати час роботиO(jm),деj- точка, деPнабирає максимум, або навіть виконати двійковий пошук і отриматиO(mlogn).1nP(m,i)O(nm)iO(jm)jPO(mlogn)


2

Ключова ідея - наблизити очікування числа нульового біта.

Для кожного біта можливість нульового значення після t вставки з K хеш-функціями становить: .(11N)KteKtN

Тоді очікування нульових бітових чисел повинно бути:

апроксимація спостереженняN-MNeKtNNM

Нарешті ми отримали t=NKln(1MN)


1

Ймовірність того, що певний біт дорівнює 1 після n вставки, становить: P = 1 - (1 - 1 / м) ^ (kn)

Нехай X_i - дискретна випадкова величина, яка дорівнює 1, якщо біт в i-й позиції дорівнює 1, а інакше 0. Нехай X = X_1 + X_2 + .... + X_m. Тоді E [X] = m * P.

Якщо загальна кількість заданих бітів дорівнює S, то: E [X] = S, що означає m * P = S. Це може бути вирішено для n.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.