Çiçeklenme filtrelerini kullanmanın avantajı nedir?


109

Çiçek filtreleri hakkında okuyorum ve aptalca görünüyorlar. Bir çiçeklenme filtresiyle başarabileceğiniz her şeyi, birden çok yerine tek bir hash işlevi kullanarak daha az alanda, daha verimli bir şekilde başarabilirsiniz, ya da öyle görünüyor. Neden çiçeklenme filtresi kullanırsınız ve bu nasıl faydalıdır?


5
wikipedia makalesini okudunuz mu? Avantajları oldukça iyi açıklıyor. en.wikipedia.org/wiki/Bloom_filter
Alex Budovski

@david, bu pek olası görünmüyor. Sabit bir uzaydaki k hash fonksiyonları, sabit bir uzaydaki tek bir hash fonksiyonundan çok daha fazla çarpışmaya sahip olacaktır.
baş ağrısı

1
@Alex Wikipedia makalesini okudum. Orada söylenenleri anlıyorum ama neden daha iyi olduğunu anlamıyorum. Neden işe yaradığı sezgiseldir. Neden yararlı değil.
baş ağrısı

Bu yazar onunla harika bir iş çıkarıyor michaelnielsen.org/ddi/why-bloom-filters-work-the-way-they-do
dranxo

2
@dranxo, Bağlantılı makale jasondavies.com/bloomfilter daha iyidir.
Pacerier

Yanıtlar:


157

Gönderen Vikipedi :

Bloom filtreleri, kendi kendini dengeleyen ikili arama ağaçları, denemeler, karma tablolar veya basit diziler veya girişlerin bağlantılı listeleri gibi kümeleri temsil etmek için diğer veri yapılarına göre güçlü bir alan avantajına sahiptir. Bunların çoğu, en azından veri öğelerinin kendilerinin depolanmasını gerektirir; bu, küçük tam sayılar için az sayıda bitten, dizeler için olduğu gibi rastgele bit sayısına kadar herhangi bir yerde gerektirebilir (denemeler bir istisnadır, çünkü depolamayı aralarında paylaşabilirler. eşit öneklere sahip öğeler). Bağlantılı yapılar, işaretçiler için ek bir doğrusal uzay yüküne neden olur. Öte yandan,% 1 hataya ve optimum k değerine sahip bir Bloom filtresi, öğelerin boyutuna bakılmaksızın öğe başına yalnızca yaklaşık 9,6 bit gerektirir. Bu avantaj kısmen dizilerden miras alınan kompaktlığından gelir, ve kısmen olasılıklı doğasından. % 1'lik bir yanlış pozitif oranı çok yüksek görünüyorsa, eleman başına yaklaşık 4,8 bit eklediğimizde bunu on kat azaltırız.

Bana oldukça açık.

