Trova tutte le coppie di valori vicini alla distanza di Hamming


11

Ho alcuni milioni di valori a 32 bit. Per ogni valore, voglio trovare tutti gli altri valori entro una distanza di martellamento di 5. Nell'approccio ingenuo, questo richiede confronti , che voglio evitare.O(N2)

Mi sono reso conto che se avessi trattato questi valori a 32 bit come numeri interi e ordinato una volta l'elenco, allora i valori che differivano solo nei bit meno significativi finivano molto vicini. Questo mi permette di avere una "finestra" più corta o un intervallo di numeri all'interno del quale posso eseguire veri e propri confronti a coppie per la distanza esatta di percussione. Tuttavia, quando 2 valori variano solo nei bit di ordine superiore, finiscono fuori da questa "finestra" e compaiono alle estremità opposte dell'elenco ordinato. Per esempio

11010010101001110001111001010110

01010010101001110001111001010110

sarebbe molto distante, anche se la loro distanza di percussione è 1. Dato che la distanza di percussione tra 2 valori viene preservata quando entrambi vengono ruotati, ho pensato che facendo 32 rotazioni a sinistra e poi ordinando l'elenco ogni volta, è probabile che 2 valori finirà abbastanza vicino nell'elenco ordinato in almeno uno di essi.

  1. Sebbene questo approccio mi dia buoni risultati, sto lottando per stabilire formalmente la correttezza di questo approccio.

  2. Dato che sto cercando valori corrispondenti con una distanza di martellamento o inferiore, devo davvero eseguire tutte le rotazioni a 32 bit? Ad esempio, se e la mia dimensione della finestra è 1000, devo fare con rotazioni di massimo 24 bit perché anche se il bit vagante appare in uno degli 8 bit di ordine inferiore, i numeri risultanti non differiranno di oltre 1000.k = 1kk=1


Solo idee da 20 secondi di riflessione: che ne dici di una specie di Gray-Code? Che ne dici di dividere l'elenco delle bitmap a 32 bit in quattro elenchi di bitmap a 8 bit e quindi di usare la tua tecnica?
Karl Damgaard Asmussen,

1
Potresti essere più preciso sul numero molto elevato di bitmap? È vicino a , 2 30 o altro? 220230
minar

@minar: ho 3-4 milioni di tali bitmap a 32 bit.
Karterk,

Non sono sicuro di quello che stai chiedendo. Stai dicendo che hai una matrice di stringhe booleane di 32 lettere (grande ma che non contiene tutte le 4 × 10 9 possibili stringhe) e che vuoi in qualche modo contrassegnare le coppie che hanno la distanza di Hamming al massimo 5, forse creando un elenco collegato di indici di vicini per ogni stringa i ? A[i]4×109A[i].closei
András Salamon,

pensa che esista un concetto simile di "quadricre" tranne che con ipercubi. l'algoritmo individua e individua ricorsivamente i vettori negli ipercubi, e quindi quando si desidera cercare bitvector "vicini", si cercano solo i ipercubi "vicini". sospetto che possa essere studiato e in un documento da qualche parte .... non sono sicuro dei termini corretti ....
vzn

Risposte:


9

Come detto, il tuo approccio è problematico, perché se 2 bitmap hanno differenze spaziate uniformemente in qualsiasi rotazione, ci saranno differenze su alcuni bit di alto ordine.

51/5064NN222

45529N4960N


Informazioni aggiuntive:

  1. 51632
    (165)(325)0.0217
  2. 1+32+(322)=529.4
  3. Per il passaggio finale, è preferibile potare l'elenco aumentato di elementi per mantenere solo quelli a distanza esatta dal loro elemento originale. Quindi, per ogni elemento originale, crea gli elementi alla distanza e nell'elenco aumentato. Ancora una volta, è necessario rimuovere i duplicati poiché ogni coppia verrà rilevata volte. [Con molta cura, probabilmente puoi anticipare / evitare la maggior parte dei duplicati, ma non sono sicuro che valga la pena.]( 3223 ( 5(323)=49603(53)=10

Per il primo approccio, stai dicendo che permetto la bitmap in alcuni ordini predeterminati invece di fare solo rotazioni di bit? Puoi spiegare come hai ottenuto la probabilità 1/50? Inoltre, per il secondo approccio, devo creare prima un indice della mia lista e poi per ogni elemento - generare (32C1 + 32C2) combinazioni e verificarle contro questo indice per identificare tutte le bitmap che differiscono per una distanza di 2? Sarebbe bello se puoi spiegarlo ulteriormente. Grazie.
Karterk,

5

La risposta di Minar è eccellente ed è probabilmente l'approccio giusto per questo particolare problema. Tuttavia, citerò un altro approccio possibile:

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

Detto questo, per il tuo particolare problema (con i parametri specifici che hai citato), mi aspetto che i due algoritmi di Minar si dimostrino migliori nella pratica rispetto a qualsiasi schema basato su LSH. Lo dico solo nel caso in cui altri lettori arrivino a questa domanda con un problema simile, ma con parametri diversi in cui LSH potrebbe avere più senso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.