Temukan semua pasangan nilai yang dekat di bawah jarak Hamming

11

Saya memiliki beberapa juta nilai 32-bit. Untuk setiap nilai, saya ingin menemukan semua nilai lain dalam jarak hamming 5. Dalam pendekatan naif, ini membutuhkan perbandingan HAI(N2) , yang ingin saya hindari.

Saya menyadari bahwa jika saya hanya memperlakukan nilai-nilai 32-bit ini sebagai bilangan bulat dan mengurutkan daftar sekali, maka nilai-nilai yang berbeda hanya dalam bit paling signifikan berakhir sangat berdekatan. Ini memungkinkan saya untuk memiliki "jendela" yang lebih pendek atau kisaran angka di mana saya dapat melakukan perbandingan pasangan-bijaksana yang sebenarnya untuk jarak hamming yang tepat. Namun, ketika 2 nilai hanya bervariasi dalam bit urutan yang lebih tinggi, maka mereka berakhir di luar "jendela" ini dan muncul di ujung yang berlawanan dari daftar yang diurutkan. Misalnya

11010010101001110001111001010110

01010010101001110001111001010110

akan sangat berjauhan, meskipun jarak hamming mereka adalah 1. Karena, jarak hamming antara 2 nilai dipertahankan ketika keduanya diputar, saya pikir dengan melakukan 32 rotasi kiri dan kemudian menyortir daftar setiap waktu, kemungkinan ada 2 nilai akan berakhir cukup dekat dalam daftar yang disortir di setidaknya satu dari mereka.

  1. Meskipun pendekatan ini memberi saya hasil yang baik, saya berjuang untuk secara formal menetapkan kebenaran dari pendekatan ini.

  2. Mengingat bahwa saya mencari nilai yang cocok dengan jarak hamming k atau kurang, apakah saya benar-benar perlu melakukan semua rotasi 32 bit? Untuk misalnya jika k=1 dan ukuran jendela saya adalah 1000, saya perlu melakukan rotasi maksimum 24 bit karena walaupun bit nyasar muncul di salah satu dari 8 bit urutan yang lebih rendah, angka yang dihasilkan tidak akan berbeda lebih dari 1000.

karterk
sumber
Hanya ide dari 20 detik pemikiran: Bagaimana dengan sortir menurut Gray-Code? Bagaimana dengan membagi daftar bitmap 32-bit menjadi empat daftar bitmap 8-bit dan kemudian menggunakan teknik Anda?
Karl Damgaard Asmussen
1
Bisakah Anda lebih tepat tentang jumlah bitmap yang sangat besar? Hampir , 2 30 atau apa pun? 220230
minar
@ minar: Saya punya 3-4 juta bitmap 32-bit.
karterk
Saya tidak yakin apa yang Anda tanyakan. Apakah Anda mengatakan bahwa Anda memiliki larik dari string Boolean 32 huruf (besar tetapi tidak mengandung semua string 4 × 10 9 yang mungkin), dan Anda ingin menandai pasangan yang memiliki jarak Hamming paling banyak 5 dalam beberapa cara, mungkin dengan membuat daftar indeks terkait tetangga dekat untuk setiap string i ? SEBUAH[saya]4×109A[i].closesaya
András Salamon
pikir ada konsep serupa "quadtrees" kecuali dengan hypercubes yang berlaku. Algoritma menempatkan & secara rekursif menemukan vektor dalam hypercubes, dan kemudian ketika Anda ingin mencari bitvectors "terdekat", Anda hanya mencari hypercubes "terdekat". mencurigai itu dapat dipelajari & di sebuah makalah di suatu tempat .... tidak yakin istilah yang benar ....
vzn

Jawaban:

9

Seperti yang dinyatakan, pendekatan Anda bermasalah, karena jika 2 bitmap memiliki perbedaan spasi secara merata maka dalam rotasi apa pun, akan ada perbedaan pada beberapa bit orde tinggi.

Anda dapat menggeneralisasi pendekatan Anda dengan mengubah posisi bit dengan cara yang lebih kompleks. Memang, jika Anda memilih permutasi acak bit, maka semua perbedaan antara 2 bitmap dengan jarak akan muncul di 16 rendah-order bit dengan probabilitas lebih baik dari 1 / 50 . Jadi, ulangi beberapa ratus kali Anda harus menemukan proporsi yang sangat besar dari pasangan bitmap Anda. Untuk setiap percobaan, jumlah pasangan untuk menguji (dengan sama 16 bit tinggi) dekat dengan 64 N (untuk N 2 22 ).51/5064NN222

Namun, saya juga akan mencoba pendekatan berikut. Buat daftar bitmap Anda yang dimodifikasi paling banyak pada posisi 2 bit dan urutkan daftar ini. Jika ada tabrakan dalam daftar ini, Anda memiliki dua bitmap dalam jarak . Kemudian sebutkan semua nilai bitmap awal Anda yang dimodifikasi tiga posisi dan cari dalam daftar untuk menemukan pasangan bitmap pada jarak 5 . Biaya memori dari pendekatan ini memerlukan menyimpan 529 N elemen dan jumlah elemen untuk mencari di tahap kedua adalah 4960 N .45529N4960N


Informasi tambahan:

  1. Probabilitas bahwa perbedaan terletak pada bit urutan 16 rendah setelah permutasi acak dari posisi- 32 bit hanyalah hasil bagi dari dua binomial: ( 1651632
    (165)(325)0,0217
  2. Konstruksi daftar, untuk setiap elemen dalam daftar asli, dimasukkan ke dalam daftar augmented: elemen itu sendiri, semua elemen berbeda dalam satu posisi dan semua elemen berbeda dalam dua posisi (menjaga informasi tentang elemen asli). Jumlah salinan untuk setiap elemen adalah 1+32+(322)=529.4
  3. 2(323)=49603(53)=10
minar
sumber
Untuk pendekatan pertama, apakah Anda mengatakan bahwa saya mengubah bitmap dalam beberapa pesanan yang telah ditentukan alih-alih melakukan rotasi bit saja? Bisakah Anda jelaskan bagaimana Anda mendapat kemungkinan 1/50? Juga, untuk pendekatan kedua, apakah saya perlu membuat indeks daftar saya terlebih dahulu dan kemudian untuk setiap elemen - menghasilkan (32C1 + 32C2) kombinasi dan memeriksa mereka terhadap indeks ini untuk mengidentifikasi semua bitmap berbeda dengan jarak 2? Akan lebih bagus jika Anda bisa menjelaskan ini lebih jauh. Terima kasih.
karterk
5

jawaban minar sangat bagus dan mungkin pendekatan yang tepat untuk masalah khusus ini. Namun, saya akan menyebutkan satu pendekatan lagi yang mungkin:

Hx,yH(x)=H(y)HH

Yang mengatakan, untuk masalah khusus Anda (dengan parameter spesifik yang Anda sebutkan), saya berharap dua algoritma minar akan terbukti lebih baik dalam praktik daripada skema berbasis LSH. Saya menyebutkan ini hanya jika pembaca lain datang ke sini untuk pertanyaan ini dengan masalah yang sama, tetapi dengan parameter yang berbeda di mana LSH mungkin lebih masuk akal.

DW
sumber