Bir çiçeklenme filtresi öğelerin kendisini saklamaz, önemli nokta budur. Bir eleman varsa, bunu kesinlikle olsun testine için kullanabilirsiniz testine bir çiçek filtresi kullanmayın değil hiçbir yanlış negatif garanti beri mevcut. Bu, bir sette bulunmayan öğeler için fazladan iş yapmanıza izin vermez (örneğin, onları aramak için disk GÇ'si).

Ve hepsi bir karma tablo gibi bir şeyden önemli ölçüde daha az alanda (büyük olasılıkla büyük veri kümeleri için kısmen diskte olacaktır). Karma tablo gibi bir yapıyla birlikte çiçeklenme filtresi kullanabilirsiniz , ancak öğenin mevcut olma şansının olduğundan emin olduğunuzda.

Dolayısıyla, örnek bir kullanım modeli şöyle olabilir:

Diskte çok fazla veri var - m'nin değerini belirleyen hangi hata sınırını istediğinize (örneğin% 1) karar verirsiniz . Daha sonra optimal k belirlenir (makalede verilen formülden). Filtrenizi bu diske bağlı verilerden bir kez doldurursunuz.

Artık RAM'de filtre var. Bir öğeyi işlemeniz gerektiğinde, veri kümenizde var olma şansı olup olmadığını görmek için filtrenizi sorgularsınız. Olmazsa, fazladan iş yapılmaz. Disk okuma, vb. Yok (Bir karma veya ağaç olsaydı yapmanız gereken, vb.).

Aksi takdirde, filtre "Evet, içeride" diyorsa, yanlış olma ihtimali% 1'dir, bu nedenle öğrenmek için gerekli işi yaparsınız. Zamanın% 99'u, gerçekten orada olacak , bu yüzden iş boşuna değildi.


2
Açıksa lütfen cevaplayın. Bu, aynı boyuttaki setteki tek bir hash işlevinden daha fazla alan verimli olabilir mi? Bu sadece daha fazla çarpışma yaratacaktır. Tüm karma işlevlerde 1'e sahip olduğunuzdan emin olmak için ayrı karma işlevlerde arama yaparken sıçrayacaksınız. Tek bir hash işlevi kullanmanın avantajını anlamıyorum.
baş ağrısı

19
Karma işlevi koddur, veri değil. Hash fonksiyonunu neyle kullanmayı düşünüyorsunuz? Karma tablo mu? Bu durumda, tablonuzun çiçeklenme filtresinden farklı olarak rastgele boyutta olabilecek anahtarları saklaması gerekecektir. Alıntı bundan bahsediyor.
Alex Budovski

3
K yerine tek bir hash işlevine sahip bir çiçeklenme filtresi düşünün. Daha fazla hash işlevi eklemenin avantajı nedir? Bu sadece daha fazla çarpışma yaratacaktır. Yoksa yanılıyor muyum?
baş ağrısı

2
Bu, Wikipedia makalesinin "Uzay ve zaman avantajları" son paragrafında ve "Yanlış pozitiflerin olasılığı" bölümünde yanıtlanmaktadır.
Alex Budovski

4
Sadece tıklandı. Çok teşekkür ederim, bu beni bir süredir rahatsız etti. Yanlış pozitiflerin sayısını azaltır çünkü yanlış pozitifin a) tüm hash fonksiyonlarınızda bir çarpışma olması veya b) tüm boşlukların başka değerlerle doldurulması gerekir. O halde beden seçimi zor bir süreç olmalı sanırım. Yanılıyorsam düzelt ama sanırım anladım. Herkese teşekkürler.
Baş ağrısı

156

Alex bunu oldukça iyi açıkladı. Hala tam olarak kavrayamayanlar için, umarım bu örnek anlamanıza yardımcı olur:

Diyelim ki Chrome ekibinde Google için çalışıyorum ve tarayıcıya, girdiği url'nin kötü niyetli bir URL olup olmadığını bildiren bir özellik eklemek istiyorum. Bu yüzden yaklaşık 1 milyon kötü amaçlı URL'den oluşan bir veri kümem var ve bu dosyanın boyutu yaklaşık 25MB. Boyut oldukça büyük olduğu için (tarayıcının kendisinin boyutuna kıyasla büyük), bu verileri uzak bir sunucuda depoluyorum.

Durum 1: Karma tablo ile bir karma işlevi kullanıyorum. Verimli bir hashing fonksiyonuna karar veriyorum ve hash anahtarları almak için hashing fonksiyonu aracılığıyla 1 milyon url'nin tamamını çalıştırıyorum. Daha sonra, hash anahtarının bana bu URL'yi yerleştirmek için dizini vereceği bir karma tablo (bir dizi) oluşturuyorum. Şimdi, hashing tablosunu bir kez karma haline getirip doldurduktan sonra, boyutunu kontrol ediyorum. 1 milyon URL’yi anahtarlarıyla birlikte hash tablosunda sakladım. Yani boyut en az 25 MB. Bu karma tablo, boyutu nedeniyle uzak bir sunucuda saklanacaktır. Bir kullanıcı gelip adres çubuğuna bir URL girdiğinde, kötü amaçlı olup olmadığını kontrol etmem gerekiyor. Bu yüzden URL'yi hash fonksiyonu aracılığıyla çalıştırıyorum (tarayıcının kendisi bunu yapabilir) ve bu URL için bir hash anahtarı alıyorum. Şimdi uzak sunucuma bu hash anahtarıyla bir istekte bulunmam gerekiyor, hash tablomdaki belirli URL’nin bu anahtarla kullanıcının girdiği URL ile aynı olup olmadığını kontrol etmek için. Eğer evet ise kötü niyetli, hayır ise kötü niyetli değil. Bu nedenle, kullanıcı bir URL'yi her girdiğinde, kötü amaçlı bir URL olup olmadığını kontrol etmek için uzak sunucuya bir istek yapılması gerekir. Bu çok zaman alır ve bu nedenle tarayıcımı yavaşlatır.

