WhatsApp

  

Algoritmo de Distancia de Hamming: Conceptos, Implementación en Python y Casos de Uso

Aprende qué es la distancia de Hamming, cómo calcularla con Python y descubre sus aplicaciones, comparaciones con otras métricas y buenas prácticas de rendimiento.

Distancia de Hamming: teoría, implementación en Python y aplicaciones reales

¿Qué es la distancia de Hamming?

La distancia de Hamming es una métrica que cuenta el número de posiciones en las que dos secuencias de igual longitud difieren. Fue propuesta por Richard Hamming en 1950 para detectar errores en códigos de transmisión binaria.

Formalmente, si a = a₁a₂…aₙ y b = b₁b₂…bₙ son dos cadenas de longitud n, la distancia de Hamming se define como:

H(a, b) = \sum_{i=1}^{n} [a_i \neq b_i]

Donde [condición] vale 1 si la condición es verdadera y 0 en caso contrario.

Aplicaciones más comunes

  • Detección y corrección de errores en comunicaciones y almacenamiento.
  • Comparación de códigos genéticos (secuencias de ADN).
  • Filtrado de datos en sistemas de recomendación (p.ej., comparar vectores de características binarias).
  • Seguridad informática: evaluación de hashes y contraseñas (aunque no es la métrica principal).

Implementación básica en Python

A continuación se muestra una función sencilla que calcula la distancia de Hamming entre dos strings o dos listas de bits.

def hamming_distance(a: str, b: str) -> int:
    """Calcula la distancia de Hamming entre dos secuencias de igual longitud.
    Args:
        a (str): Primera cadena o lista de bits.
        b (str): Segunda cadena o lista de bits.
    Returns:
        int: Número de posiciones diferentes.
    """
    if len(a) != len(b):
        raise ValueError("Las secuencias deben tener la misma longitud")
    return sum(ch1 != ch2 for ch1, ch2 in zip(a, b))
# Ejemplo de uso
print(hamming_distance('1011101', '1001001'))  # Salida: 2

Esta versión usa zip y una comprensión generadora, lo que la hace O(n) en tiempo y O(1) en espacio adicional.

Optimización para grandes volúmenes

Cuando se trabaja con millones de comparaciones (por ejemplo, en búsqueda de vecinos más cercanos), se pueden aplicar técnicas como:

  • Convertir las secuencias a int y usar operaciones XOR + bit_count() (disponible a partir de Python 3.8).
  • Utilizar numpy para operar sobre vectores de bits en bloque.
  • Pre‑filtrar pares mediante hashing de min‑hash o Bloom filters para reducir comparaciones.
def hamming_distance_int(a: int, b: int) -> int:
    """Versión ultra rápida usando XOR y bit_count (Python ≥3.8)."""
    return (a ^ b).bit_count()
# Conversión rápida de una cadena binaria a entero
bits = int('1011101', 2)
print(hamming_distance_int(bits, int('1001001', 2)))  # Salida: 2

Comparativa con otras métricas de distancia

Distancia de Hamming
  • Requiere longitud idéntica.
  • Ideal para datos binarios o símbolos fijos.
  • Complejidad O(n).
  • Muy rápido con operaciones bit‑wise.
Distancia de Levenshtein
  • Permite inserciones, borrados y sustituciones.
  • Aplicable a strings de longitud variable.
  • Complejidad O(m·n) (m y n son longitudes).
  • Más costosa, pero más flexible para texto natural.

Casos de uso reales

  1. Control de calidad en hardware: comparar patrones de salida de circuitos integrados.
  2. Detección de plagio en código binario: comparar firmas binarias de ejecutables.
  3. Filtrado de spam en correos electrónicos: comparar vectores de palabras binarizadas.
  4. Biología computacional: medir diferencias entre secuencias de proteínas codificadas en 20‑símbolos mediante codificación binaria.

Mejores prácticas y troubleshooting

  • Validación de longitud: siempre lanzar ValueError si las secuencias difieren en tamaño.
  • Tipo de datos: usar bytes o int cuando el rendimiento sea crítico.
  • Gestión de memoria: evitar crear listas intermedias; prefiera generadores.
  • Depuración: imprimir la máscara XOR (a ^ b) para entender qué bits difieren.

Compatibilidad y requisitos

El código presentado funciona en Python 3.8+. Para versiones anteriores, sustituya int.bit_count() por bin(x).count('1').

def bit_count_legacy(x: int) -> int:
    return bin(x).count('1')

Si necesita procesar datos a nivel de GPU, considere CuPy o PyTorch con tensores binarios.

Conclusión

La distancia de Hamming sigue siendo una herramienta esencial en áreas donde los datos se representan como secuencias fijas y binarias. Con unas pocas líneas de Python, es posible obtener una solución fiable y de alto rendimiento, y con técnicas avanzadas (XOR + bit_count, numpy vectorizado) se escala a grandes volúmenes sin perder velocidad.



Algoritmo de Distancia de Hamming: Conceptos, Implementación en Python y Casos de Uso
ASIMOV Ingeniería S. de R.L. de C.V., Emiliano Nava 15 noviembre, 2025
Compartir
Iniciar sesión dejar un comentario

  
Guía completa de fondos (background) en CSS: conceptos, tipos y ejemplos prácticos
Aprende todo sobre los fondos en CSS: colores, imágenes, gradientes, fondos múltiples y más. Incluye ejemplos de código, buenas prácticas, rendimiento y compatibilidad.