Saya mencari fungsi hash atas set H (.) Dan relasi R (.,.) Sehingga jika A dimasukkan dalam B maka R (H (A), H (B)). Tentu saja, R (.,.) Harus mudah diverifikasi (waktu konstan), dan H (A) harus dihitung dalam waktu linier.
Salah satu contoh H dan R adalah:
- , di mana k adalah integer tetap dan h (x) fungsi hash atas integer.
- R (H (A), H (B)) = ((H (A) & H (B)) == H (A))
Apakah ada contoh bagus lainnya? (Baik sulit untuk didefinisikan tetapi secara intuitif jika R (H (A), H (B)) maka whp A termasuk dalam B).
Sunting nanti :
- Saya mencari keluarga fungsi hash. Saya punya banyak set; 3 - 8 elemen di setiap set; 90% dari mereka memiliki 3 atau 4 elemen. Contoh fungsi hash yang saya berikan tidak terdistribusi dengan baik untuk kasus ini.
- Jumlah bit H (.) (Dalam contoh saya, k) yang harus kecil (mis. H (.) Harus sesuai dengan bilangan bulat atau panjang).
- Satu sifat bagus dari R adalah bahwa jika H (.) Memiliki k bit maka R (.,.) Berlaku untuk (3 ^ k - 2 ^ k) / 4 ^ k pasangan, yaitu. untuk pasangan yang sangat sedikit.
- Filter Bloom sangat baik untuk set besar. Saya mencoba menggunakan BF untuk masalah ini, tetapi hasil optimal hanya dengan satu fungsi.
(crosspost dari stackoverflow , saya tidak menerima jawaban yang cukup bagus)
ds.algorithms
hash-function
Alexandru
sumber
sumber
Jawaban:
(Jawaban ini awalnya dalam komentar tapi saya memindahkannya ke jawaban terpisah atas saran Suresh.)
Untuk aplikasi Anda dengan set yang sangat kecil Anda mungkin ingin jumlah fungsi hash Bloom menjadi cukup besar untuk meminimalkan jumlah positif palsu. Untuk menghemat waktu perhitungan saya sarankan variasi berikut dari filter Bloom. Asumsikan Anda memiliki tiga fungsi hash tradisional , , untuk elemen yang masing-masing menghasilkan string -bit. Hash setiap elemen ke bitwise dan dari ketiga fungsi hash ini. Hash elemen yang dihasilkan akan menjadi sekitark h1 h2 h3 m 2−3=1/8th yang Hash setiap set ke bitwise atau hash dari elemen penyusunnya. Karena set Anda memiliki 3-8 elemen, hash yang dihasilkan akan berada di lingkungan yang setengahnya, yang mungkin merupakan apa yang Anda inginkan agar tingkat false positive tetap rendah.
Perbedaan antara skema di atas adalah filter Bloom tradisional analog dengan perbedaan antara model grafik acak Erdos acak dan grafik reguler acak . Skema di atas memiliki angka efektif dari hash Bloom sedikit berbeda di sekitar rata-rata tetapi cukup besar sehingga perbedaan ini seharusnya tidak menjadi masalah.Gn,p d k m/8 m/8
sumber
Saya akan mencoba menggunakan filter Bloom sebagai hash Anda dengan hubungan yang sama dengan proposal Anda. Menghitung ukuran filter terbaik dan jumlah fungsi hash untuk aplikasi Anda seharusnya tidak terlalu sulit; lihat artikel Bloom Filter Wikipedia untuk inspirasi. Bergantung pada seberapa buruk Anda ingin menghindari kesalahan positif, sesuatu seperti dan mungkin sudah cukup.m k m=64 k=4
sumber