Visualizador de Codificación Huffman

Introduce un texto para ver cómo la codificación Huffman asigna códigos más cortos a los caracteres frecuentes.

Cargando simulación interactiva...

Huffman nunca puede gastar menos de un bit 🖖

Los códigos de Huffman son óptimos, pero solo dentro de una regla que les cuesta caro: cada símbolo debe recibir un número entero de bits. El límite de Shannon dice que un símbolo que aparece el 90% del tiempo vale unos 0,15 bits, y una fuente formada por un 90% de un carácter y un 10% de otro solo lleva 0,469 bits de entropía por símbolo. Huffman no puede escribir una fracción de bit, así que asigna 1 y 1 — gastando más del doble de lo que vale la información. Esa brecha es la razón de que los datos muy sesgados se compriman decepcionantemente aquí, y de que existan los codificadores aritméticos y de rango: codifican el mensaje entero como un solo número y pueden gastar bits fraccionarios. Huffman es óptimo entre los códigos de bits enteros, que es una afirmación más estrecha que óptimo.

Combinar siempre los dos menos frecuentes 🖖

El árbol crece de abajo hacia arriba: primero se enumera cada carácter según su frecuencia y luego se unen repetidamente los dos elementos menos frecuentes en un pequeño subárbol, tratándolo como un solo paquete. Se repite hasta que queda un único árbol; después cada código se lee bajando desde la cima: la izquierda es 0, la derecha es 1. Esta costumbre "voraz" de unir siempre los dos más pequeños parece miope, pero demostrablemente produce los códigos más cortos posibles.

Un trabajo que superó al profesor 🖖

David Huffman lo ideó en 1951 siendo estudiante de posgrado en el MIT, cuando el profesor Robert Fano ofreció a la clase elegir entre un examen final y un trabajo sobre cómo hallar el código más eficiente. Fano y Claude Shannon ya lo habían intentado, construyendo sus árboles de arriba hacia abajo. Huffman casi se rinde, pero comprendió que construir de abajo hacia arriba —fusionando primero los símbolos más raros— era óptimo, superando el método de su propio maestro.

CODIFICACIÓN DE HUFFMAN — ¿CUÁNDO AYUDA, Y CUÁNTO SE ACERCA AL ÓPTIMO?

¿En qué caso de compresión estás?

Huffman da códigos cortos a los símbolos frecuentes y largos a los raros, y está demostrado que es lo mejor posible mientras cada símbolo reciba un número entero de bits. Lo que ahorra depende por completo de lo desigual que sea el reparto de frecuencias. Perfectamente igual, y no hay nada que explotar; muy desigual, y gana de largo, hasta el punto en que el límite deja de ser las frecuencias y pasa a ser el bit entero.

Frecuencias desiguales: justo para lo que sirve el método pi ↑ ⇒ ℓi
Todos los símbolos igual de comunes: nada que explotar pi = 1/n ⇒ ℓ = log₂n
Texto corriente: a un bit del suelo teórico H ≤ ℓ < H + 1
Un único símbolo: el suelo que Huffman no puede rebasar n = 1 ⇒ ℓ = 1

01

Frecuencias desiguales: justo para lo que sirve el método

Lo que sabes: Unos pocos símbolos dominan el texto. Esos reciben los códigos más cortos, y el total cae muy por debajo de una codificación de longitud fija.

Coste: pi ↑ ⇒ ℓi

Ejemplo resuelto: «mississippi»: 11 caracteres, 4 símbolos distintos, codificados en 21 bits frente a 88 con caracteres de 8 bits: un ahorro del 76,1 %

Abrir este caso: mississippi
Frecuencias desiguales: justo para lo que sirve el método. Los dos símbolos más frecuentes reciben los códigos más cortos, y el total baja en consecuencia. Unos pocos símbolos dominan el texto. Esos reciben los códigos más cortos, y el total cae muy por debajo de una codificación de longitud fija.
Los dos símbolos más frecuentes reciben los códigos más cortos, y el total baja en consecuencia.

02

Todos los símbolos igual de comunes: nada que explotar

Lo que sabes: Con una distribución plana no hay símbolos frecuentes a los que premiar. Huffman degenera en algo muy parecido a un código de longitud fija.

Coste: pi = 1/n ⇒ ℓ = log₂n

Ejemplo resuelto: «abcdef»: 6 símbolos distintos, cada uno una vez, codificados en 16 bits. Un código llano de 3 bits para seis símbolos gastaría 18.

Abrir este caso: uniforme
Todos los símbolos igual de comunes: nada que explotar. Una distribución plana da un árbol casi uniforme, y todos los códigos miden casi lo mismo. Con una distribución plana no hay símbolos frecuentes a los que premiar. Huffman degenera en algo muy parecido a un código de longitud fija.
Una distribución plana da un árbol casi uniforme, y todos los códigos miden casi lo mismo.

03

Texto corriente: a un bit del suelo teórico

