Filtrul Bloom este o structură de date probabilistică inventată de Burton Bloom în 1970 [1] , care permite verificarea dacă un element aparține unei mulțimi . În acest caz, este posibil să obțineți un fals pozitiv (nu există niciun element în set, dar structura datelor raportează că este), dar nu un fals negativ .
Filtrul Bloom poate folosi orice cantitate de memorie , prestabilită de utilizator, și cu cât este mai mare, cu atât este mai puțin probabil să fie fals pozitiv. Operația de adăugare a elementelor noi la set este acceptată, dar nu ștergerea celor existente (cu excepția cazului în care se folosește modificarea cu contoare).
Filtrul Bloom este un bitmap de m biți . Inițial, când structura de date stochează setul gol , toți m biți sunt setați la zero. Utilizatorul trebuie să definească k funcții hash independente h 1 , …, h k , fiecare dintre ele mapează un set de elemente într-un set de putere m. (Cu alte cuvinte, funcția hash atribuie fiecărui element un număr de la 1 la m.) Pentru fiecare element e , biții matricei cu numere h 1 ( e ), ..., h k ( e ) egale cu valorile funcțiilor hash sunt setate la 1.
Pentru a verifica dacă elementul e aparține mulțimii elementelor stocate, este necesar să se verifice starea biților h 1 ( e ), …, h k ( e ). Dacă cel puțin unul dintre ei este egal cu zero, elementul nu poate aparține mulțimii (altfel, atunci când a fost adăugat, toți acești biți ar fi setați). Dacă toate sunt egale cu unul, atunci structura de date spune că e poate aparține mulțimii. În acest caz, pot apărea două situații: fie elementul aparține cu adevărat mulțimii, fie toți acești biți au fost setați întâmplător la adăugarea altor elemente, ceea ce este sursa fals pozitive în această structură de date.
Independenţa funcţiilor hash asigură probabilitatea minimă de repetare a indicilor h k ( e ) prin minimizarea numărului de biţi setat la 1 de mai multe ori. (Și aceasta este o sursă majoră de fals pozitive.)
Fie dimensiunea matricei de biți să fie egală cu m biți și sunt date k funcții hash. Să presupunem că mulțimea de funcții hash este aleasă aleatoriu, iar pentru orice element x , fiecare funcție hash h i îi atribuie unul dintre locurile din harta de biți cu probabilitate egală
și, în plus, valorile sunt variabile aleatoare independente colectiv (pentru a simplifica analiza ulterioară).
Atunci probabilitatea ca o unitate să nu fie scrisă pe un bit p -al-lea în timpul operației de inserare a următorului element este egală cu
Și probabilitatea ca bitul p --lea să rămână egal cu zero după introducerea a n elemente diferite x 1 , ..., x n în filtrul Bloom inițial gol este egală cu
pentru m suficient de mare în vederea celei de-a doua limite remarcabile .
Un fals pozitiv este că pentru un element y care nu este egal cu niciunul dintre elementele inserate, toți k biți cu numere h i ( y ) vor fi non-zero, iar filtrul Bloom va răspunde în mod eronat că y este inclus în mulțime a elementelor inserate. Probabilitatea unui astfel de eveniment este aproximativ egală cu
Evident, această probabilitate scade odată cu creșterea m (dimensiunea matricei de biți) și crește odată cu creșterea n (numărul de elemente inserate). Pentru m și n fix , numărul optim k (numărul de funcții hash) care îl minimizează este
În acest caz, probabilitatea unui fals pozitiv este egală cu
În consecință, rețineți că, pentru ca filtrul Bloom să suporte o probabilitate fals pozitivă mărginită dată, dimensiunea hărții de bit trebuie să fie liniar proporțională cu numărul de elemente inserate.
În comparație cu tabelele hash, filtrul Bloom poate gestiona cu câteva ordine de mărime mai puțină memorie, sacrificând determinismul. Este folosit de obicei pentru a reduce numărul de solicitări de date inexistente într-o structură de date cu acces mai scump (de exemplu, situată pe un hard disk sau pe o bază de date de rețea), adică pentru a „filtra” cererile către aceasta.
Exemple de aplicații practice: