Compresión de datos optima mediante la codificación de Huffman

16
COMPRESIÓN DE DATOS OPTIMA MEDIANTE LA CODIFICACIÓN DE HUFFMAN EDUARDO CUETO MENDOZA 1. Introducción Los métodos modernos de transmisión de información están limitados por el con- sumo de energía o por la capacidad de procesamiento de estos. Por esta razón es importante encontrar una manera de disminuir el consumo de los recursos anterio- res; evitando las pérdidas de datos durante la recepción de esta información. Es el propósito de este ensayo demostrar que el algoritmo de codificación de Huff- man es una forma de codificar los datos, que optimiza la compresión de estos, disminuyendo el consumo de energía a la hora de transmitirlos. La parte que se refiere al ahorro de procesamiento no es parte de los objetivos del presente ensayo; ya que en efecto existe un procesamiento de los datos y sería necesario analizar la complejidad del algoritmo de Huffman. Un ejemplo de lo anterior es imaginemos que deseamos enviar todo el texto de un libro que consta de mil hojas. Si suponemos que el medio por el cual transmitimos 1 , envia el texto de una hoja por minuto serian necesarios mil minutos para trans- mitir el libro. Pero si en cambio primero codificamos todo el libro y supongamos que reducimos su longitud a la mitad de hojas, el tiempo de transmisión se verá reducido y por lo tanto los costos de transmitirlo se reducirán, con el extra de que su almacenamiento ocupara un menor espacio. 1.1. Definiciones Importantes. En esta sección hago las primeras definiciones que son útiles para analizar los primeros conceptos y teoremas importantes de la teoría de la información. E igualmente veremos ejemplos que espero mejoren la comprensión de estos conceptos. Definición 1. El alfabeto λ es un conjunto finito, no vacío, cuyos elementos son llamados símbolos o caracteres, un alfabeto con solo dos símbolos se llama binario. Ejemplo 1. Los siguientes conjuntos A, B, C, son alfabetos; A = {1, 2, 3, 4}, B = {+, -, *}, C = {ε, 5}. Definición 2. Una palabra (o cadena de caracteres); es una secuencia finita de símbolos de λ. La palabra vacía (sin símbolos) se denota con ε 2 . Definición 3. La longitud de palabra; es la cantidad de símbolos de los cuales está compuesta una palabra, la longitud de la palabra w esta denotada por |w|. Aprovechamos esto para definir |ε| =0 y hacer notar que toda longitud de palabra 0 ≤|w|. 1 El cual tiene un costo por tiempo de transmisión. Ya que el imaginario aparato consume mucha electricidad mientras transmite. 2 No debe confundirse ε con el símbolo “ ” de espacio el cual tiene una representación en varios códigos de uso común; el símbolo ε se debe entender más bien como ruido o interrupciones en la señal de transmición 1

description

Ensayo final para la clase de Optimizacion Matematica

Transcript of Compresión de datos optima mediante la codificación de Huffman

Page 1: Compresión de datos optima mediante la codificación de Huffman

COMPRESIÓN DE DATOS OPTIMA MEDIANTE LACODIFICACIÓN DE HUFFMAN

EDUARDO CUETO MENDOZA

1. Introducción

Los métodos modernos de transmisión de información están limitados por el con-sumo de energía o por la capacidad de procesamiento de estos. Por esta razón esimportante encontrar una manera de disminuir el consumo de los recursos anterio-res; evitando las pérdidas de datos durante la recepción de esta información.Es el propósito de este ensayo demostrar que el algoritmo de codificación de Huff-man es una forma de codificar los datos, que optimiza la compresión de estos,disminuyendo el consumo de energía a la hora de transmitirlos. La parte que serefiere al ahorro de procesamiento no es parte de los objetivos del presente ensayo;ya que en efecto existe un procesamiento de los datos y sería necesario analizar lacomplejidad del algoritmo de Huffman.Un ejemplo de lo anterior es imaginemos que deseamos enviar todo el texto de unlibro que consta de mil hojas. Si suponemos que el medio por el cual transmitimos1,envia el texto de una hoja por minuto serian necesarios mil minutos para trans-mitir el libro. Pero si en cambio primero codificamos todo el libro y supongamosque reducimos su longitud a la mitad de hojas, el tiempo de transmisión se veráreducido y por lo tanto los costos de transmitirlo se reducirán, con el extra de quesu almacenamiento ocupara un menor espacio.

1.1. Definiciones Importantes. En esta sección hago las primeras definicionesque son útiles para analizar los primeros conceptos y teoremas importantes de lateoría de la información. E igualmente veremos ejemplos que espero mejoren lacomprensión de estos conceptos.

Definición 1. El alfabeto λ es un conjunto finito, no vacío, cuyos elementos sonllamados símbolos o caracteres, un alfabeto con solo dos símbolos se llama binario.

Ejemplo 1. Los siguientes conjuntos A,B,C, son alfabetos; A = 1, 2, 3, 4, B =+,−, ∗, C = ε, 5.

Definición 2. Una palabra (o cadena de caracteres); es una secuencia finita desímbolos de λ. La palabra vacía (sin símbolos) se denota con ε2.

Definición 3. La longitud de palabra; es la cantidad de símbolos de los cualesestá compuesta una palabra, la longitud de la palabra w esta denotada por |w|.Aprovechamos esto para definir |ε| = 0 y hacer notar que toda longitud de palabra0 ≤ |w|.

