Ne kadar kasap yapabileceğimi görmek için bunu denememe izin verin. :-)
Bu nedenle, başlamak için, maksimum yanlış pozitif olasılığına sahip sınırlı sayıda öğeye izin veren düzenli bir çiçeklenme filtresi oluşturabilmeniz gerekir. Ölçeklenebilir bir uygulama oluşturmaya çalışmadan önce bu özelliklerin temel filtrenize eklenmesi gerekir.
Olasılığın ne olduğunu kontrol etmeye ve optimize etmeye çalışmadan önce, belirli bir bloom filtre boyutu için olasılığın ne olduğunu anlayalım.
İlk önce her bir hash fonksiyonunu temsil eden k bit dilimlerini elde etmek için bit alanını kaç hash fonksiyonumuza (toplam bit sayısı / hash fonksiyonlarının sayısı = dilim) böleriz, böylece her eleman her zaman k bitleri tarafından tanımlanır.
Dilim sayısını veya dilim başına bit sayısını artırırsanız, yanlış pozitif olasılığı azalacaktır.
Ayrıca, elemanlar eklendikçe, daha fazla bit 1'e ayarlandığından, yanlış pozitifler artar. Buna her dilimin "doldurma oranı" diyoruz.
Filtre büyük miktarda veri içerdiğinde, bu filtre için yanlış pozitif olma olasılığının dilim sayısına yükseltilen doldurma oranı olduğunu varsayabiliriz (Bir oranı kullanmak yerine bitleri gerçekten sayacak olsaydık, tekrar sorunu olan bir permütasyon).
Peki, bir çiçek filtresinde yanlış pozitif olasılığını nasıl seçeceğimizi nasıl anlayabiliriz? Dilim sayısını değiştirebiliriz (doldurma oranını etkiler).
Kaç dilim almamız gerektiğini anlamak için, bir dilim için en uygun doldurma oranını bulmaya başlıyoruz. Doldurma oranı bir dilimdeki bit sayısı ile 1 olan bit sayısı ile belirlendiğinden, 0 olan bit sayısına göre, her bitin (% 100 - (bir dilimde 1 / bit) olasılığı ile ayarlanmadan kalacağını belirleyebiliriz. ). Birden fazla öğe ekleyeceğimiz için, itibar sorunuyla başka bir permütasyonumuz var ve işleri beklenen doluluk oranına genişletiyoruz, bu da (% 100 - ((% 100 - (bir dilimde 1 / bit)) ^ "öğeler eklendi")). Bunun başka bir denkleme çok benzediği ortaya çıktı. Bu makalede, doldurma oranını başka bir denkleme bağlarlar, böylece bir taylor serisine (1-e ^ (- n / m)) iyi uyum sağlar. Bununla biraz heyecanlandıktan sonra, optimum dolum oranının her zaman yaklaşık% 50 olduğu ortaya çıkıyor,
Bu nedenle, bir filtrenin olasılığı dilim sayısına yükseltilmiş dolgu oranı olduğundan,% 50'yi doldurabilir ve P = (% 50) ^ k veya k = log_2 (1 / P) elde edebiliriz. Ardından bu işlevi, ölçeklenebilir bir çiçek filtresi filtresi listesinde belirli bir filtre için oluşturmamız gereken dilim sayısını hesaplamak için kullanabiliriz.
def slices_count(false_positive_probability):
return math.ceil(math.log(1 / false_positive_probability, 2))
Düzenleme: Bunu yazdıktan sonra, (1 elli yüzde kural "bir söz geldi eğri uydurma karşı çok daha temiz bir akıl yürütme ile TAoCP Vol 1, s. 442-445 dost sistem tabanlı dinamik bellek ayırma okurken -e ^ (- n / m)). Knuth ayrıca, kavram hakkında biraz bilgi sahibi olan "yüzde elli kural yeniden ziyaret edildi" başlıklı makaleye atıfta bulunmaktadır ( pdf burada bulunabilir ).