Biarkan saya mencoba untuk mencoba ini untuk melihat seberapa banyak saya bisa membantai itu. :-)
Jadi, untuk memulai, Anda harus dapat membuat filter bloom reguler yang memungkinkan sejumlah elemen hingga dengan kemungkinan maksimum false positive. Penambahan fitur-fitur ini ke filter dasar Anda diperlukan sebelum mencoba membangun implementasi yang skalabel.
Sebelum kita mencoba mengendalikan dan mengoptimalkan berapa probabilitasnya, mari kita cari tahu berapa probabilitas untuk ukuran filter bloom yang diberikan.
Pertama kita membagi bitfield dengan berapa banyak fungsi hash yang kita miliki (jumlah total bit / jumlah fungsi hash = irisan) untuk mendapatkan k irisan bit yang mewakili masing-masing fungsi hash sehingga setiap elemen selalu dijelaskan oleh k bit.
Jika Anda menambah jumlah irisan atau jumlah bit per irisan, kemungkinan positif palsu akan berkurang.
Ini juga mengikuti bahwa ketika elemen ditambahkan, bit lebih banyak ditetapkan ke 1, sehingga positif palsu meningkat. Kami menyebut ini sebagai "rasio isian" dari setiap irisan.
Ketika filter memegang sejumlah besar data, kita dapat mengasumsikan bahwa probabilitas positif palsu untuk filter ini adalah rasio pengisian yang dinaikkan ke jumlah irisan (Jika kita benar-benar menghitung bit daripada menggunakan rasio, ini menyederhanakan menjadi permutasi dengan masalah pengulangan).
Jadi, bagaimana kita mengetahui cara memilih probabilitas positif palsu dalam filter mekar? Kita dapat memodifikasi jumlah irisan (yang akan mempengaruhi rasio isian).
Untuk mengetahui berapa banyak irisan yang harus kita miliki, kita mulai dengan mencari tahu rasio pengisian optimal untuk irisan. Karena rasio pengisian ditentukan oleh jumlah bit dalam slice yang 1 versus jumlah bit yang 0, kita dapat menentukan bahwa setiap bit akan tetap tidak disetel dengan probabilitas (100% - (1 / bit dalam slice) ). Karena kita akan memiliki beberapa item yang dimasukkan, kita memiliki permutasi lain dengan masalah reputasi dan kami memperluas hal-hal ke rasio isi yang diharapkan, yaitu (100% - ((100% - (1 / bit dalam sepotong)) ^ "elemen dimasukkan")). Nah, ternyata ini sangat mirip dengan persamaan lain. Dalam makalah, mereka menghubungkan rasio pengisian dengan persamaan lain sehingga cocok dengan baik ke seri taylor (1-e ^ (- n / m)). Setelah sedikit kesal dengan ini, ternyata rasio pengisian optimal selalu sekitar 50%,
Jadi, karena probabilitas filter adalah rasio pengisian yang dinaikkan ke jumlah irisan, kita dapat mengisi 50% dan mendapatkan P = (50%) ^ k atau k = log_2 (1 / P). Kita kemudian dapat menggunakan fungsi ini untuk menghitung jumlah irisan yang harus kita hasilkan untuk filter yang diberikan dalam daftar filter untuk filter bloom yang dapat diskalakan.
def slices_count(false_positive_probability):
return math.ceil(math.log(1 / false_positive_probability, 2))
Sunting: Setelah menulis ini, saya menemukan penyebutan "aturan lima puluh persen" ketika membaca tentang alokasi memori dinamis berbasis sistem buddy di TAoCP Vol 1, hlm 442-445 dengan alasan yang jauh lebih bersih dibandingkan dengan menyesuaikan kurva ke (1 -e ^ (- n / m)). Knuth juga mereferensikan sebuah makalah "Aturan lima puluh persen ditinjau kembali" dengan sedikit latar belakang konsep ( pdf tersedia di sini ).