Encuentra todos los pares de valores que están cerca de la distancia de Hamming


11

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.O(N2)

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.

  1. Aunque este enfoque me está dando buenos resultados, estoy luchando por establecer formalmente la corrección de este enfoque.

  2. 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.kk=1


Solo ideas de 20 segundos de pensamiento: ¿Qué tal una especie de Gray-Code? ¿Qué hay de dividir la lista de mapas de bits de 32 bits en cuatro listas de mapas de bits de 8 bits y luego usar su técnica?
Karl Damgaard Asmussen

1
220230

@minar: tengo 3-4 millones de mapas de bits de 32 bits.
karterk

A[i]4×109A[i].closei

Creo que existe un concepto similar de "quadtrees", excepto con los hipercubos que es aplicable. el algoritmo localiza y localiza recursivamente los vectores en hipercubos, y luego, cuando desea buscar vectores de bits "cercanos", solo busca hipercubos "cercanos". sospechan que pueda ser estudiada y en alguna parte un papel .... no es seguro que los términos correctos ....
VZN

Respuestas:


9

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.

51/5064NN222

45529N4960N


Información Adicional:

  1. 51632
    (165)(325)0.0217
  2. La construcción de las listas, para cada elemento de la lista original, se coloca en la lista aumentada: el elemento en sí, todos los elementos difieren en una posición y todos los elementos difieren en dos posiciones (manteniendo la información sobre el elemento original). El número de copias para cada elemento esCualquier colisión dentro de esta lista (detectada después de la ordenación) corresponde a dos elementos originales a distancia como máximo . Tenga en cuenta que cada par se puede detectar varias veces, por lo que deberá eliminar los duplicados (pero este ya era el caso con su algoritmo inicial).1+32+(322)=529.4
  3. Para el pase final, es preferible podar la lista aumentada de elementos para mantener solo aquellos a una distancia exacta de su elemento original. Luego, para cada elemento original, cree los elementos a distancia y búsquelos dentro de la lista aumentada. Una vez más, debe eliminar duplicados ya que cada par se detectará veces. [Con mucho cuidado, probablemente pueda anticipar / evitar la mayoría de los duplicados, pero no estoy seguro de si vale la pena el esfuerzo].2(323)=49603(53)=10

Para el primer enfoque, ¿está diciendo que permuto el mapa de bits en algunos pedidos predeterminados en lugar de hacer solo rotaciones de bits? ¿Puedes explicar cómo obtuviste la probabilidad de 1/50? Además, para el segundo enfoque, ¿debo crear primero un índice de mi lista y luego para cada elemento: generar combinaciones (32C1 + 32C2) y compararlas con este índice para identificar todos los mapas de bits que difieren en una distancia de 2? Sería genial si puedes explicar esto más a fondo. Gracias.
karterk

5

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.Hx,yH(x)=H(y)HH

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.