1El cual tiene un costo por tiempo de transmisión. Ya que el imaginario aparato consumemucha electricidad mientras transmite.

2No debe confundirse ε con el símbolo “ ” de espacio el cual tiene una representación en varioscódigos de uso común; el símbolo ε se debe entender más bien como ruido o interrupciones en laseñal de transmición

1

Page 2: Compresión de datos optima mediante la codificación de Huffman

2 EDUARDO CUETO MENDOZA

Ejemplo 2. Las distintas longitudes de algunas palabras |010| = 3, |1| = 1, |0| =1, |abc| = 3.

Definición 4. La concatenación de palabras: sean α = a1 · · · an y β = b1 · · · bm,palabras en λ. Entonces la palabra αβ = a1 · · · anb1 · · · bm se llama la concatenaciónde α y β.

Definición 5. Se llama lenguaje del alfabeto λ al conjunto finito que contiene alas palabras de longitud finita formadas por las concatenaciones de los símbolos deλ y se denota por λ+.

Ejemplo 3. sea λ = 1, 0 un aalfabeto, entonces podemos formar los lenguajesλ+ = 1, 0, 01, 11, 001, 111 o λ+ = 0, 11, 111, 111 o λ+ = 1, 0 o · · ·

lo que realmente es importante de la definición de λ+ es que se puede elegirarbitrariamente un lenguaje para satisfacer las necesidades del problema de codifi-cación.

Definición 6. Si w = uv para cualquier palabras w, u, v. Entonces u es llamadoprefijo de w y v es sufijo de w.

Continuamos haciendo definiciones solo que la siguiente es una definición muyimportante ya que es la formalización del concepto de codificación, el cual es fun-damental en el tema que tratamos.

Definición 7. Una codificación C es una función C del alfabeto “fuente” Ω allenguaje de “codificación” λ+. Las palabras C(ω) para ω ∈ Ω son llamadas palabrascodificadas. El conjunto C(ω)|ω ∈ Ω de todos los símbolos codificados se llamacódigo.

Regularmente no hacemos distinción entre codificación y código; lo llamamoscódigo C indistintamente.

Definición 8. Se llama extensión de un código C; a una regla C∗ : Ω+ → λ+

que asigna a cada palabra ω1 · · ·ωn del lenguaje Ω+, la palabra C∗(ω1 · · ·ωn) =C(ω1) · · ·C(ωn). Obtenida por la concatenación de los elementos C(ωi), i = 1, 2, · · · , n.

Como se cumple por definición que C∗(ω) = C(ω) para toda ω ∈ Ω+, podemosescribir C en lugar de C∗, para facilitar la notación cuando es posible.

Ejemplo 4. Sean Ω = a, b, Ω+ = ba, ab, λ = 1, 0 y λ+ = 11, 00C : Ω→ λ+

a 7→ 11b 7→ 00

es facil ver que una extensión de C se ve de la siguente formaC∗ : Ω+ → λ+

ba 7→ 0011ab 7→ 1100

Definición 9. Un código C se llama no singular si cada elemento de su dominioΩ+ se aplica a un elemento distinto del codominio λ+, esto es:

ω′ 6= ω =⇒ C(ω′) 6= C(ω)

Claramente esto es suficiente para que no exista ambigüedad entre los valoresque toman los valores ω del dominio y los valores C(ω), en otras palabras no existiráun valor del dominio que tenga asignados dos valores en el codominio. (El códigoes inyectivo).

Page 3: Compresión de datos optima mediante la codificación de Huffman

OPTIMIZACIÓN EN LA COMPRESIÓN DE DATOS 3

1.2. Códigos Instantáneos. Si bien es común que en la vida real las palabrascodificadas que recibimos son de longitudes distintas y el mensaje es continuo, estoes no existe un separación entre los símbolos del lenguaje de codificación, lo quecrea el problema de reconocer el final de cada palabra en estos mensajes; una técni-ca que podemos utilizar es ar un símbolo especial como la coma para separar cadapalabra pero esto es un uso ineficiente del símbolo.Ahora veremos dos conceptos muy importantes el de los códigos de codificaciónúnica y los instantáneos. Estos últimos son de suma importancia ya que estos pre-sentan una forma de prevenir el uso de símbolos extra en nuestros lenguajes decodificación ya que facilitan el reconocimiento del principio y final de la palabracodificada, lo que nos permite ser más eficientes.

Definición 10. Un código C de codificación única es aquel cuya extensión C∗ esno singular.

Ejemplo 5. El siguiente es un código de codificación única.C∗ : Ω+ → λ+

1 7→ 102 7→ 003 7→ 114 7→ 110

Definición 11. El código intantáneo es aquel en el que ninguna palabra es prefijode otra. Esta clase de códigos permite una fácil decodificación sin hacer referenciaa otros símbolos ya que el final de cada palabra codificada es fácilmente reconocida.

Ejemplo 6. Veamos como se ve un código intantáneo.C : 1, 2, 3, 4 → 1, 0+

1 7→ 02 7→ 103 7→ 1104 7→ 111

Si tomamos una cadena binaria 01011111010 esta se puede analizar fácilmentecomo 0, 10, 111, 110, 10 lo que es el número 12432, es fácil ver que no importaque combinación codificada de esos cuatro dígitos recibamos, siempre será posibleseparar las palabras del código sin el uso de un símbolo extra.