Lo que sabes: Una mezcla realista de símbolos repetidos y únicos. Este es el caso de todos los días, y el resultado queda justo por encima de la cota de entropía.

Coste: H ≤ ℓ < H + 1

Ejemplo resuelto: «hello world»: 11 caracteres sobre 8 símbolos distintos, codificados en 32 bits frente a 88: un 63,6 % ahorrado, con el suelo de entropía en 31,3 bits

Abrir este caso: hello world
Texto corriente: a un bit del suelo teórico. Una distribución mixta da un árbol desequilibrado, y el total queda justo por encima de la cota de entropía. Una mezcla realista de símbolos repetidos y únicos. Este es el caso de todos los días, y el resultado queda justo por encima de la cota de entropía.
Una distribución mixta da un árbol desequilibrado, y el total queda justo por encima de la cota de entropía.

04

Un único símbolo: el suelo que Huffman no puede rebasar

Lo que sabes: Un texto sin variedad ninguna. Su entropía es cero, pero Huffman aún debe emitir al menos un bit por símbolo, porque no hay código más corto que un solo bit.

Coste: n = 1 ⇒ ℓ = 1

Ejemplo resuelto: «aaaaaaaaaa»: 10 caracteres, un símbolo distinto, codificados en 10 bits. La entropía del texto es de 0 bits.

Abrir este caso: un solo carácter
Un único símbolo: el suelo que Huffman no puede rebasar. Un símbolo, un bit cada uno: ninguna distribución que explotar y ningún código más corto disponible. Un texto sin variedad ninguna. Su entropía es cero, pero Huffman aún debe emitir al menos un bit por símbolo, porque no hay código más corto que un solo bit.
Un símbolo, un bit cada uno: ninguna distribución que explotar y ningún código más corto disponible.
Referencias (1)

Problema resuelto al detalle

  1. El ahorro de codificar "hello world" con la codificación de Huffman 5 pasos

    Codifica "hello world" con la codificación de Huffman. Halla el ahorro y luego halla el límite que indica cuánto mejor podría ser cualquier código.

    1. ASCII de ancho fijo dedica los mismos ocho bits a cada carácter, independientemente de la frecuencia con la que aparezca. Ese es el desperdicio que elimina Huffman: los símbolos frecuentes reciben códigos cortos, y los raros, códigos largos.

    2. Cuenta primero los símbolos, ya que el código se construye a partir de los conteos. Solo 'l' y 'o' se repiten; los otros seis caracteres aparecen una sola vez cada uno.

    3. La entropía de Shannon es la información media por símbolo y constituye un límite inferior infranqueable: ningún código unívocamente decodificable puede mejorarla por término medio. El cálculo depende por entero de tres probabilidades distintas: 3/11 para 'l', 2/11 para 'o' y 1/11 para cada uno de los otros seis símbolos. La suma es (3/11)(1,8745) + (2/11)(2,4594) + (6/11)(3,4594).

    4. Multiplica por la longitud de la cadena para obtener el límite inferior en bits. Huffman debe dar un resultado igual o superior a este, y en general no puede alcanzarlo, porque las longitudes de los códigos son números enteros de bits mientras que la entropía no lo es.

    5. Construye el árbol para obtener la longitud real. En cada paso, Huffman combina los dos pesos menores: 1+1, 1+1, 1+1; después, 2+2, luego 2+2, 3+4 y, por último, 4+7. Cada combinación añade un bit a todos los símbolos que quedan por debajo, así que la longitud codificada es la suma de los pesos combinados: 2+2+2+4+4+7+11 = 32, el mismo valor que muestra el visualizador.

    Respuesta

    De 88 bits a 32: un ahorro del 63.6%. El límite inferior de entropía para estas frecuencias es de 31.3 bits, y Huffman produjo 32: 0.7 bits por encima del óptimo, consumidos al redondear ocho longitudes de código a bits enteros. La garantía es el sándwich H ≤ longitud media < H + 1: Huffman nunca está más de un bit por símbolo por encima del óptimo. Esa brecha de un solo bit es exactamente la razón por la que existe la codificación aritmética.

Ruta de aprendizaje

Compresión a mano

Lleva a LZ77 códigos de longitud desigual, asignando los más cortos a los símbolos frecuentes.

Problemas de ejemplo

  • hello world - De 88 bits en ASCII a 32: un ahorro del 63,6 %, apenas 0,7 bits por encima del límite inferior de entropía, situado en 31,3.
  • mississippi - Cuatro caracteres distintos entre once: de 88 bits a 21, con un código de un solo bit para la s. Es también el caso con mayor distancia al límite inferior de entropía: 0,95 bits.
  • uniforme - Seis símbolos que aparecen una sola vez; no hay nada que aprovechar. Aun así, el resultado es de 16 bits frente a los 18 de un código fijo, porque seis símbolos no ocupan por completo tres bits.
  • un solo carácter - Diez caracteres idénticos contienen exactamente 0 bits de información, pero Huffman sigue empleando 10: uno por símbolo, porque no puede asignar menos de uno.