Saya ingin tahu apakah ada cara untuk menyimpan hash multi-set bilangan bulat yang memiliki properti berikut, idealnya:
- Ini menggunakan O (1) ruang
- Ini dapat diperbarui untuk mencerminkan penyisipan atau penghapusan dalam waktu O (1)
- Dua koleksi yang identik (yaitu, koleksi yang memiliki elemen yang sama dengan multiplisitas yang sama) harus selalu hash dengan nilai yang sama, dan dua koleksi yang berbeda harus hash ke nilai yang berbeda dengan probabilitas tinggi (yaitu, fungsi independen atau berpasangan independen)
Salah satu upaya awal ini adalah untuk menyimpan modulo produk perdana acak dari hash elemen individu. Ini memuaskan 1 dan 2 tetapi tidak jelas apakah itu, atau variasi dekat, akan memuaskan 3.
Saya awalnya memposting ini di StackOverflow .
* Properti 1 dan 2 bisa sedikit santai untuk, katakanlah, O (log n), atau polinomial sublinear kecil. Intinya adalah untuk melihat apakah kita dapat mengidentifikasi multi-set dan andal menguji kesetaraan tanpa menyimpan elemen itu sendiri.
Jawaban:
Jika Anda menganggap set sebagai hidup di alam semesta , cukup mudah untuk menyelesaikan masalah Anda dengan waktu pembaruan O ( lg u ) . Yang Anda butuhkan adalah fungsi hash cepat untuk vektor nomor u , dengan "pembaruan lokal" yang cepat.[ u ] O ( lgkamu ) kamu
Wikipedia / Universal hashing menyarankan , di mana p adalah bilangan prima yang cukup besar dan a secara seragam diambil dari [ p ] . Bila Anda menambahkan atau menghapus elemen i , Anda harus menambahkan / mengurangi sebuah i dari kode hash, yang mengambil O ( lg sayah ( x⃗ ) = ( Âkamui = 1xsayaSebuahsaya) modp hal Sebuah [ p ] saya Sebuahsaya waktu menggunakan membagi dan menaklukkan untuk exponentiation tersebut. Karena jumlahnya banyak dari tingkat uO ( lgi ) kamu hanya dapat memiliki akar, kemungkinan tabrakan dua set yang berbeda adalah O [ u ] , tentu saja Anda bisa mulai dengan memecah alam semesta ke alam semesta yang lebih kecil.kamu . Ini dapat dibuat sangat kecil dengan mengambil p menjadi cukup besar (misalnya, p = u 2 dan Anda bekerja dalam "presisi ganda"). Jika set jauh lebih kecil dariO ( u / p ) hal p = u2 [ u ]
Adakah yang tahu solusi dengan probabilitas tabrakan saat hashing ke range [ p ]O ( 1 / p ) [ p ] ? Ini seharusnya mungkin.
sumber
Carter dan Wegman membahas hal ini dalam fungsi hash Baru dan penggunaannya dalam otentikasi dan menetapkan kesetaraan ; sangat mirip dengan apa yang Anda gambarkan. Pada dasarnya fungsi hash komutatif dapat diperbarui satu elemen pada satu waktu untuk penyisipan dan penghapusan, dan kecocokan probabilitas tinggi, dalam O (1).
sumber
Kualitas fungsi hash akan selalu bergantung pada properti elemen yang harus hash. Bisakah Anda mengatakan sesuatu tentang ini? Misalnya, saran produk Anda mungkin fungsi hash yang buruk jika elemen x_i multiset Anda biasanya memiliki banyak faktor prima kecil. Tetapi Anda dapat memperbaikinya dalam hal ini hanya dengan mengambil produk dari semua x_i + p mod q untuk beberapa bilangan prima p dan q.
sumber
jumlah tersebut memungkinkan kita untuk memiliki banyak kejadian dengan nilai yang sama
dengan xor memungkinkan kita untuk memiliki jumlah yang sama dengan jumlah yang sama
sumber