Ahora supongamos que deseamos construir un código instantáneo binario para unalfabeto fuente α1, . . . , αn. Primero definamos las longitudes arbitrarias d1, . . . , dn;asumamos que estas longitudes tienen un orden d1 ≤ d2 ≤ · · · ≤ dn, después ele-gimos arbitrariamente una palabra C(α1) de longitud d1. En seguida escogemosuna palabra C(α2) con longitud d2, recordemos que si deseamos que el código seainstantáneo debemos evitar todas la palabras cuyo prefijo sea C(α1). Para lograrlodebemos tomar en cuanta lo siguiente, la cantidad de palabras binarias de longitudd2 es 2d2 , de igual manera observamos que la cantidad de palabras que tienen comoprefijo C(α1) es de 2d2−d1 .Como por hipótesis y definición es cierto d2 ≥ d1 y d2 ≥ 0 se sigue,

d2 ≥ d1 =⇒ −d1 ≥ −d2 =⇒ 2−d1 ≥ 2−d2 =⇒ 2−d12d2 ≥ 2−d22d2 =⇒2d2−d1 ≥ 1 > 0.

y de igual forma,d2 ≥ 0 =⇒ 2d2 ≥ 20 =⇒ 2d2 ≥ 1.

Page 4: Compresión de datos optima mediante la codificación de Huffman

4 EDUARDO CUETO MENDOZA

si restamos 2d2−d1 > 0 a 2d2 ≥ 1 obtenemos 2d2 − 2d2−d1 > 1− 0 y esto implica que2d2 > 2d2−d1 + 1; con la igualdad cumpliéndose cuando d2 = d1 = 1 por lo tanto2d2 ≥ 2d2−d1 + 1.El próximo paso es escoger una palabra de longitud d3 que no tenga como prefijoa C(α1) o c(α2). Entonces de todas las posibles 2ds palabras debemos evitar las2d3−d1 que tienen como prefijo a C(α1) y las 2d3−d2 que tienen el prefijo C(α2),esto se cumple si y solo si 2d3 ≥ 2d3−d1 + 2d3−d2 + 1, la cual se demuestra siguiendoun proceso análogo al anterior.Dividiendo la ultima desigualdad por 2d3 obtenemos

1 ≥ 2−d1 + 2−d2 + 2−d3 .Análogamente podemos obtener la desigualdad

1 ≥ 2−d1 + 2−d2 + · · ·+ 2−dn .

1.3. Desigualdad de Kraft.

Teorema 1. Dado un alfabeto fuente de n símbolos y un lenguaje de codificación dek palabras, entonces un código instantáneo con longitudes de palabra d1, d2, . . . ,.nexiste, cuando se cumple la desigualdad

1 ≥ k−d1 + k−d2 + · · ·+ k−dn .

Demostración. Podemos asumir que el alfabeto fuente α1, α2, . . . , αn se pre-senta con el mismo orden de las longitudes de las palabras del código, en otraspalabras, d1 ≤ d2 ≤ · · · ≤ dn. Definimos el código instantaneo C por medio de lasiguente inducción:

(1) Elegimos una palabra arbitraria C(α1) de longitud igual a d1.

(2) Suponemos que C(α1), C(α2), . . . , C(αs−1) han sido elegidos. Entonces escoge-mos una palabra C(αs) de longitud ds que no tiene prefijos de entre C(α1), C(α2), . . . , C(αs−1).Ya sabemos que el número de palabras con el prefijo C(αi) es kds−di y por lo tantopodemos elegir de entre

kds −s−1∑i=1

kds−di

palabras. De la desigualdad de Kraft obtenemos

1−s−1∑i=1

k−di ≥ k−ds

multiplicando ambos lados de la desigualdad por kds obtenemos

kds −s−1∑i=1

kds−di ≥ 1

y así termina la demostración.

1.4. Entropía y esperanza. En esta sección analizaremos un concepto que fuedefinido formalmente por primera vez por el matemático estadounidense ClaudeShannon en 1948, concepto muy importante en varias áreas desde la física, teoríade juegos, complejidad computacional, etc. La entropía puede verse como la medidade la incertidumbre de una variable aleatoria, la esperanza es comúnmente conocidacomo promedio.

Definición 12. Una fuente de información es un lenguaje junto a una distibuciónde probabilidad; en otras palabras, un lenguaje Ω+ = ω1, ω2, . . . , ωn con números

p(ω1), p(ω2), . . . , p(ωn) los cuales satisfacen quen∑i=1

p(ωi) = 1 y 0 ≤ p(ωi) ≤ 1.

Page 5: Compresión de datos optima mediante la codificación de Huffman

OPTIMIZACIÓN EN LA COMPRESIÓN DE DATOS 5

Siendo más precisos debemos hablar de una fuente de información discreta y dememoria cero. Discreta porque tenemos símbolos y palabras discretos; de memoriacero ya que los símbolos y palabras aparecen independientemente. En otras pala-bras las probabilidades p(ωi) describen en su totalidad las estadísticas del mensajefuente y la probabilidad de un mensaje ω1ω2 · · ·ωn puede ser calculado por lasprobabilidades de los símbolos individuales:

p(ω1ω2 · · ·ωn) = p(ω1)p(ω2) · · · p(ωn)

Definición 13. La entropía H(S) de una fuente de información S esta definida

H(S) = −∑

ω∈Ω+

p(ω) log2 p(ω) =∑

ω∈Ω+

