Jadi, filter Bloom cukup keren - mereka adalah set yang mendukung pemeriksaan keanggotaan tanpa negatif palsu, tetapi kemungkinan kecil positif palsu. Namun baru-baru ini, saya menginginkan "filter Bloom" yang menjamin yang sebaliknya: tidak ada positif palsu, tetapi berpotensi negatif palsu.
Motivasi saya sederhana: diberi aliran besar barang untuk diproses (dengan duplikat), kami ingin menghindari memproses barang yang telah kami lihat sebelumnya. Tidak ada salahnya memproses duplikat, itu hanya buang-buang waktu. Namun, jika kita lalai memproses suatu elemen, itu akan menjadi bencana besar. Dengan "reverse Bloom filter", seseorang dapat menyimpan barang-barang yang terlihat dengan sedikit overhead ruang, dan menghindari pemrosesan duplikat dengan probabilitas tinggi dengan menguji keanggotaan dalam set tersebut.
Namun sepertinya saya tidak dapat menemukan hal semacam itu. Yang paling dekat yang saya temukan adalah " filter Bloom retouched ", yang memungkinkan seseorang untuk bertukar positif palsu yang dipilih dengan tingkat negatif palsu yang lebih tinggi. Saya tidak tahu seberapa baik kinerja struktur data mereka ketika seseorang ingin menghapus semua positif palsu.
Adakah yang melihat hal seperti ini? :)
sumber
Jawaban:
Satu jawaban adalah dengan menggunakan tabel hash besar dan ketika diisi mulai ganti elemen di dalamnya daripada menemukan (tidak ada) slot kosong di tempat lain untuk mereka. Anda tidak mendapatkan tingkat tetap dari jawaban salah yang Anda lakukan dengan filter Bloom, tetapi lebih baik daripada tidak sama sekali. Saya percaya ini standar misalnya dalam perangkat lunak catur untuk melacak posisi yang telah dicari.
sumber
Jawaban untuk pertanyaan ini adalah "tidak". Untuk mengetahui alasannya, kita dapat berpikir tentang kasus yang sangat ekstrem, dan bagaimana filter bloom biasa bekerja vs.
Apa yang hebat tentang filter mekar adalah bahwa Anda dapat melakukan tes satu sisi untuk keanggotaan item (dengan false positive) menggunakan struktur data yang memiliki ukuran tetap sehubungan dengan probabilitas kesalahan dan jumlah item yang disimpan. The ukuran dari produk yang sebenarnya tidak penting sama sekali. Misalnya, jika kami memiliki filter mekar yang diatur untuk menyimpan hingga 1.000 item dengan kesalahan kurang dari 3%, maka kami dapat menyimpan 1.000 versi yang sedikit berbeda dari seluruh kumpulan Wikipedia, dengan satu huruf diubah di masing-masing, dan kami masih akan tetap dapatkan metrik yang kita inginkan, dan struktur data akan sangat kecil (kurang dari satu kilobyte). Tentu saja, menghitung hash itu akan menjadi tantangan, tetapi prinsipnya tetap berlaku.
Sekarang, pertimbangkan untuk menyimpan string masif yang sama itu di filter suram! Kami hanya dapat memiliki negatif palsu sekarang. Jadi jika kita mengatakan "ya, versi seluruh kumpulan Wikipedia ada di set ini", maka kita harus benar tentang itu. Itu berarti hashing tidak akan membantu kita, karena akan selalu ada beberapa string lain yang hash dengan nilai yang sama. Satu-satunya cara untuk mengatakan "ya" dan pastikan adalah menyimpan seluruh string, atau beberapa data yang setara dengan panjang yang sama. Kami selalu tidak bisa menyimpannya dan berkata "tidak", tetapi akhirnya tingkat kesalahan akan menyusul kami. Yang terbaik yang bisa kita lakukan adalah kompresi, mendapatkan ukuran struktur ke produk entropi data yang disimpan dan akurasi yang kita inginkan.
Jadi, sayangnya filter suram tidak ada. Caching adalah satu-satunya solusi, tetapi sebenarnya bukan kebalikan dari filter bloom, karena ukurannya akan sebanding dengan produk dari jumlah informasi yang disimpan dan tingkat akurasi yang diinginkan dari filter. Tentu saja, dalam banyak skenario dunia nyata, data besar dapat diwakili oleh ID, sehingga caching masih dapat diterima. Tapi secara fundamental berbeda dari filter mekar yang perkasa.
sumber
Anda hanya ingin cache , tetapi memikirkannya dengan cara yang aneh.
sumber
PENOLAKAN: Saya bukan ahli dalam cache sehingga ini mungkin ide yang naif, dan juga mungkin ide yang dikenal yang belum pernah saya dengar sebelumnya. Jadi maafkan saya jika saya gagal mengutip referensi (jika ada); dan tolong beri tahu saya jika ada referensi untuk mengedit posting dan menambahkannya. (Saya curiga ini mungkin memiliki referensi karena sangat intuitif).
sumber
Saya telah menggunakan pohon AVL (dan terkadang merah-hitam) dengan item parsial untuk bertindak sebagai filter tanpa negatif palsu. Gunakan hanya byte X pertama dari item saat memasukkan atau menanyakan pohon. Karena struktur data tidak probabilistik dalam bentuk, tidak ada risiko false-positive oleh bit collision. Dan tidak seperti caching seluruh item, pendekatan ini memberi Anda ruang maksimum yang dapat dihitung. Anda dapat menyesuaikan tingkat positif palsu dengan mempertimbangkan panjang awalan / kedalaman pohon yang berbeda dibandingkan dengan biaya positif palsu dan ruang.
sumber
Saya pikir seseorang dapat membuktikan batas bawah yang menyatakan bahwa struktur data di atas tidak ada. Pada dasarnya, jika struktur data menggunakan m bit, maka bit-vektor tetap (representasi input) dapat sesuai dengan paling banyak ((un) + n eps) \ pilih (tidak)) ditetapkan oleh argumen penghitungan. Mengingat bahwa 2 ^ m kali angka ini harus setidaknya (u \ select n) (semua set harus diwakili), kita mendapatkan batas bawah yang pada dasarnya sangat dekat dengan menyimpan set S secara tepat.
sumber