Durum 2: Çiçeklenme filtresi kullanıyorum. 1 milyon URL'nin tamamı, çoklu karma işlevler kullanılarak çiçek filtresinden geçirilir ve ilgili konumlar, büyük bir 0'lar dizisinde 1 olarak işaretlenir. Çiçeklenme filtresi hesaplayıcısı kullanarak% 1'lik bir yanlış pozitif oranı istediğimizi varsayalım ( http://hur.st/bloomfilter?n=1000000&p=0.01), gerekli olan çiçeklenme filtresinin boyutunu yalnızca 1,13 MB olarak alıyoruz. Dizinin boyutu çok büyük olmasına rağmen, hash tablosundaki gibi URL'leri değil, yalnızca 1'leri veya 0ları depoladığımız için bu küçük boyut beklenir.Bu dizi bir bit dizisi olarak değerlendirilebilir. Yani, sadece 1 ve 0 değerimiz olduğu için, bayt yerine ayrı bitler ayarlayabiliriz. Bu, kaplanan alanı 8 kat azaltacaktır. Bu 1,13 MB çiçeklenme filtresi, küçük boyutu nedeniyle web tarayıcısında saklanabilir !! Bu nedenle, bir kullanıcı gelip bir URL girdiğinde, gerekli hash işlevlerini (tarayıcının kendisinde) uygularız ve çiçek filtresindeki (tarayıcıda saklanan) tüm konumları kontrol ederiz. Konumların herhangi birinde 0 değeri bize bu URL'nin KESİNLİKLE kötü amaçlı URL'ler listesinde OLMADIĞINI ve kullanıcının serbestçe ilerleyebileceğini söyler. Böylece sunucuya bir çağrı yapmadık ve dolayısıyla zamandan tasarruf ettik. 1 değeri bize URL'nin kötü amaçlı URL'ler listesinde OLABİLECEĞİNİ söyler. Bu durumlarda, uzak sunucuya bir çağrı yaparız ve orada, URL'nin gerçekten mevcut olup olmadığını almak ve kontrol etmek için ilk durumda olduğu gibi bazı hash tablolarıyla birlikte başka bir hash işlevi kullanabiliriz. Çoğu zaman, bir URL'nin kötü niyetli olma olasılığı bulunmadığından, tarayıcıdaki küçük çiçeklenme filtresi bunu anlar ve bu nedenle uzak sunucuya yapılan çağrılardan kaçınarak zaman kazandırır. Yalnızca bazı durumlarda, eğer çiçeklenme filtresi bize URL’nin kötü niyetli olabileceğini söylerse, yalnızca bu durumlarda sunucuya bir çağrı yaparız. Bu 'MIGHT'% 99 doğru. Bu durumlarda, uzak sunucuya bir çağrı yaparız ve orada, URL'nin gerçekten mevcut olup olmadığını almak ve kontrol etmek için ilk durumda olduğu gibi bazı hash tablolarıyla birlikte başka bir hash işlevi kullanabiliriz. Çoğu zaman, bir URL'nin kötü niyetli olma olasılığı bulunmadığından, tarayıcıdaki küçük çiçeklenme filtresi bunu anlar ve bu nedenle uzak sunucuya yapılan çağrılardan kaçınarak zaman kazandırır. Yalnızca bazı durumlarda, eğer çiçeklenme filtresi bize URL’nin kötü niyetli olabileceğini söylerse, yalnızca bu durumlarda sunucuya bir çağrı yaparız. Bu 'MIGHT'% 99 doğru. Bu durumlarda, uzak sunucuya bir çağrı yaparız ve orada, URL'nin gerçekten mevcut olup olmadığını almak ve kontrol etmek için ilk durumda olduğu gibi bazı hash tablolarıyla birlikte başka bir hash işlevi kullanabiliriz. Çoğu zaman, bir URL'nin kötü niyetli olma olasılığı bulunmadığından, tarayıcıdaki küçük çiçeklenme filtresi bunu anlar ve bu nedenle uzak sunucuya yapılan çağrılardan kaçınarak zaman kazandırır. Yalnızca bazı durumlarda, eğer çiçeklenme filtresi bize URL’nin kötü niyetli olabileceğini söylerse, yalnızca bu durumlarda sunucuya bir çağrı yaparız. Bu 'MIGHT'% 99 doğru. tarayıcıdaki küçük çiçeklenme filtresi bunu belirler ve böylece uzak sunucuya yapılan çağrılardan kaçınarak zamandan tasarruf sağlar. Yalnızca bazı durumlarda, eğer çiçeklenme filtresi bize URL’nin kötü niyetli olabileceğini söylerse, yalnızca bu durumlarda sunucuya bir çağrı yaparız. Bu 'MIGHT'% 99 doğru. tarayıcıdaki küçük çiçeklenme filtresi bunu belirler ve böylece uzak sunucuya yapılan çağrılardan kaçınarak zamandan tasarruf sağlar. Yalnızca bazı durumlarda, eğer çiçeklenme filtresi bize URL’nin kötü niyetli olabileceğini söylerse, yalnızca bu durumlarda sunucuya bir çağrı yaparız. Bu 'MIGHT'% 99 doğru.