p(ω) log21

p(ω) .

También se suele escribir H(p), el logaritmo es de base 2 y la entropía se expresaen bits. Aprovechamos para definir 0 log2

10 = 0 log2 0 = 0 lo cual se justifica por

continuidad ya que x log2 x → 0 cuando x → 0. Esto es sumar términos de proba-bilidad cero no modifica la entropía. Si la base del logaritmo es b entonces Hb(S),todos los logaritmos del presente escrito serán de base 2 y si son de otra base seespecificara, esto para reducir notación. Notese que la entropía es un funcional dela distribución de S, no depende de los valores actuales tomados por la fuente deinfomación S, depende solo de sus probabilidades.

Definición 14. Si S ∼ p(ω)3 el valor esperado4 E de la función g(S), la cual nosespecifica la cantidad de veces que ha ocurrido una palabra ω, se escribe como sigue

Ep g(S) =∑

ω∈Ω+

g(ω) p(ω)

o más sencillamente como E g(S) cuando se entiende por el contexto la distri-bución de probabilidad. Después de estas dos definiciones veremos dos propiedadesmuy importantes de la entropía

Lema 1. H(S) ≥ 0.

Demostración. Como p(ω) es una probabilidad tenemos que 0 ≤ p(ω) ≤ 1 =⇒log 1

p(ω) ≥ 0 y ya que H(S) está definida como una suma de productos de positivosse cumple H(S) ≥ 0.

Lema 2. Hb(S) = (logb a)Ha(S).

Demostración. por propiedades de los logaritmos tenemos que loga x = logb xlogb a

,por lo tanto logb x = logb a loga x quedando demostrado.

1.5. Entropía máxima y mínima.

Teorema 2. (1) La entropía mínima es H(S) = 0 y se alcanza por las fuentes deinformación S las cuales tienen asociada algúna palabra con probabilidad de ocurririgual a 1.(2) La entropía máxima en una fuente S asociada a n palabras es H(S) = log2 nbits, y se alcanza por aquellas fuentes en las cuales cada palabra tiene la mismaprobabilidad de ocurrir, pi(ω) = 1

n ,∀ω ∈ Ω+.

3El símbolo ∼ significa tiene una distribución de probabilidad4También conocido como esperanza

Page 6: Compresión de datos optima mediante la codificación de Huffman

6 EDUARDO CUETO MENDOZA

Demostración. (1) Sabemos que H(S) =∑

ω∈Ω+

pi(ω) log21

pi(ω) , H(S) ≥ 0 y si

H(S) = 0 entonces para cada i se cumple que log21

pi(ω) = 0 (la cual ocurre única-mente si pi(ω) = 1) o pi(ω = 0). De esto podemos concluir que H(S) = 0 ocurrecuando todas las probabilidades son cero o uno; lo anterior es necesario que ocurrasolo una vez.

(2) Si todas las palabras tienen la misma probabilidad de ocurrir se cumple quepi(ω) = 1

n , entonces

H(S) =n∑i=1

1n log2 n = log2 n (bits).

Para demostrar que este es el máximo valor alcanzado por la entropía usaremosun argumento sencillo del cálculo loge x se encuentra siempre debajo de su líneatangente cuando x = 1 (que es y = x− 1).

Figura 1. Gráfica del logaritmo y recta y = x− 1

Por lo tanto loge x ≤ x− 1 con igualdad cuando x = 1.

Ahora calculamos la diferencia entre la entropía de cualquier fuente S y el valor

Page 7: Compresión de datos optima mediante la codificación de Huffman

OPTIMIZACIÓN EN LA COMPRESIÓN DE DATOS 7

log2 n =n∑i=1

pi(ω) log2 n:

H(S)− log2 n =

n∑i=1

pi(ω) log2

1

pi(ω)−

n∑i=1

pi(ω) log2 n

=1

loge 2

n∑i=1

pi(ω)(

loge1

pi(ω)− loge n

)=

1

loge 2

n∑i=1

pi(ω)(

loge1

pi(ω) n

)≤ 1

loge 2

n∑i=1

pi(ω)( 1

pi(ω) n− 1)

=1

loge 2

( n∑i=1

1

n−

n∑i=1

pi(ω))

=1

loge 2(1− 1) = 0.

Por lo tanto H(S) ≤ log2 n y la igualdad solo tiene lugar cuando pi(ω) = 1n .

1.6. Códigos óptimos.

Definición 15. La esperanza de la longitud (longitud Promedio, longitud esperada)L(S) de un código C con una fuente S está dada por,

L(S) =∑

ω∈Ω+

p(ω)|ω|

Observación Al igual que la entropía donde sumar términos de probabilidad ce-ro no afecta su valor, el sumar símbolos vacíos ε con cualquier 0 ≤ p(ε) ≤ 1 nomodifica la esperanza ya que |ε| = 0.

Ahora consideremos el problema de encontrar el código instantáneo con longi-tud esperada mínima, esto es equivalente a encontrar el conjunto de longitudesd1, d2, . . . , dn que satisfacen la desigualdad de Kraft y cuya una longitud esperadaL =

∑pidi sea menor a la longitud esperada de cualquier otro código instantáneo;

este es nuestro típico problema de optimización, minimizarL =

∑pidi

sobre todos los enteros d1, d2, . . . , dn que satisfacen∑k−di ≤ 1

