İki veri yapısının karma çarpışmalarla nasıl başa çıktığı eksik. Bloom filtreleri gerçek değerleri depolamaz, bu nedenle gerekli alan belirlenen dizinin sabit boyutudur. Bunun yerine geleneksel bir karma kullanırsanız, verdiğiniz tüm değerleri depolamaya çalışır, böylece zamanla büyür.
Basitleştirilmiş bir karma işlevini düşünün (sadece örnek için!) f(x) = x % 2
. Şimdi giriş aşağıdaki tamsayılar: 2, 3, 4, 5, 6, 7
.
Standart Hash: Verilen değerler hash edilecektir ve bu nedenle çok sayıda çarpışma ile sonuçlanıyoruz.f(2) = f(4) = f(6) = 0
ve f(3) = f(5) = f(7) = 1
. Bununla birlikte, karma tüm bu değerleri depolar ve 8
içinde saklanmadığını söyleyebilir. Bunu nasıl yapıyor? Çarpışmaları izler ve tüm değerleri aynı karma değerle depolar, ardından sorguladığınızda, ek olarak sorgunuzu karşılaştırır. Bu yüzden haritayı şu şekilde sorgulayalım 8
: f(8) = 0
bu nedenle, daha önce eklediğimiz bir kovaya bakacağız ve bunun girişin bir parçası olmadığını 2, 4, 6
söylemek için 3 karşılaştırma yapması gerekiyor 8
.
Bloom filtresi: Normalde, her bir giriş değeri k
farklı hash işlevlerine karşı hash edilir. Yine, basitlik için, sadece tek hash fonksiyonunu kullandığımızı varsayalım f
. Daha sonra 2 değer dizisi ihtiyaç ve biz girdi karşılaştığınızda 2
bunun nedeni demektir f(2) = 0
biz pozisyonda dizi değerini 0
değere 1
. Aynı şey 4
ve için de geçerlidir 6
. Benzer şekilde, girdiler3, 5, 7
her biri dizi konumunu 1
değere ayarlar 1
. Şimdi biz sorgu 8
giriş parçası: f(8) = 0
pozisyonundaki dizi 0
olduğunu 1
, bu nedenle çiçek filtre olacak yanlış İstem 8
gerçekten giriş parçasıydı.
Biraz daha gerçekçi olmak için ikinci bir hash fonksiyonu eklediğimizi düşünelim g(x) = x % 10
. Bunun üzerine, giriş değeri 2
iki karma değerlerine yol açar f(2) = 0
ve g(2) = 2
ve bunlara karşılık gelen iki dizi pozisyonu ayarlanacak1
. Tabii ki, dizi şimdi en azından boyutta olmalıdır 10
. Ancak sorguladığımızda 8
diziyi konumu 8
nedeniyle kontrol edeceğiz g(8) = 8
ve bu konum hala devam edecek 0
. Bu nedenle ek karma işlevler, alacağınız yanlış pozitifleri azaltır.
Karşılaştırma: Bloom filtresi, rasgele dizi konumlarına erişildiği k
anlamına gelen sağlama işlevlerini kullanır k
. Ama bu rakam kesin. Bunun yerine karma yalnızca size amortismanlı sabit bir erişim süresi garanti eder, ancak karma işlevinizin ve giriş verilerinizin niteliğine bağlı olarak üretimini kaldırabilir. Bu nedenle, oluşturulmuş olgular dışında genellikle daha hızlıdır.
Ancak, bir karma çarpışmanız olduğunda standart karma, saklanan değerlerin sorgu değerine eşitliğini kontrol etmelidir. Bu eşitlik kontrolü keyfi olarak pahalı olabilir ve asla bir çiçek filtresi ile gerçekleşmez.
Alan açısından, çiçeklenme filtresi sabittir, çünkü belirlenen diziden daha fazla bellek kullanmaya hiç gerek yoktur. Öte yandan, karma dinamik olarak büyür ve çarpışan değerleri takip etmek zorunda kaldığı için çok daha büyük olabilir.
Değiş tokuş: Artık neyin ucuz olduğunu ve neyin olmadığını ve hangi koşullar altında değiştiğini bildiğinize göre ödünleşmeyi görebilmelisiniz. Bloom filtreleri, daha önce bir değerin görüldüğünü çok hızlı bir şekilde tespit etmek istiyorsanız, ancak yanlış pozitiflerle yaşayabiliyorsanız harika. Öte yandan, çalışma zamanınızı tam olarak değerlendirememe fiyatında garantili doğruluk istiyorsanız, ancak ortalamanın çok daha yavaş olabileceği zaman zaman dejenere olmuş vakaları kabul edebileceğiniz karma haritayı seçebilirsiniz.
Benzer şekilde, sınırlı bir bellek ortamındaysanız, bellek kullanım garantisi için bloom filtrelerini tercih etmek isteyebilirsiniz.