Bu nedenle, tarayıcıda küçük bir çiçeklenme filtresi kullanarak, girilen her URL için sunucu çağrıları yapmamıza gerek olmadığından çok zaman kazandık.

Tek bir hash işlevine sahip karma tablonun bir çiçek filtresinden tamamen farklı bir amaç için kullanıldığını görebiliriz. Umarım bu şüphelerinizi giderir :)

düzenle :

Python'da kötü amaçlı URL testi görevi için bir çiçeklenme filtresi uyguladım. Kod burada bulunabilir - https://github.com/tarunsharma1/Bloom-Filter Kodun anlaşılması çok basittir ve benioku dosyasında ayrıntılı bir açıklama sağlanır.


3
Kullanım senaryosu için teşekkürler.
Squiggs.

1
Karma oluşturma ve 0 veya 1 değerini ilişkilendirme kısmını almadım. Bir dizi kullanıyorsak ve bunlarda 0 ve 1'i saklarsak, testi gerçekleştirirken bir url'nin hash değerini nasıl ararız? ?
divinedragon

1
Yani temelde hash fonksiyonu denen bir şey kullanıyoruz.. URL'yi bir dize olarak alıyor ... ve bir sayı veriyor..bu sayıyı kullanıyoruz ve karşılık gelen dizi indeksi değerini 1 olarak ayarlıyoruz. Bir dizi farklı hashing fonksiyonu mevcuttur, ancak önemli olan, aynı URL'nin bir karma işlevden her geçtiğinde, aynı numarayı üretmesi gerektiğidir. Karma işlevinin bir örneği, bir URL'deki tüm karakterlerin ascii değerlerini toplamak olabilir. Bloom filtrelerinde birçok hashing işlevi kullanıyoruz ve tüm bu dizi indeksi değerlerini 1'e ayarlıyoruz. Umarım bu şüphenizi ortadan kaldırmıştır.
Tarun

1
C # gibi geleneksel bir hashtable HashSet<String>, hashtable'ın tamamen dolu olduğu en iyi durum senaryosunda öğe başına 16 bayt kullanacaktır: bir "kova" dan giriş tablosundaki bir girişe (bir dizi-paketlenmiş tek bağlantılı liste), önbelleğe alınan karma kod için 4 bayt, "sonraki" işaretçi için 4 bayt, anahtara bir işaretçi için 4 bayt. Ve bu dize boyutlarını saymaz. En kötü durumda 40 bayttır: String64 bit mimariler için işaretçi 8 bayta genişlediğinde girdilerin yarısı kullanılmaz ve girdi başına 20 bayttır .
Qwertie

Dizenin kendisini hash setine kaydetmeniz gerekmez. Karma değerini değer olarak kaydedebilir ve karma seti çok daha küçük hale getirebilirsiniz. Ardından hash boyutuyla oynayabilirsiniz - ne kadar büyükse, yanlış pozitif oranı o kadar küçük olur.
user1028741

24

Çiçek filtresinin ne olduğunu, neyi yapıp neyi yapamayacağını, neden ihtiyacımız olduğunu, nasıl çalıştığını sezgisel bir tanımla ve daha sonra yararlı olabilecekleri zaman bazı örneklerle başlayacağım.

Bir Yani standart çiçek filtresi bir olan olasılık veri yapısı olduğunu can * :


  • bir kümeye öğe ekle
  • definitely not in the setveya söyleyerek bir elemanın kümede olup olmadığını kontrol edinpossibly in the set

Bu possibly in the settam olarak olasılık denir nedeni budur. Akıllı kelimeler kullanmak, yanlış pozitifin mümkün olduğu (yanlış bir şekilde elementin pozitif olduğunu düşündüğü durumlar olabilir), ancak yanlış negatifin imkansız olduğu anlamına gelir.