Un sencillo análisis utilizando cálculo sugiere la forma de las d∗i mínimas. Si igno-ramos el hecho que di es entera y asumimos igualdad en la restricción, aplicandolos multiplicadores de LaGrange tenemos que

J =∑pidi + λ

(∑k−di

).

Calculando la parcial con respecto a di obtenemosδJδdi

= pi − λk−di loge k.igualando la derivada a cero tenemos

k−di = piλlogek

.

Sustituyendo en la restricción para obtener λ, encontramos que λ = 1loge k

, por lotanto pi = k−di dando longitudes mínimas

d∗i = − logk pi.

Page 8: Compresión de datos optima mediante la codificación de Huffman

8 EDUARDO CUETO MENDOZA

Esta elección de longitud no entera, nos da la longitud esperada L∗ =∑pid∗i =

−∑pi logk pi = Hk(S).

Pero como todos los di deben ser enteros las soluciones no siempre se ajustaran alos valores óptimos; por lo tanto se deberá utilizar valores de di cercanos al conjuntoóptimo.

1.7. Teorema de McMillan.

Teorema 3. Todo código de codificación única satisface la desigualdad de Kraft.

En la sección 1.3 vimos que la desigualdad de Kraft es suficiente pero tambiénnecesaria para la construcción de códigos instantáneos; el teorema de McMillandemuestra que los códigos instantáneos son tan eficientes como los de codificaciónúnica. Con mayor precisión asegura que para todo código de codificación únicaexiste uno instantáneo con las mismas longitudes de palabras.

Demostración. Sea C un código de codificación única. Con di = |C(ωi)|, i =1, . . . , n. Observemos que para cada número j = 1, 2, 3, . . ., podemos formar kj pa-labras en el alfabeto de codificación5, por ser de codificación única el número demensajes fuente ωi1 , ωi2 , ωi3 , . . . , ωir que tienen longitud j no puede exceder kj . Lalongitud del código es di1 +di2 + · · ·+dir . (1) Por lo tanto observamos que la sumade di1 + di2 + · · ·+ dir = j debe ser menos o igual a kj .

Para finalizar la demostración debemos probar que el número c =n∑i=1

k−di es me-

nor o igual a 1. Para esto verificaremos que los números cr

r estan acotados paracada r = 1, 2, 3, . . .. Claramente c > 1 cumple que lım

r→∞cr

r = ∞ y por lo tanto sedemostrara el teorema.Calculemos las potencias de c

c2 =

(n∑i=1

k−di

)(n∑j=1

k−dj

)=

n∑i,j=1

k−(di+dj),

y en general

cr =n∑

i1,...,ir=1

k−(di1+di2+···+dir ) (2).

Podemos reordenar la suma anterior juntando todos los sumandos k−j que satisfa-cen (1). La mayor j posible es j = d+d+ · · ·+d = rd, donde d = maxd1, . . . , dn.Se puede observar que el número de todos los sumandos k−j es menor o igual a kj .Por lo tanto

cr ≤rd∑j=1

(kj)(k−j) =rd∑j=1

1 = rd.

Por lo anterior cr

r ≤ d, lo que demuestra que c ≤ 1

1.8. Códigos de Huffman. Gracias al teorema anterior sabemos que existencódigos que cumplen la desigualdad de Kraft y tienen la longitud esperada míni-ma6. David A. Huffman descubrió en 1951, durante sus estudios de doctorado, unalgoritmo que permite comprimir datos de manera óptima; en esta sección vamosa estudiar el funcionamiento de dicho algoritmo.

Definición 16. Dados una fuente de información S y un lenguaje Ω+. Un códigode Huffman es un código instantáneo cuya longitud esperada es mínima.

5con k símbolos6Lmın(S).

Page 9: Compresión de datos optima mediante la codificación de Huffman

OPTIMIZACIÓN EN LA COMPRESIÓN DE DATOS 9

Una fuente con dos símbolos tiene un código de Huffman con las palabras 1 y0 (y Lmın(S) = 1); una fuente con tres símbolos, ω1, ω2, ω3 en el cual ω1 tiene lamayor probabilidad de aparecer, puede ser reducida al caso de dos símbolos. Con ω1

y ω2,3, donde p(ω2,3) = p(ω2)+p(ω3). Para esto encontramos un código de Huffmanpara la fuente reducida:

α1 α2,3

0 1

luego separamos la palabra 1 en dos palabras 10 y 11, obteniendo así un código deHuffman para la fuente original.

α1 α2 α3

0 10 11

En general, sea S una fuente de información con símbolos α1, α2, . . . , αn ordenadospor su probabilidad esto es

P (α1) ≥ P (α2) ≥ · · · ≥ αnLa fuente reducida S† tiene símbolos α1, α2, . . . , αn−2 y uno nuevo αn−1,n; los cualestienen probabilidades P (α1), P (α2), . . . , αn−2 con P (αn−1,n) = P (αn−1) + P (αn).Ahora supongamos que podemos encontrar un código C† para la fuente reducidaS†. Entonces el siguiente código (1.8.1)

α1 α2 · · · αn−2 αn−1 αnC†(α1) C†(α2) · · · C†(αn−2) C†(αn−1,n)0 C†(αn−1,n)1

Obtenido al “separar” la última palabra C†(αn−1,n) en dos palabras y este es uncoódigo de Huffman para S.Si no fueramos capaces de encontrar un código de Huffman para S†, continuamosde la misma manera, encontrando reducciones hasta que lleguemos a obtener dossímbolos fuente.

