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.
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.
Sebbene questo approccio mi dia buoni risultati, sto lottando per stabilire formalmente la correttezza di questo approccio.
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 = 1
A[i].close