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.
A[i].close
Respuestas:
Como se indicó, su enfoque es problemático, porque si 2 mapas de bits tienen diferencias espaciadas uniformemente, en cualquier rotación, habrá diferencias en algunos bits de alto orden.
Información Adicional:
fuente
La respuesta de minar es excelente y es probablemente el enfoque correcto para este problema en particular. Sin embargo, mencionaré un enfoque más posible:
Puede usar una función hash sensible a la localidad (LSH). Una función hash sensible a la localidad está diseñada de modo que si están cerca en la distancia de Hamming, entonces . Si tiene dicho hash , puede almacenar todos sus valores en una tabla hash (utilizando la función hash y abrir hash), y luego podrá encontrar rápidamente todos los pares de valores cercanos a la distancia de Hamming . Existen varias técnicas para construir un LSH; Puede consultar las referencias sobre este tema para encontrar varios candidatos.H x,y H(x)=H(y) H H
Dicho esto, para su problema particular (con los parámetros específicos que mencionó), espero que los dos algoritmos de minar demuestren ser mejores en la práctica que cualquier esquema basado en LSH. Menciono esto solo en caso de que otros lectores vengan a esta pregunta con un problema similar, pero con diferentes parámetros donde LSH podría tener más sentido.
fuente