Teorema 4. Suponiendo que C† es un código de Huffman para la fuente de in-formación reducida S†, entonces el código (1.8.1) es un código de Huffman para lafuente de infomación original S.

Demostración. Sean α1, α2, . . . , αn símbolos fuente ordenados por sus proba-bilidades. Asumimos que P (αn) > 0 ya que la solucion es trivial cuando P (αn) = 07.

(I) S tiene un código de Huffman C0 con longitudes de palabra monotonas cre-cientes d1 ≤ d2 ≤ · · · ≤ dn donde di = |C0(αi)|. Comenzamos con un código deHuffman arbitrario C para S. Si existe un símbolo αi tal que di > di+1, llamemosC ′ a este código obtenido de C al cambiar la palbara códificada asignada aαi porla de αi+1. Esto hace a K ′ un código instantaneo y la diferencia de las longitudespromedio L = Lmin y L′ de C y C ′ respectivamente es

Lmin − L′ = [diP (αi) + di+1P (αi+1)]− [di+1P (αi+1) + diP (αi)]

= (di − di+1)[P (αi)− P (αi+1)].

7cosa que no es posible ya que en el caso L∗(S) = 0 esto seria igual a la entropía mínimaHK(S) = 0 y obviamente valor optimo, pero esto solo seria posible si todos los simbolos fueran ε.

Page 10: Compresión de datos optima mediante la codificación de Huffman

10 EDUARDO CUETO MENDOZA

El último número es el producto de uno positivo y un no negativo por lo tanto,Lmin ≥ L′ y por ser mínimo concluimos que Lmin = L′, en otras palabras C ′ esotro código de Huffman. Continuamos el proceso de cambiar palabras asignadas apares de palabras hasta que obtengamos un código de Huffman como el anterior K0.

(II) S tiene un código de Huffman C1 tal que las últimas palabras C1(αn−1) yC1(αn) solo difieren en el último símbolo. De hecho sea C0 un código como en (I) ysea C0 el código obtenido de C0 al borrar el último símbolo de la palabra C0(αn).La longitud promedio de C0 es claramente menor que la de C0 ya que P (αn) > 0

y por lo tanto C0 no puede ser instantaneo.La palabra C(αi) = C(αi) con i ≤ n − 1 no es un prefijo de cualquier palabracodificada por lo tanto C(αn) de be ser prefijo de algún C(αi), i ≤ n − 1. Esto noes posible si di < dn, por lo tanto di = dn, porque C0 es nonotono creciente.El hecho de que C(αn) es un prefijo de C(αi) implica que C(αi) difiere de C(αn) enel último símbolo únicamente. Si i = n+ 1 hacemos C0 = C1, si i < n+ 1 tenemosque d1 = dn y esto implica di = di+1 = di+2 = · · · = dn. Esto nos permite cambiarlas palabras de C0 por αi y αn−1, esto nos da un código C1 con las misma longitudpromedio que C0, y por lo tanto un código de Huffman.

Observación Podemos ver que L(C) del código (1.8.1) esta relacionada con L(C†)por

L(C) = L(C†) + P (αn−1) + P (αn). (1.8.2)

De hecho si las longitudes de las palabras del código de C† son d1, d2, . . . , dn−2, d†,

entonces las longitudes de las palabras de C son d1, d2, . . . , d†+ 1, d†+ 1, entonces:

L(C) =

n−2∑i=1

diP (αi) + (d† + 1)P (αn−1) + (d† + 1)P (αn)

=

n−2∑i=1

diP (αi) + d†[P (αn−1) + P (αn)] + P (αn−1) + P (αn)

= L(C†) + P (αn−1) + P (αn).

(III) Supongamos que se da un código C† de una fuente S† y definimos un có-digo C para S usando (1.8.1). Las longitudes promedio de L(C†) y L(C) estanrelacionadas como vimos en (1.8.2).Ahora usemos el código de Huffman de (II). Como las últimas palabras difierenel en último símbolo, se puede obtener un C1 del código C† de S† separando laúltima palabra. Claramente C†1 es instantaneo. Haciendo los mismos calculos queen (1.8.2), vemos que

L(C1)− L(C†1) = P (αn−1) + P (αn).

Esto es las dos diferencias son iguales, y podemos concluir que

L(C) = L(C1)− L(C†1) + L(C†).

Ahora L(C†) = Lmin(S†) por lo tanto −L(C†1) + L(C†) ≤ 0, esto demuestra queL(C) ≤ L(C1) = Lmin(S), esto es C es una codificación de Huffman.

Page 11: Compresión de datos optima mediante la codificación de Huffman

OPTIMIZACIÓN EN LA COMPRESIÓN DE DATOS 11

