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 , 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.
Meskipun pendekatan ini memberi saya hasil yang baik, saya berjuang untuk secara formal menetapkan kebenaran dari pendekatan ini.
Mengingat bahwa saya mencari nilai yang cocok dengan jarak hamming atau kurang, apakah saya benar-benar perlu melakukan semua rotasi 32 bit? Untuk misalnya jika 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.
A[i].close
Jawaban:
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 ).5 1 / 50 64 ⋅ N N≈ 222
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 .4 5 529 ⋅ N 4960 ⋅ N
Informasi tambahan:
sumber
jawaban minar sangat bagus dan mungkin pendekatan yang tepat untuk masalah khusus ini. Namun, saya akan menyebutkan satu pendekatan lagi yang mungkin:
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.
sumber