Tengo algunos millones de valores de 32 bits. Para cada valor, quiero encontrar todos los demás valores dentro de una distancia de 5. En el enfoque ingenuo, esto requiere comparaciones de , que quiero evitar.
Me di cuenta de que si solo trataba estos valores de 32 bits como enteros y ordenaba la lista una vez, los valores que diferían solo en los bits menos significativos terminarían muy juntos. Esto me permite tener una "ventana" más corta o un rango de números dentro del cual puedo realizar comparaciones reales por pares para la distancia exacta de hamming. Sin embargo, cuando 2 valores varían solo en los bits de orden superior, terminan fuera de esta "ventana" y aparecen en los extremos opuestos de la lista ordenada. P.ej
11010010101001110001111001010110
01010010101001110001111001010110
estaría muy lejos, a pesar de que su distancia de hamming es 1. Dado que, la distancia de hamming entre 2 valores se conserva cuando ambos giran, pensé que al hacer 32 rotaciones a la izquierda y luego ordenar la lista cada vez, es probable que 2 valores terminará lo suficientemente cerca en la lista ordenada en al menos uno de ellos.
Aunque este enfoque me está dando buenos resultados, estoy luchando por establecer formalmente la corrección de este enfoque.
Dado que estoy buscando valores coincidentes con una distancia de hamming o menos, ¿realmente necesito hacer todas las rotaciones de 32 bits? Por ejemplo, si k = 1 y el tamaño de mi ventana es 1000, necesito hacer rotaciones máximas de 24 bits porque incluso si el bit parásito apareciera en cualquiera de los 8 bits de orden inferior, los números resultantes no diferirán en más de 1000.