La distancia de Hamming entre dos cadenas de igual longitud es el número de posiciones en las que los símbolos correspondientes son diferentes.
Dejado P
ser una cadena binaria de longitud n
y T
ser una cadena binaria de longitud 2n-1
. Podemos calcular las n
distancias de Hamming entre P
y cada n
subcadena de longitud T
en orden de izquierda a derecha y ponerlas en una matriz (o lista).
Ejemplo de secuencia de distancia de Hamming
Deje P = 101
y T = 01100
. La secuencia de distancias de Hamming que obtienes de este par es 2,2,1
.
Definición de cercanía
Ahora consideremos dos secuencias de distancias de Hamming. Decir x = (0, 2, 2, 3, 0)
y y = (2, 1, 4, 4, 2)
como ejemplos. Decimos eso x
y y
somos close
si y <= x <= 2*y
o si x <= y <= 2*x
. Aquí la multiplicación escalar y la desigualdad se toman de manera elemento. Es decir, para dos secuencias A
y B
, A <= B iff A[i] <= B[i]
para todos los índices i
.
Tenga en cuenta que las secuencias de distancias de Hamming forman un orden parcial en esta forma de compararlas. En otras palabras, muchos pares de secuencias no son ni mayores ni iguales ni menores ni iguales entre sí. Por ejemplo (1,2)
y (2,1)
.
Entonces, usando el ejemplo anterior, (0, 2, 2, 3, 0) <= 2*(2, 1, 4, 4, 2) = (4, 2, 8, 8, 4)
pero (0, 2, 2, 3, 0)
no es más grande que (2, 1, 4, 4, 2)
. Tampoco (2, 1, 4, 4, 2)
es menor o igual que 2*(0, 2, 2, 3, 0) = (0, 4, 4, 6, 0)
. Como resultado x
y y
no están cerca el uno del otro.
Tarea
Para aumentar a n
partir de n=1
, considere todos los pares posibles de cadenas binarias P
de longitud n
y T
longitud 2n-1
. Hay 2^(n+2n-1)
tales pares y, por lo tanto, muchas secuencias de distancias de Hamming. Sin embargo, muchas de esas secuencias serán idénticas. La tarea es encontrar el tamaño del conjunto más grande de secuencias de distancia de Hamming para que no haya dos secuencias cercanas entre sí.
Su código debe generar un número por valor de n
.
Puntuación
En general, su puntaje es el más alto n
que alcanza su código en mi máquina en 5 minutos (pero siga leyendo). El tiempo es para el tiempo total de funcionamiento, no el tiempo solo para eso n
.
Para dar puntajes a las respuestas no óptimas, ya que es probable que sea difícil encontrar respuestas óptimas, necesitaremos un sistema de puntuación ligeramente sutil. Su puntaje es el valor más alto n
para el cual nadie más ha publicado una respuesta correcta más alta para cualquier tamaño que sea menor que igual a esto. Por ejemplo, si usted emite 2, 4, 21
y alguien más emite, 2, 5, 15
entonces solo puntuaría 1
como alguien más tiene una mejor respuesta para n = 2
. Si genera 2, 5, 21
resultados, obtendría puntajes 3
sin importar los resultados de cualquier otra persona, porque esas respuestas son todas óptimas. Claramente, si tiene todas las respuestas óptimas, obtendrá la puntuación más alta n
que publique. Sin embargo, incluso si su respuesta no es la óptima, aún puede obtener el puntaje si nadie más puede superarlo.
Ejemplo de respuestas y ejemplo trabajado
(Estas respuestas aún no están marcadas. Se recibiría agradecidamente la verificación independiente).
Gracias a ETHproductions:
- n = 1 da 2.
- n = 2 da 5.
- n = 3 da 21.
Veamos n = 2
con más detalle. En este caso, la lista completa de secuencias de distancia de Hamming (representada por tuplas aquí) es:
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
Podemos ver que (0,0)
no está cerca de ninguna otra tupla. De hecho, si tomamos (0, 0)
, (0, 1)
, (1, 0)
, (2, 1)
, (1,2)
entonces ninguna de esas tuplas están cerca de cualquiera de los otros. Esto da una puntuación de 5
para n = 2
.
Para n = 3
la lista completa de distintas secuencias de distancia de Hamming es:
[(0, 0, 0), (0, 0, 1), (0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 2, 1), (0, 2, 2), (0, 2, 3), (0, 3, 0), (0, 3, 1), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 1, 3), (1, 2, 0), (1, 2, 1), (1, 2, 2), (1, 2, 3), (1, 3, 0), (1, 3, 1), (1, 3, 2), (2, 0, 1), (2, 0, 2), (2, 0, 3), (2, 1, 0), (2, 1, 1), (2, 1, 2), (2, 1, 3), (2, 2, 0), (2, 2, 1), (2, 2, 2), (2, 2, 3), (2, 3, 1), (2, 3, 2), (2, 3, 3), (3, 0, 2), (3, 0, 3), (3, 1, 0), (3, 1, 1), (3, 1, 2), (3, 2, 0), (3, 2, 1), (3, 2, 2), (3, 3, 2), (3, 3, 3)]
De esas 48
secuencias, podemos elegir un conjunto de tamaños 21
para que ningún par en ese conjunto esté cerca el uno del otro.
Idiomas y bibliotecas
Puede usar cualquier idioma y bibliotecas disponibles que desee. Siempre que sea posible, sería bueno poder ejecutar su código, por lo tanto, si es posible, incluya una explicación completa sobre cómo ejecutar / compilar su código en Linux.
Mi máquina Los tiempos se ejecutarán en mi máquina de 64 bits. Esta es una instalación estándar de ubuntu con 8 GB de RAM, procesador AMD FX-8350 de ocho núcleos y Radeon HD 4250. Esto también significa que necesito poder ejecutar su código.
Respuesta líder
- Puntuación de 4 por 2, 5, 21, 83, 361 por Christian Sievers. C ++
- Puntuación de 5 para 2, 5, 21, 83, 372 por fəˈnɛtɪk. Javascript