Yanlış pozitif olmayan olasılıklı bir set mi?


35

Bu nedenle, Bloom filtreleri oldukça havalıdır - üyelik kontrolünü yanlış negatifler olmadan, ancak küçük bir pozitif pozitif şansı destekleyen setlerdir. Son zamanlarda, bunun tersini garanti eden bir "Bloom filtresi" istiyordum: yanlış pozitif değil, potansiyel olarak yanlış negatif.

Motivasyonum basit: işlenecek çok sayıda öğe akışı (çoğaltılmış olarak) verildiğinde, daha önce gördüğümüz öğeleri işlemekten kaçınmak istiyoruz. Bir kopyayı işlemek acı vermez, sadece zaman kaybıdır. Yine de, bir elementi işlemeyi ihmal edersek, felaket olur. "Ters Bloom filtresi" ile, az yer kaplamasıyla görülen öğeleri saklayabilir ve sete üyelik için test ederek yüksek olasılıkla çiftleri işlemekten kaçınabilir.

Yine de bu tür bir şey bulamıyorum. Bulduğum en yakını " rötuşlanan Bloom filtreleri " dir, ki bu, birinin daha yüksek bir yanlış negatif oran için seçilen hatalı pozitifleri alıp satmasını sağlar. Ancak, tüm yanlış pozitifleri kaldırmak istediğinde, veri yapılarının ne kadar iyi performans gösterdiğini bilmiyorum

Böyle bir şey gören oldu mu? :)


3
İlgilendiğim setin tamamlayıcısı sonsuz. Nasıl saklardım?
Christopher Monsanto

11
Sorunu görüyorum (modern diskler henüz yeterince büyük değil).
Dave Clarke

8
Eğer böyle bir veri yapınız olsaydı, normal bir çiçeklenme filtresi ile birlikte kullanarak hile yapmak ve set üyeliğini saklamak için kullanabilirsiniz.
Mark Reitblatt

1
@MarkReitblatt hem Bloom filtreleri hem de önbellekleri olasılıklıdır ve bunların herhangi bir kombinasyonu olasılıklıdır, yani kesin set üyeliği testini gerçekleştiremez. :)
awdz9nld

Yanıtlar:


25

Cevaplardan biri, büyük bir karma tablo kullanmak ve doldurduğunda, onlar için başka bir yerde (varolmayan) boş yuvalar bulmak yerine, içindeki öğeleri değiştirmeye başlamak. Bloom filtreleriyle yaptığınız sahte yanlış cevapların oranını sabit alamazsınız, ancak bu hiç olmamasından iyidir. Bunun standart olduğuna inanıyorum, örneğin daha önce aranan pozisyonları takip etmek için satranç yazılımında.


Cevap için teşekkürler. Evet, bu açık bir çözüm - aynı zamanda standart bir çözüm ise, şanssız olduğum anlaşılıyor . Oh iyi.
Christopher Monsanto

2
Buna Doğrudan eşlenmiş önbellek adı verilir ve CPU'larda yaygın olarak kullanılır. (Herhangi bir önbellek veya kayıp hash ayarı gereksinimlere değişen derecelerde uyar). Hata oranı, karma fonksiyonunun dağılımının (çığ) bir fonksiyonudur ve önbellek / sette mevcut yuvaların sayısıdır - buna göre ayarlanır. :)
awdz9nld

Ayrıca, yalnızca yanlış anahtarlar vermeden yalnızca sözlü anahtarların saklanabileceğini unutmayın (örn. Bir karma anahtarın depolanması)
awdz9nld

20

Bu sorunun cevabı "hayır" dır. Nedenini görmek için çok aşırı bir durum ve normal bir çiçeklenme filtresinin nasıl çalışacağını düşünebiliriz. Buna "kasvetli filtre" diyebileceğimiz teorik bir "Bizzaro Dünyası" çiçek filtresi.

Bir çiçek filtresinin en güzel yanı, hata olasılığına ve depolanan öğe sayısına göre sabit bir boyuta sahip veri yapısını kullanarak, öğelerin üyeliği (yanlış pozitif) tek taraflı testler yapabilmenizdir . Boyutları öğelerin kendilerini hiç önemi yoktur. Örneğin,% 3'ten daha az hatayla 1.000 öğeye kadar depolamak için bir çiçeklenme filtresine sahip olsaydık, o zaman Vikipedi'nin tüm corpus'unun 1000 küçük versiyonunu saklayabilirdik, her birinde bir harf değişiyordu ve biz hala İstediğimiz ölçüleri aldığınızda veri yapısı çok küçük olacaktır (bir kilobayttan az). Tabii ki, bu karmaşayı hesaplamak zor olacak, ancak prensip hala geçerli.

Şimdi, aynı masif ipleri kasvetli bir filtrede saklamayı düşünün! Şimdi sadece yanlış negatifler yapabiliriz. Öyleyse "evet, Wikipedia'nın bütün bir kısmının bu hali bu sette" diyorsak, bu konuda kesinlikle haklı olmalıyız. Bu, karma değerin bize yardımcı olmayacağı anlamına gelir; çünkü her zaman aynı değere sahip olan başka bir dize olacaktır. "Evet" demenin ve emin olmanın tek yolu tüm dizgiyi veya aynı uzunluktaki bazı eşdeğer verilerini saklamaktır. Her zaman saklayamıyor ve "hayır" diyemedik, ancak sonuçta hata oranı bizi yakalayacaktır. Yapabileceğimiz en iyi şey, yapının boyutunu depolanan verilerin entropisinin ürününe indirgemesine ve arzu ettiğimiz hassasiyete indirgemektir.