Ama yapamaz * :

  • setten bir öğe çıkarmak
  • size şu anda kümenizde bulunan tüm öğelerin bir listesini verir

* Bu can / can't seti temel bir çiçeklenme filtresi içindir. Uzun zaman önce oluşturulmuş kullanışlı bir veri yapısı olduğu için insanlar onu diğer kullanışlı özelliklerle nasıl artıracaklarını buldular .


Ama bir dakika bekleyin: Tüm bunları belirsiz 'mümkün' olmadan ve ayrıca tüm sınırlamalar olmadan (kaldıramaz, tümünü gösteremez) yanıtlayabilecek bir veri yapısı biliyoruz. Ve buna set denir . Ve burada bir çiçek filtresinin ana avantajı geliyor: alan verimli ve sabit alan .

Bu, orada kaç öğe sakladığımızın önemi yok, alanın aynı olacağı anlamına gelir. Evet, 10^6öğelere sahip bir çiçeklenme filtresi (işe yaramaz çiçeklenme filtresi), öğeler içeren bir çiçek filtresiyle aynı miktarda alan ve 10^20öğeler içeren çiçeklenme filtresiyle aynı alanı kaplar 0. Peki ne kadar yer kaplayacak? Karar vermek size kalmış (ancak bir ticaret var: ne kadar çok öğeye sahip olursanız, possible in the setyanıta o kadar belirsiz olursunuz .

Bir başka harika şey de uzay sabiti olmasıdır. Verileri bir kümeye kaydettiğinizde, bu verileri gerçekten kaydetmeniz gerekir. Yani depolarsanız this long string in the seten az 27 bayt alan kullanmanız gerekir. Ancak% 1'lik bir hata ve optimal bir k ** değeri için, herhangi bir öğe için ~ 9,6 bite (<2 bayt) ihtiyacınız olacaktır (ister kısa int ister büyük bir metin duvarı olsun).

Diğer bir özellik, tüm işlemlerin sabit zaman almasıdır; bu, setler durumunda amortize edilmiş sabit zamanla kesinlikle aynı değildir (sette çarpışmalar varsa, O(n)zamanla bozulabileceğini unutmayın ).

** k, çiçek filtresinde kullanılan hash fonksiyonlarının bir değeridir


Çiçek filtrelerinin nasıl çalıştığını açıklamayacağım (wikipedia makalesi her şeyi açıklamak için çok iyi bir iş çıkarıyor). Burada kısaca temelleri anlatacağım.

  • boş bir bit uzunluk dizisi başlatırsınız m
  • kfarklı hash fonksiyonları seçersiniz (ne kadar bağımsız olursa o kadar iyidir)
  • Eleman eklemek isterseniz k, bu değerin tüm karmalarını hesaplar ve karşılık gelen bitleri 1'e ayarlarsınız.
  • Eğer elemanın var olup olmadığını kontrol etmek isterseniz, tüm khash'leri de hesaplarsınız ve bunlardan en az biri ayarlanmadıysa, kesinlikle sette değildir. Aksi takdirde sette olabilir.

Bu açıklama bile neden emin olamadığımızı anlamak için yeterlidir (tüm bitleri çeşitli diğer değerlerden alabilirsiniz). İşte nasıl çalıştığına dair çok güzel bir görsel .

görüntü açıklamasını buraya girin


Peki, çiçek filtreleri ne zaman faydalı olabilir? Kısa cevap, yanlış pozitifin kabul edilebilir olduğu ve sette bir şey olup olmadığını kontrol etmek isteyeceğiniz her yerdedir , ancak olmasalar bile, doğrulayıcılara yapılan pahalı çağrıları ekarte etmek için ilk savunma hattı olabilir.

İşte daha somut açıklamaların bir listesi:

  • kötü amaçlı web sitelerinin standart bir örneği ve bir tarayıcı , insanların çiçek filtrelerinden bahsettiği hemen hemen her yerde açıklanmaktadır.
  • zayıf bir şifredir: Olası tüm zayıf şifrelerin büyük bir kümesine sahip olmak yerine, şifrenin kesinlikle zayıf olup olmadığını kontrol edebilirsiniz.
  • Bir makale listeniz ve bir kullanıcı listeniz varsa, kullanıcıların okumadıkları makaleleri göstermek için çiçek filtresini kullanabilirsiniz. İlginç olan, yalnızca bir filtrenizin olabilmesidir (user_id + article_id kombinasyonunun orada olup olmadığını kontrol edersiniz)
  • bitcoin , cüzdan senkronizasyonu için çiçeklenme filtresini kullanır
  • Akamai'nin web sunucuları, "tek vuruş harikalarının" disk önbelleklerinde saklanmasını önlemek için Bloom filtrelerini kullanır. Bir vuruş harikası, kullanıcılar tarafından yalnızca bir kez talep edilen web nesneleridir ve Akamai'nin bulduğu bir şey, önbellek altyapılarının neredeyse dörtte üçü için geçerlidir. Bir web nesnesi için ikinci isteği tespit etmek için bir Bloom filtresi kullanmak ve bu nesneyi yalnızca ikinci isteğinde önbelleğe almak, tek vuruşlu harikaların disk önbelleğine girmesini engeller, disk iş yükünü önemli ölçüde azaltır ve disk önbelleği isabet oranlarını artırır (bloom filtresindeki örneklerden alınmıştır) wiki'deki makale)

13

Bloom filtreleri biyoinformatikte oldukça kullanışlıdır. Normal bir hash kullanmaya kıyasla daha fazla alan verimli olabilirler, özellikle birlikte çalıştığınız dizelerin boyutu çok küçük bir alfabeye sahip yüz milyonlarca harf, yani {A, G, T, C} olduğunda. Genellikle belirli bir k-mer'in bir genomda var olup olmadığını değerlendirmek için kullanılırlar. Burada alakalı bir şey için kullanılan bir örnek var .

DÜZENLE:

Yanlış pozitifleri en aza indirmek için çoklu hash fonksiyonları kullanılır. Umut, tüm k-hash fonksiyonları arasında, her bir değerin, diğer tüm olası değere kıyasla bit dizisinde benzersiz bir imzaya sahip olmasıdır. Bununla birlikte, yanlış pozitifler vardır, ancak yönetilebilir bir düzeye indirilebilirler. Bu tekniği kullanarak öğeleri boyutlarından bağımsız olarak hash edersiniz . Bunları aradığınızda, her bir hash işlevini kullanırsınız ve bit değerlerinin hepsinin 1 olduğundan emin olun.

Bunu, elementin boyutundaki artışın karma tablonun boyutunu önemli ölçüde artırdığı insan genomuyla karşılaştırın (Tablo boyutu 4 * 4 k'dir ). Bu, öğeleri 2 bit / harf kullanarak kodladığınızı varsayar.


1
Üzgünüm, belki yanlış anlıyorum ama normal bir hash'e kıyasla daha fazla alan verimli olabilirler? Bir dizenin hash değeri sabit uzunlukta çıktıdır ve siz sadece bu değeri 0 veya 1 olarak ayarlarsınız. Bu aynı zamanda bloom filtrelerinin yapacağı şeydir, ancak bloom filtreleri bunu birden fazla hash fonksiyonunda yapar. Nerede yanlış anlıyorum?
baş ağrısı

Tek bir hash depolamanın pek bir faydası yok. O zaman hash çarpışmalarıyla başa çıkmanın bir yolu olmayacaktı. Çoğu karma tablo uygulaması, bunun üstesinden gelmek için ek yük getiren bir yola sahiptir. Örneğin Python sözlükleri, anahtarı hash ile birlikte depolar ve çarpışmayı doğrusal olarak incelemeye başlar. Çiçeklenme filtresi bunu keser ve birden çok karma kullanarak bunu yapmanın doğasında olan hasarı en aza indirmeye çalışır.
Bret Fontecchio

1
Neden tek bir hash işlevi olan bir çiçeklenme filtresi oluşturmuyorsunuz? belki "nispeten büyük" hash işlevi. Ama birçok yerine bir tane
giorgim

7

Bloom filtresi, bir öğenin setin üyesi olduğunu döndürürse, belirli bir yanlış pozitif olasılığı vardır. Kümedeki üyeliği belirtmek için yalnızca tek bir karma işlevi kullanılmışsa, yanlış pozitif olma olasılığı, birden çok karma işlevi kullanmaktan daha yüksek olacaktır.


Cevabın eti üzerinde ciddi bir ayrıntıya ihtiyacımız var: " Yanlış pozitif olma olasılığı, birden fazla hash fonksiyonu kullanmaktan daha yüksek olacaktır " ...
Pacerier
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.