La distancia Hamming es una métrica fundamental en teoría de la información y ciencias de la computación, que mide la diferencia entre dos cadenas de caracteres de igual longitud. Específicamente, la distancia Hamming se define como el número de posiciones en las que los correspondientes símbolos son diferentes. Esta métrica tiene diversas aplicaciones en campos tales como la detección y corrección de errores, genética (por ejemplo, para medir diferencias en secuencias genéticas), criptografía (por ejemplo en la comparación de claves) y en el procesamiento de señales.
Dicha distancia entre dos cadenas A y B de la misma longitud se calcula contando el número de posiciones en las que los caracteres correspondientes difieren. Por ejemplo, consideremos las siguientes dos cadenas binarias:
En este caso, la distancia Hamming entre A y B será de 2, ya que las cadenas difieren en las posiciones 2 y 4.
CALCULANDO DISTANCIA HAMMING EN PYTHON:
A continuación, vamos a ver como podemos efectuar el calculo de esta distancia usando Python. Para ello nos valdremos de una función que realice un recorrido por ambas cadenas usando un bucle ‘for‘:
En este prime ejemplo hemos utilizado una función (a la que hemos llamado ‘hamming_distance()‘) que tomando como argumentos las dos cadenas a comparar, empieza verificando si ambas tienen la misma longitud de modo que de no ser así, lanzará un error. Tras esta primera comprobación, inicializa una variable (‘distance‘) a 0 y recorre ambas cadenas (mediante el bucle ‘for‘) en paralelo usando la función ‘zip()‘, comparando cada par de caracteres correspondientes. De modo que si los caracteres son diferentes, incrementará la variable ‘distance‘ en 1. Al finalizar el bucle, el valor de ‘distance‘ representará la cantidad de posiciones en las que las cadenas difieren, es decir, la distancia Hamming entre las dos cadenas.
OUTPUT:
A su vez podemos utilizar las compresión de listas (de las que ya hemos hablado en alguna ocasión) para ahorrar algunas líneas de código, obteniendo el mismo resultado:
La principal diferencia con el caso anterior estriba en el uso de la función ‘sum()‘. Dentro de la cual, se utiliza una expresión para recorrer las cadenas en paralelo con (usando nuevamente ‘zip()‘), comparando cada par de caracteres correspondientes. De modo que la expresión generadora producirá True
(equivalente a 1) cada vez que los caracteres son diferentes y False
(equivalente a 0) cuando sean iguales. Así, la función ‘sum()‘ sumará estos valores booleanos, proporcionando directamente la cantidad de posiciones en las que las cadenas difieren, es decir, la distancia Hamming. Tal y como hemos señalado, este método es más conciso y utiliza menos líneas de código.
Un modo aún mas directo que el anterior es el basado en el uso de la función ‘hamming()‘ de la librería externa ‘scipy‘, la cual, también a sido objeto de estudio en artículos anteriores:
En este caso los que hacemos es convertir las cadenas en listas de caracteres (con la función ‘list()‘) incluyendo las listas creadas como argumentos de la función ‘hamming()‘ de ‘scipy.spatial.distance‘ para calcular la distancia Hamming normalizada (es decir, la proporción de posiciones diferentes). Dado que esta función devuelve un valor entre 0 y 1, multiplicaremos por la longitud de las cadenas para obtener la distancia Hamming real. Este enfoque es eficiente y reduce la cantidad de código necesario, aprovechando las capacidades de una biblioteca científica bien establecida.
OUTPUT:
CONCLUSION:
En conclusión, la distancia Hamming proporciona una forma simple y efectiva de medir diferencias entre cadenas de igual longitud. Python ofrece múltiples métodos para calcularla, desde bucles básicos hasta el uso de bibliotecas especializadas como scipy
. Esta versatilidad y simplicidad de implementación hacen que la distancia Hamming sea ampliamente utilizada en numerosos campos científicos y técnicos.
Saludos.