Yani, ne yazık ki kasvetli filtre yok. Önbellekleme tek çözümdür, ancak bir çiçek filtresinin tam tersi değildir, çünkü boyutu depolanan bilgi miktarı ve filtrenin istenen doğruluk oranı ile orantılı olacaktır. Elbette, birçok gerçek dünya senaryosunda, büyük veriler bir kimlikle temsil edilebilir, bu nedenle önbellekleme hala oldukça kabul edilebilir olabilir. Fakat köklü çiçek filtresinden temelde farklı.


ödeme şekli başka bir ödeme
yapmayın

@Yehosef gayet iyi ve ihtiyaçlarınız için işe yarayabilir, ancak yazarın "olayı tamamen tanımlayan az sayıda kimlik" olduğu konusunda konuştuğunu fark edeceksiniz. Yani, uygulanan şey hala tüm nesneyi etkin bir şekilde depolamaktır. Yani, bu bir önbellek çeşididir. Gerçek bir "çiçeklenme filtresinin karşıtı", eğer varsa, tüm nesneleri saklamak zorunda kalmayacaktı.
pents90

Olayı tanımlayan birkaç objeden bahsetti - bütün nesneyi değil. Yalnızca etkileşim önbelleği değil, session_id'deki "önbelleği" saklamam gerekiyor. Ancak, bunun çiçeklenme veya hiperlog ile aynı tür bir yaklaşım olmadığını duydum.
Yehosef

“Kanıt” ınızda, sınırsız sayıda olası giriş olduğunu kabul edersiniz. Ancak, olası girişler kümesinin önceden bilindiği durumlar vardır. Örneğin, bir bellek sayfasının çöp toplanması için: hangi girdileri içerdiğini bilirsiniz. Şimdi, olası her bir girişi 0 dizinine eşleyen bir "kasvetli filtre" oluşturursunuz. Şimdi bir giriş kaldırıldığında, biti o dizini ayarlayın. Tüm bitler ayarlandığında, çöpleri sayfa toplayabilirsin. "Kasvetli filtre" bir MPHF'dir. Yanlış negatiflere izin vermek için, MPHF'yi bazı girişlerin n + 1 olarak eşleneceği şekilde değiştirin.
Thomas Mueller

@ThomasMueller Doğru, standart CS teorisi bakış açısı olan en kötü durum / olumsuz durum olduğunu varsayıyorum. Yalnızca sabit bir N olası girişler kümeniz varsa, o zaman her öğe için yalnızca log N alanı olan çok sayıda basit çözüm vardır. Çiçek filtresinde böyle bir sınırlama yoktur.
pents90 20

13

Sadece önbellek istiyorsun , ama bunu garip bir şekilde düşünüyor.


1
... detaylandırmak ister misiniz? Elbette bir önbellek işe yarar, ama bu ideal değildir, bu yüzden olasılıksal veri yapılarında teknolojinin durumu hakkında bir soru. Daha açık olmak gerekirse, bildiğim önbellek teknikleri çok fazla depolama alanı gerektiriyor. Önbellek düzeyi arttıkça, daha fazla depolama alanı kullanılır. Biri, önbellekte depolanan öğelere bir sınır koyabilir, kullanım desenleriyle vb. Hileler yapabilir, ancak bu hala bir Bloom filtresinin sağladığı alan verimliliğine yanlış cevap oranına yakın bir yere ulaşamaz.
Christopher Monsanto

1
(devam) Bu, tüm sorunlarımı çözen bariz bir önbellekleme tekniğini unutabildiğimi söylüyor. Bu durumda, bana Wikipedia'daki genel bir kategorinin linkini vermek yerine bu tekniği açıkça ortaya koyabilirsin?
Christopher Monsanto

2

YASAL UYARI: Önbellek konusunda uzman değilim, bu yüzden bu naif bir fikir olabilir ve daha önce hiç duymadığım bilinen bir fikir olabilir. Bu yüzden referansını alıntı yapamazsam (varsa); ve yazının düzenlenmesi ve eklenmesi için bir referans olup olmadığını lütfen bana bildirin. (Çok sezgisel olduğu için referans alabileceğinden şüpheleniyorum).

cc


0

Yanlış negatifleri olmayan bir filtre görevi görmek için kısmi parçalara sahip AVL (ve bazen kırmızı-siyah) ağaçları kullandım. Ağacı eklerken veya sorgularken, öğenin yalnızca ilk X baytını kullanın. Veri yapısı biçimsel olarak olasılıksal olmadığından, bit çarpışma ile hatalı-pozitif olma riski yoktur. Ve tüm öğeyi önbelleğe almanın aksine, bu yaklaşım size hesaplanabilir bir maksimum alan sağlar. Sahte pozitiflerin oranını, sahte pozitiflerin ve alanların maliyetine kıyasla farklı önek uzunlukları / ağaç derinlikleri dikkate alarak ayarlayabilirsiniz.


Ayrıca, dize verileriyle denemeyi de denemek istedim, ancak verilerim ikili yapılar olarak paketlenme eğiliminde.
JRideout

0

Yukarıdaki veri yapısının var olamayacağını belirten bir alt sınır olduğunu kanıtlayabileceğimi düşünüyorum. Temel olarak, eğer veri yapısı m bit kullanıyorsa, o zaman sabit bir bit vektörü (bir girişin gösterilmesi), sayma argümanı ile en fazla (((un) + n eps) \ select (un)) kümelerine karşılık gelebilir. Bu sayının 2 ^ m çarpı en az olması gerektiği göz önüne alındığında (u \ select n) (tüm kümeler gösterilmelidir), küme S'yi tam olarak depolamaya çok yakın bir alt sınır elde ediyoruz.

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.