1.9. Conclusión. Es de suma importancia mencionar a donde nos lleva todaslas demostraciones y el análisis anterior, primero hicimos todas las definiciones per-tinentes, las que nos permitieron demostrar el teorema de Kraft, el cual nos asegurala existencia de códigos que se decodifican instantáneamente y están acotados, lue-go de eso pasamos a definir entropía y esperanza para posteriormente ver que laentropía tiene un máximo y mínimo; siguiendo con los códigos óptimos en dondese demostró que en efecto la longitud promedio es mínima cuando esta es igual ala entropía, pero nunca será posible alcanzar este mínimo por el hecho de manejarconjuntos discretos. Teniendo en mente estas definiciones y teoremas anteriores essuficiente para intuir que para todo alfabeto que forme un mensaje, primero: sepuede construir un código el cual es posible descifrar teniendo sus palabras codifi-cadas sin usar símbolos extra para separarlos, en la siguiente parte del ensayo vimosel teorema de McMillan el cual nos asegura que todo código de codificación únicasatisface la desigualdad de Kraft siendo este un código instantáneo y finalizamoscon el algoritmo de Huffman y su demostración; el cual es un algoritmo que nospermite construir códigos instantáneos, los cuales son capaces de alcanzar niveles decompresión óptimos, esto es cercanos a la entropía. Por lo tanto podemos concluirque siempre que se quiera comprimir datos, usar el sencillo algoritmo de Huffmanes suficiente para lograr compresión óptima.

1.10. Ejemplo. Es claro que el puro trabajo teorico no es suficiente para debe-mos observar que en la vida real se puede aplicar la teoría para obtener resultados,por lo tanto anexamos esta sección en la cual comprimimos una obra de WilliamShakespeare All”s Well That Ends Well para comprobar que el algoritmo de Huff-man se puede desarrollar con efectividad el lenguaje de programación que se eligiofue MATLAB, por ser un lenguaje de alto nivel que utiliza C++ para compilar anivel de maquina lo cual lo vuelve muy flexible y rápido. el programa que se útilizoes:

%%% CODIFICACION DE HUFFMAN%% DE UN ARCHIVO DE TEXTO X%% POR EDUARDO CUETO MENDOZA%%%

%Limpieza para prevenir erroresclear all%capturamos el archivo de texto en una variable stringtxt = fileread(’ruta del texto a comprimir’);%aqui es buena idea que se cambie la ruta a la del texto a comp???????

%obtenemos la cantidad de caracteres del textolontxt = length(txt);

%funcion que obtiene los simbolos del textoalfabeto = unique(txt);

%cantidad de simbolos del texto lonalfabeto = length(alfabeto);

%estas lineas son para asignar el espacio necesario a nuestras%variables optimizamos el uso de recursos del codigo segun MATLAB

Page 12: Compresión de datos optima mediante la codificación de Huffman

12 EDUARDO CUETO MENDOZA

cantidad = zeros(1,lonalfabeto);prob = zeros(1,lonalfabeto);

%ciclo que busca la cantidad de caracteres en el textoa = 1;while (a <= lonalfabeto)cantidad(a) = length(strfind(txt, alfabeto(a)));a = a + 1;end

%aqui calculamos la probabilidad de aparicion de cada signoa = 1;while (a <= lonalfabeto)prob(a) = (cantidad(a)/lontxt);a = a + 1;end

%Liberando memoriaclear a cantidad lonalfabeto txt

%CODIFICACION DE HUFFMAN

%para cada una de las probs de las letrasfor ind= 1:length(prob)codigoind = [];%codigo vacioconjContind = ind;%conjunto de []conjProb(ind) = prob(ind);%probas asocicadas al conjend

% Unimos los conjuntoswhile length(conjCont) >1

%Vemos que conjuntos tienen la probabilidad menortemp, indices

= sort(conjProb);%obtenemos el conjunto con menor probconjMen = conjContindices(1);%vemos cual es su probceroProb = conjProb(indices(1));%a cada palabra por codificar amos un cerofor indCod = 1:length(conjMen)codigoconjMen(indCod) = [codigoconjMen(indCod), 0];end

%obtenemos el conjunto con prob menor + 1conjMen1 = conjContindices(2);% vemos su probunoProb = conjProb(indices(2));%a cada palabra por codificar amos un unofor indCod = 1:length(conjMen1)codigoconjMen1(indCod) = [codigoconjMen1(indCod), 1];end

Page 13: Compresión de datos optima mediante la codificación de Huffman

OPTIMIZACIÓN EN LA COMPRESIÓN DE DATOS 13

%quitamos los dos conjuntos con prob menores y los unimos en unoconjCont(indices(1:2)) = [];conjContlength(conjCont)+1 = [conjMen, conjMen1];

%quitamos las dos prob menores y las asignamos al nuevo conjuntoconjProb(indices(1:2)) = [];conjProb(length(conjProb)+1) = ceroProb + unoProb;

end

fprintf(’Los solos, sus probabilidades y sus respectivas palabras de Huffman:’);for ind = 1:length(codigo)% se muestran las palabras al revesdisp([alfabeto(ind), ’ ’, num2str(prob(ind)),’ ’,num2str(codigoind(length(codigoind):-1:1))]);end

%Calculamos la longitud si se codificara en ASCIIfprintf(’el texto usando el código ASCII tiene una longitud de:%i Bits o%g bytes’,lontxt * 8, (lontxt * 8) * (0.125))

%codigo que calcula la esperanza de la longitudE = 0;for ind = 1:length(codigo)E = E + prob(ind)*length(codigoind);end

fprintf(’La longitud promedio del código es:%g Bits o%g bytes’, E, E * (0.125));

%Codigo EntropiaH = sum(prob .* log2(1 ./ prob));

fprintf(’La entropía del código es:%g Bits o%g bytes’, H, H * (0.125));

Espero que los comentarios del programa sirvan para hacerlo un poco más legi-ble, el resultado después de compilar fue el siguiente:

Los símbolos, sus probabilidades y sus respectivas palabras de Huffman:

3.4103e-05 1 0 1 0 0 0 1 0 1 0 1 1 0 1 00.039752 1 1 1 0 00.039752 1 1 1 0 10.21692 0 1! 0.00086393 1 0 0 1 0 1 1 0 1 0& 5.6838e-06 1 0 1 0 0 0 1 0 1 0 1 1 0 1 1 0 1 0’ 0.004888 1 1 0 0 0 0 1 1, 0.014056 1 0 0 0 1 1- 0.0012106 1 0 1 0 0 0 1 0 1 1. 0.006866 1 0 0 0 1 0 11 5.6838e-06 1 0 1 0 0 0 1 0 1 0 1 1 0 1 1 0 1 12 5.6838e-06 1 0 1 0 0 0 1 0 1 0 1 1 0 1 1 1 0 03 5.6838e-06 1 0 1 0 0 0 1 0 1 0 1 1 0 1 1 1 0 1

Page 14: Compresión de datos optima mediante la codificación de Huffman

14 EDUARDO CUETO MENDOZA

4 5.6838e-06 1 0 1 0 0 0 1 0 1 0 1 1 0 1 1 1 1 05 5.6838e-06 1 0 1 0 0 0 1 0 1 0 1 1 0 1 1 1 1 1: 0.0029783 0 0 0 1 1 0 1 0; 0.0033989 1 0 0 0 1 0 0 1? 0.0016881 0 0 0 1 1 0 1 1 1A 0.0056781 0 0 0 0 1 0 1B 0.0016369 0 0 0 1 1 0 1 1 0C 0.0021257 1 0 1 0 0 0 1 1 0D 0.00080709 0 0 0 0 1 0 0 1 1 1E 0.0061555 0 0 0 1 1 0 0F 0.0020803 1 0 1 0 0 0 1 0 0G 0.0012447 1 1 0 0 0 1 1 0 0 1H 0.0020575 1 0 0 1 0 1 1 1 1I 0.0072411 1 0 0 1 0 1 0J 5.1154e-05 1 0 1 0 0 0 1 0 1 0 1 1 0 0K 0.00067068 1 1 0 0 0 1 1 0 0 0 1L 0.0044504 1 1 0 0 0 0 0 0M 0.0017279 1 0 0 1 0 1 1 0 0N 0.0033762 1 0 0 0 1 0 0 0O 0.0025918 1 1 0 0 0 1 1 0 1P 0.0013755 0 0 0 0 1 0 0 1 0Q 5.6838e-06 1 0 1 0 0 0 1 0 1 0 1 1 0 1 1 0 0R 0.002768 0 0 0 0 1 0 0 0S 0.0045072 1 1 0 0 0 0 0 1T 0.004672 1 1 0 0 0 0 1 0U 0.0017676 1 0 0 1 0 1 1 1 0V 9.6624e-05 1 0 1 0 0 0 1 0 1 0 1 1 1 0W 0.0021769 1 0 1 0 0 0 1 1 1Y 0.00068205 0 0 0 0 1 0 0 1 1 0[ 0.00010231 1 0 1 0 0 0 1 0 1 0 1 1 1 1] 0.00010231 1 0 1 0 0 0 1 0 1 0 1 0 0a 0.043816 1 1 1 1 1b 0.0077072 1 0 0 1 1 0 1c 0.011578 0 0 0 0 1 1d 0.024525 0 0 0 1 0e 0.074844 1 0 1 1f 0.012618 0 0 0 1 1 1g 0.0097761 1 1 0 0 0 1 0h 0.039997 1 1 1 1 0i 0.037229 1 0 1 0 1j 0.00035808 1 0 1 0 0 0 1 0 1 0 0k 0.0055132 1 1 0 0 0 1 1 1l 0.026412 1 0 0 0 0m 0.01837 1 0 1 0 0 1n 0.039712 1 1 0 1 1o 0.054018 0 0 1 1p 0.008321 1 0 1 0 0 0 0q 0.00056269 1 1 0 0 0 1 1 0 0 0 0r 0.039235 1 1 0 0 1s 0.039667 1 1 0 1 0t 0.052615 0 0 1 0u 0.021308 0 0 0 0 0

Page 15: Compresión de datos optima mediante la codificación de Huffman

OPTIMIZACIÓN EN LA COMPRESIÓN DE DATOS 15

v 0.0074969 1 0 0 1 1 0 0w 0.014084 1 0 0 1 0 0x 0.00086393 1 0 0 1 0 1 1 0 1 1y 0.016659 1 0 0 1 1 1z 0.00011936 1 0 1 0 0 0 1 0 1 0 1 0 1

Codificando el texto usando el co ASCIIeste tiene una longitud de: 1407520 Bits o 175940 bytes

La longitud promedio del código es: 4.60297 Bits o 0.575371 bytes

La entropía del código es: 4.5734 Bits o 0.571675 bytes

Veamos la siguente imagen:

Figura 2. Propiedades del archivo en Windows 7

Page 16: Compresión de datos optima mediante la codificación de Huffman

16 EDUARDO CUETO MENDOZA

Al ver las propiedades del archivo en el S.O. Windows 7 vemos que efectivamentecodificado en ASCII los valores concuerdan y vemos que el algoritmo de Huffmansupera la compresión por default de Windows 7 y que en efecto la longitud promediocasi alcanza a la entropía. Viendo que en efecto los resultados reales concuerdancon la teoría expuesta en el ensayo.