Los algoritmos de compresión son procedimientos de codificación diseñados para representar una cantidad de información utilizando un menor volumen de datos. El objetivo principal es reducir el espacio de almacenamiento necesario y acelerar la transmisión de datos.
Se pueden clasificar principalmente en dos categorías:
- Compresión sin pérdida (Lossless): Estos algoritmos permiten reconstruir la información original de forma exacta a partir de los datos comprimidos. Se utilizan en aplicaciones donde la integridad de los datos es crucial, como archivos de texto, documentos, software y archivos de datos. Algunos ejemplos incluyen:
- LZ77 y sus variantes (como LZW y Deflate): Utilizados en formatos como ZIP, GZIP y PNG.
- Codificación Huffman: Asigna códigos más cortos a los símbolos que aparecen con mayor frecuencia.
- Run-Length Encoding (RLE): Reemplaza secuencias repetidas de un mismo símbolo con el símbolo y el número de repeticiones.
- Brotli: Un algoritmo moderno desarrollado por Google que ofrece una mejor relación de compresión que GZIP.
- Compresión con pérdida (Lossy): Estos algoritmos eliminan cierta información que se considera menos importante para la percepción humana (en el caso de audio y video) o para el uso previsto de los datos. Esto permite obtener tasas de compresión mucho mayores, pero la información original no se puede recuperar por completo. Se utilizan comúnmente en la compresión de imágenes (JPEG, WebP), audio (MP3, AAC) y video (MPEG, H.264).
La elección del algoritmo de compresión depende de varios factores, incluyendo el tipo de datos, la necesidad de preservar la información original, la tasa de compresión deseada y los recursos computacionales disponibles para la compresión y descompresión.
Ejemplo de Algoritmo Brotli para la compresión de recursos web
import brotli
import time
# Datos de ejemplo (un texto largo)
texto_original = """
Este es un texto de ejemplo bastante largo que vamos a comprimir usando el algoritmo Brotli.
El objetivo es demostrar cómo se puede reducir el tamaño de los datos utilizando esta técnica de compresión sin pérdida.
Brotli es conocido por ofrecer una buena relación de compresión, especialmente para archivos de texto y HTML.
Se utiliza ampliamente en la compresión de recursos web para mejorar la velocidad de carga de las páginas.
Podemos observar la diferencia de tamaño entre el texto original y los datos comprimidos.
Luego, descomprimiremos los datos para verificar que la información original se recupera correctamente.
Este proceso ilustra el principio fundamental de la compresión sin pérdida.
"""
# Codificar el texto a bytes
datos_originales = texto_original.encode('utf-8')
tamaño_original = len(datos_originales)
print(f"Tamaño original de los datos: {tamaño_original} bytes")
# Comprimir los datos usando Brotli
inicio_compresion = time.time()
datos_comprimidos = brotli.compress(datos_originales)
fin_compresion = time.time()
tamaño_comprimido = len(datos_comprimidos)
tiempo_compresion = fin_compresion - inicio_compresion
print(f"Tamaño de los datos comprimidos: {tamaño_comprimido} bytes")
print(f"Tiempo de compresión: {tiempo_compresion:.4f} segundos")
print(f"Relación de compresión: {tamaño_original / tamaño_comprimido:.2f}")
# Descomprimir los datos usando Brotli
inicio_descompresion = time.time()
datos_descomprimidos = brotli.decompress(datos_comprimidos)
fin_descompresion = time.time()
tiempo_descompresion = fin_descompresion - inicio_descompresion
print(f"Tiempo de descompresión: {tiempo_descompresion:.4f} segundos")
# Decodificar los bytes a texto nuevamente
texto_descomprimido = datos_descomprimidos.decode('utf-8')
# Verificar si el texto original y el descomprimido son iguales
if texto_original == texto_descomprimido:
print("La descompresión fue exitosa. Los datos originales y descomprimidos son idénticos.")
else:
print("Error: Los datos originales y descomprimidos no coinciden.")