Está en la página 1de 76

Tema 3: Codificación

Huffman
Rafael Molina
Depto. Ciencias de la Computación
e Inteligencia Artificial
Universidad de Granada

Rafael Molina Tema 3: Codificación Huffman 1


• Objetivos del tema Contenidos
• El algoritmo del código de Huffman
– Códigos de Huffman de mínima varianza
• Códigos de Huffman Adaptativos
– Procedimiento de codificación
– Procedimiento de decodificación
– Procedimiento de actualización
• Códigos de Golomb
• Código Tunstall
• Aplicaciones del código de Huffman
• Resumen
• Bibliografía
Rafael Molina Tema 3: Codificación Huffman 2
III.1 Objetivos del tema

En este tema vamos a describir un algoritmo de codificación


muy conocido: el código de Huffman. Primero supondremos
que es conocida la distribución de probabilidad de la fuente
y luego construiremos el código cuando dichas
probabilidades no son conocidas.

A continuación veremos algunos esquemas de codificación,


en algún sentido, similares al código de Huffman.

Finalmente veremos algunos ejemplos de aplicación a


compresión de imágenes, sonido y texto.

Rafael Molina Tema 3: Codificación Huffman 3


III.2 El algoritmo del código de
Huffman.

La codificación usando el método de Huffman (código


Huffman) es un código prefijo óptimo para un conjunto
dado de probabilidades.

Puede alcanzar la entropía, aunque no lo hace siempre.

Sí es óptimo entre los códigos prefijo.

Rafael Molina Tema 3: Codificación Huffman 4


El código de Huffman está basado en dos observaciones
sobre los códigos prefijo óptimos:

1. En un código óptimo, los símbolos más frecuentes –los


que tienen mayor probabilidad- tienen palabras del código
más cortas que las palabras menos frecuentes.
2. En un código óptimo, los dos símbolos que ocurren con
menos frecuencia tendrán la misma longitud.

Demostración de que estas condiciones las cumple un código


prefijo óptimo:

La primera condición es obvia. El número medio de bits por


símbolo sería mayor si esta condición no se cumple.

Rafael Molina Tema 3: Codificación Huffman 5


Para probar la segunda condición usaremos reducción al
absurdo.

Supongamos que existe un código prefijo óptimo, C, en el


que los dos símbolos menos probables no tienen la misma
longitud.

Sean P1 y P2 las correspondientes palabras del código y


supongamos que long(P1)=k y long(P2)=n con k<n.

Al ser un código prefijo, P1 no puede ser prefijo de P2. Por


tanto podemos suprimir los n-k últimos dígitos de P2 y tener
aún dos códigos distintos. Sea C’ el nuevo código, ¿sigue
siendo prefijo?

Rafael Molina Tema 3: Codificación Huffman 6


Como estos símbolos son los menos probables ninguna
otra palabra puede ser más larga que estas dos y por tanto
no hay peligro de que al hacer más corta esta palabra del
código (la de P2) se convierta en prefijo de ninguna otra.
Por tanto, C’ sigue siendo prefijo.

Hemos creado un nuevo código, C’, que hace que C no sea


óptimo, lo que contradice la hipótesis inicial sobre C.

Rafael Molina Tema 3: Codificación Huffman 7


Algoritmo del código de Huffman

1. Ordena los símbolos de más probable a menos probable,

2. Comienza a construir un árbol por las hojas combinando


los dos símbolos menos probables,

3. Itera el procedimiento

P( )=0.5
Genera el código de Huffman
correspondiente a las P( )=0.4
siguientes probabilidades P( )=0.09
P( E )=0.01
Rafael Molina Tema 3: Codificación Huffman 8
probabilidades
0
0.5
0
0.4 1.0
Probabilidades
acumuladas
1
0
0.09 0.5
1
1 0.1
E 0.01
Símbolo Código Símbolo Código ¿Cuál es la longitud
0 110 media del código?

¿Cuál es la entropía de
10 E 111 la fuente?
Nota: asignamos 1 a la rama menos probable
Rafael Molina Tema 3: Codificación Huffman 9
probabilidades
Otro ejemplo
0
A 0.3 0

1 0.6
B 0.3
0 1.0
C 0.3 1

1 0.4
D 0.1

A 00 B 01 C 10 D 11

Rafael Molina Tema 3: Codificación Huffman 10


probabilidades Otro ejemplo 0
B 0.4

0 1.0
1
A 0.2
0 1 0.6
C 0.2
B 1
0 A 01
D 0.1 0.4
C 000
1
D 0010
1 0.2
E 0.1 E 0011

Para decodificar una secuencia de palabras sólo tenemos que


recorrer el árbol del código prefijo correspondiente al código
Huffman como vimos en el capítulo anterior.
Rafael Molina Tema 3: Codificación Huffman 11
III.2.1 Códigos de Huffman de mínima
varianza
Consideremos el código de Huffman del ejemplo anterior. El
número medio de bits por símbolo es

L=0.4x1+0.2x2+0.2x3+0.1x4+0.1x4=2.2 bits/símbolo

Supongamos que queremos transmitir 10000 símbolos/sg.


Con una capacidad de transmisión de 22000 bits/sg el canal
iría en media bien. Sin embargo, si tenemos que transmitir
muchas veces seguidas los símbolos D o E podemos necesitar
un buffer mucho mayor.

Lo mejor sería que, manteniendo la misma longitud media,


pudiésemos diseñar un código de Huffman con menor
varianza en la longitud de la codificación de cada símbolo.
Rafael Molina Tema 3: Codificación Huffman 12
Para disminuir la varianza colocamos, en caso de empate
en las probabilidades de los nodos, los nodos ya utilizados
lo más alto posible procurando utilizarlos lo más tarde
posible. Retomemos el ejemplo de la sección anterior.
probabilidades
0
B 0.4
0

0 0.6
A 0.2
1 1.0
1 0.4
C 0.2 B 00
0
A 10
D 0.1 C 11
1
D 010
1 0.2 E 011
E 0.1
Rafael Molina Tema 3: Codificación Huffman 13
III.3 Código de Huffman adaptativo

El código de Huffman necesita conocer la probabilidad de


aparición de cada símbolo.

1. Para tener estas probabilidades podemos leer los datos


para obtenerlas y luego codificar los símbolos usando el
código de Huffman para dichas probabilidades,
2. o bien podemos ir construyéndolo (adaptativamente)
mientras vamos leyendo los símbolos. Esta es la base del
código Huffman adaptativo.

Para la construcción del árbol adaptativamente, veamos a


continuación qué propiedades caracterizan a un árbol binario
para que sea el correspondiente a un código de Huffman.
Rafael Molina Tema 3: Codificación Huffman 14
Consideremos un árbol binario correspondiente a un alfabeto de
tamaño n en el que los símbolos del alfabeto son las hojas.
Entonces, el número de nodos del árbol es 2n-1 (pruébalo por
inducción).

A cada nodo del árbol binario le vamos a asignar dos


campos: Número del nodo y peso del nodo.

El número de nodo es un número único asignado a cada nodo


del árbol entre 1 y 2n-1. Los números los notaremos y1,…,y2n-1.

El peso de un nodo hoja es simplemente el número de veces


que aparece el símbolo correspondiente y el de uno interno la
suma de los pesos de sus dos hijos. Los pesos los notaremos
x1,…,x2n-1.

Rafael Molina Tema 3: Codificación Huffman 15


Puede probarse que:

Si al asignar números a los nodos comenzando por el uno y


recorriendo el árbol por niveles (asignamos, de izquierda a
derecha en cada nivel y de las hojas (abajo) a la raíz
(arriba) los pesos de los nodos quedan ordenados en un
orden no decreciente

El árbol obtenido es un árbol binario correspondiente a un


código de Huffman para dichos símbolos.

La propiedad anterior recibe el nombre de sibling property o


node number invariant.
Rafael Molina Tema 3: Codificación Huffman 16
En el ejemplo de la derecha:
•Entre paréntesis los pesos de
cada nodo.
(16) 9

7 (7)
número asignado a cada (9) 8
nodo.
5 (3) (4) 6

correspondiente al código de
Huffman para estos símbolos
con las probabilidades que se (1) (2) (2) (2)
obtienen a partir del número de 1 2 3 4
veces que ha aparecido cada
símbolo dividido por el número
de símbolo leídos.
Rafael Molina Tema 3: Codificación Huffman 17
En el código Huffman adaptativo ni el transmisor ni el
receptor conocen al principio las probabilidades de los
símbolos. Por eso:

1. Codificador y decodificar comienzan con un árbol con un


nodo único que corresponde a todos los símbolos no
transmitidos (NYT) y que tiene peso cero.

2. Mientras progresa la transmisión se añadirán nodos al


árbol correspondientes a símbolos que aparezcan por
primera vez, se modificarán los pesos (tanto si el
símbolo es nuevo como si es ya existente) y se
actualizará el árbol para que siga cumpliendo the sibling
property (siga siendo de Huffman).
Rafael Molina Tema 3: Codificación Huffman 18
El algoritmo de Huffman adaptativo consta de los siguientes
elementos:

1. Inicialización (la misma para el codificador y


decodificador).

2 Algoritmo de codificación.

3. Algoritmo de decodificación.

4. Proceso de actualización del árbol para que mantenga


the sibling property.

Antes de describir estas partes comentaremos brevemente


sobre la codificación de los símbolos:
Rafael Molina Tema 3: Codificación Huffman 19
Codificación de un símbolo que aparece por primera
vez:

•Salvo que sea el primero de todos lo símbolos de la


secuencia, la codificación de un símbolo que aparece por
primera vez consta de la codificación que proporciona el
árbol del nodo NYT seguido de un código fijo para el símbolo
que deben conocer codificador y decodificador

•En el caso en que sea el primer símbolo que aparece en la


secuencia no necesitamos transmitir el código de NYT.

Si el símbolo ya ha aparecido

•Utilizamos la codificación que proporciona el árbol que


vamos construyendo.
Rafael Molina Tema 3: Codificación Huffman 20
Inicialización del código de Huffman adaptativo
(tanto para el codificador como para el decodificador

1. Nuestro árbol ha de codificar n+1 símbolos incluyendo


el correspondiente a NYT,

2. Necesitamos por tanto 2(n+1)-1=2n+1 números para


los nodos,

3. El árbol de Huffman inicial tiene un nodo único:


peso
0
2n+1
NYT Número
del nodo
Rafael Molina Tema 3: Codificación Huffman 21
Algoritmo de codificación para el código
Huffman adaptativo
1. Si encontramos un símbolo nuevo entonces generar el
código del nodo NYT seguido del código fijo del
símbolo. Añadir el nuevo símbolo al árbol,

2. Si el símbolo ya está presente, generar su código


usando el árbol,

3. Actualizar el árbol para que siga conservando the


sibling property.

Nota: Recordemos que para el primer símbolo no hace falta transmitir el


código de NYT.
Rafael Molina Tema 3: Codificación Huffman 22
Algoritmo de decodificación para el código
Huffman adaptativo

1. Decodificar el símbolo usando el árbol actual,

2. Si encontramos el nodo NYT, usar el código fijo para


decodificar el símbolo que viene a continuación. Añadir
el nuevo símbolo al árbol,

3. Actualizar el árbol para que siga conservando the


sibling property.

Nota: recordar, de nuevo, que el primer símbolo no va precedido por el


código de NYT
Rafael Molina Tema 3: Codificación Huffman 23
Actualización del árbol para el código
Huffman adaptativo
1. Sea y la hoja (símbolo) con peso x,
2. Si y es la raíz, aumentar x en 1 y salir
3. Intercambiar y con el nodo con el número mayor que
tenga el mismo peso que él (salvo que sea su padre)
4. Aumentar x en 1
5. Sea y el padre que tiene su peso x (el que sea, no el
definido en 4) ir al paso 2 del algoritmo

Rafael Molina Tema 3: Codificación Huffman 24


Ejemplo
Consideremos el alfabeto A={a,b,c,d} y realicemos la
codificación de la secuencia

aabcdad

Primero vemos el número de nodos que necesitaremos

Nodos=2*4+1=9

Los códigos de longitud fija que usamos son

a 000 b 001 c 010 d 011

Rafael Molina Tema 3: Codificación Huffman 25


Inicialización 0 9

NYT

• aabcdad en A={a,b,c,d}

salida=000

0 9
algoritmo de
0 1
codificación
0 7 0 8

NYT a

Rafael Molina Tema 3: Codificación Huffman 26


Paso 3 del algoritmo de codificación (actualización)

0 9
Paso 4 dentro del
0 1
algoritmo de
actualización 0 7 1 8

NYT a

1 9

algoritmo de 0 1
actualización 0 7 1 8

NYT a

Rafael Molina Tema 3: Codificación Huffman 27


• aabcdad 1 9

Tenemos 0 1
0 7 1 8

NYT a
salida=000

salida=0001

Paso 2 del 1 9
algoritmo de 0 1
codificación
0 7 1 8

NYT a
Rafael Molina Tema 3: Codificación Huffman 28
Paso 3 del algoritmo de codificación (actualización)

1 9
Paso 4 dentro del
0 1
algoritmo de
actualización 0 7 2 8

NYT a

2 9

algoritmo de 0 1
actualización 0 7 2 8

NYT a

Rafael Molina Tema 3: Codificación Huffman 29


• aabcdad 2 9

Tenemos 0 1
0 7 2 8

NYT a Código
salida=0001 de NYT

2 9
salida=00010001
0 1
Paso 1 del
algoritmo de 0 7 2 8 Código
de b
codificación a
0 1
0 5 0 6

NYT b
Rafael Molina Tema 3: Codificación Huffman 30
2 9 2 9

0 1 0 1
0 7 2 8
1 7 2 8

a a
0 1 0 1
0 5 1 6 0 5 1 6

NYT b NYT b
3 9

0 1
1 7 2 8

a
0 1 Paso 3 del algoritmo
0 5 1 6 de codificación
NYT b
(actualización)
Rafael Molina Tema 3: Codificación Huffman 31
Código
Algoritmo de codificación de NYT
• aabcdad sin adaptación del árbol
Tenemos salida=0001000100010

salida=00010001
3 9
c
0 1
3 9
1 7 2 8
0 1
a
1 7 2 8 0 1
a 0 5 1 6
0 1
0 1 b
0 5 1 6

NYT b
0 3 0 4
NYT c
Rafael Molina Tema 3: Codificación Huffman 32
3 9 3 9
0 1 0 1
1 7 2 8 2
1 7 8
a
0 1 0 1 a
0 5 1 6
0 1 1 5 1 6
b
0 3 1 4
0 1 b
NYT c 0 3 1 4
3 9
NYT c 4 9
0 1 0 1
2 7 2 8 2 7 2 8
a
0 1 a 0 1
1 5 1 6 1 5 1 6
0 1 b 0 1 b
0 3 1 4 0 3 1 4 adaptación
NYT c NYT c del árbol
Rafael Molina Tema 3: Codificación Huffman 33
Algoritmo de codificación
• aabcdad sin adaptación del árbol
NYT
Tenemos salida=0001000100010000011

4 d
9
salida=0001000100010 0 1
2 7 2 8
4 9 a
0 1 0 1
1 5 1 6
2 7 2 8 1
0 b
a
0 1 0 3 1 4
1 5 1 6 c
0 1 b
0 1
0 3 1 4
NYT
0 1 0 2
c
NYT d
Rafael Molina Tema 3: Codificación Huffman 34
4 9 4 9
0 1 0 1
2 7 2 8 2 7 2 8
a a
0 1 0 1
1 5 1 6 1 5 1 6
0 1 b 0 1 b
0 3 1 4 1 3 1 4
c c

0 1 0 1
0 1 1 2 0 1 1 2
NYT d NYT d

adaptación
del árbol
Rafael Molina Tema 3: Codificación Huffman 35
4 9
4 9
0 1 0 1
2 7 2 8
2
2 7 8
a
0 1 0 1 a
1 5 1 6
1 5 1 6
0 1 1
b
b 0
1 3 1 4 1 3 1 4
c
c
0 1 0 1
0 1 1 2 0 1 1 2
NYT d NYT d
adaptación
CAMBIO DE ORDEN
del árbol
Rafael Molina Tema 3: Codificación Huffman 36
4 9 4 9
0 1 0 1
2 7 2 8 2 7 2 8
a a
0 1 0 1
1 5 2 6 1 5 2 6
0 1 0 1
b b
1 3 1 4 1 3 1 4

c c
0 1 0 1
0 1 1 2 0 1 1 2
NYT d NYT d
adaptación
del árbol
Rafael Molina Tema 3: Codificación Huffman 37
4 9 4 9
0 1 0 1
2 7 2 8 2 7 3 8
a 0 1 a 0 1
1 5 2 6 1 5 2 6
0 1 0 1
b b
1 3 1 4 1 3 1 4

c c
0 1 0 1
0 1 1 2 0 1 1 2
NYT d NYT d

CAMBIO DE ORDEN adaptación


del árbol
Rafael Molina Tema 3: Codificación Huffman 38
5 9
0 1
2 7 3 8

a 0 1
1 5 2 6
0 1
b
1 3 1 4

c
0 1
0 1 1 2
NYT d

adaptación
del árbol
Rafael Molina Tema 3: Codificación Huffman 39
• aabcdad Algoritmo de codificación sin
adaptación del árbol
Tenemos
salida=0001000100010000011 salida=00010001000100000110

5 9 5 9
0 1 0 1
2 7 3 8 2 7 3 8

a 0 1 a 0 1
1 5 2 6 1 5 2 6
0 1 0 1
b b
1 3 1 4 1 3 1 4

c c
0 1 0 1
0 1 1 2 0 1 1 2
NYT d NYT d
Rafael Molina Tema 3: Codificación Huffman 40
5 9 6 9
0 1 0 1
3 7 3 8 3 7 3 8

a 0 1 a 0 1
1 5 2 6 1 5 2 6
0 1 0 1
b b
1 3 1 4 1 3 1 4

c c
0 1 0 1
0 1 1 2 0 1 1 2
NYT d NYT d

adaptación
del árbol
Rafael Molina Tema 3: Codificación Huffman 41
• aabcdad Algoritmo de codificación sin
Tenemos adaptación del árbol
salida= salida=
00010001000100000110 000100010001000001101101
6 9 6 9 d
0 1 0 1
3 7 3 8 3 7 3 8

a 0 1 a 0 1
1 5 2 6 5 2 6
1
0 1 0 1
b b
1 3 1 4 1 3 1 4

c c
0 1 0 1
0 1 1 2 0 1 1 2
NYT d NYT d
Rafael Molina Tema 3: Codificación Huffman 42
6 9 6 9
0 1 0 1
3 7 3 8 3 7 3 8

a 0 1 a 0 1
6 1 5 2 6
1 5 2
1 0 1
b 0 d
1 3 1 4 1 3 1 4

c c
0 1 0 1
0 1 1 2 0 1 1 2
NYT NYT b
d

Observar cambio
Rafael Molina Tema 3: Codificación Huffman 43
6 9 6 9
0 1 0 1
3 7 3 8 3 7 3 8

a 0 1 a 0 1
2 5 2 6 2 5 2 6
0 1 0 1
d d
1 3 1 4 1 3 1 4

c c
0 1 0 1
0 1 1 2 0 1 1 2
NYT b NYT b

Rafael Molina Tema 3: Codificación Huffman 44


6 9 7 9
0 1 0 1
3 7 4 8 3 7 4 8

a 0 1 a 0 1
2 5 2 6 2 5 2 6
0 1 0 1
d d
1 3 1 4 1 3 1 4

c c
0 1 0 1
0 1 1 2 0 1 1 2
NYT b NYT b

Rafael Molina Tema 3: Codificación Huffman 45


Ejercicio:

Usando el código fijo

a=000, b=001, c=010, d=011

Decodificar la secuencia 00110000 usando el código de


Huffman adaptativo.

Aunque el código de Huffman es uno de los métodos de


codificación de longitud de palabra variable más
conocidos, existen otros métodos algo menos conocidos
pero también muy útiles. En particular los métodos de
Golomb-Rice y Tunstall que veremos a continuación.

Rafael Molina Tema 3: Codificación Huffman 46


III.4 Código de Golomb

Consideremos un suceso A que tiene probabilidad p y su


complementario Ac que tiene probabilidad q=1-p (obviamente
p+q=1).

Queremos codificar el número de veces (racha=run length)


que aparece A antes de que aparezca Ac.

Suponemos que las realizaciones son independientes.

Observa que si p es próximo a uno esperamos que aparezca


muchas veces el suceso A antes de que aparezca un Ac.

Rafael Molina Tema 3: Codificación Huffman 47


Ejemplos de estos modelos son:

1. A es que salga cara al lanzar una moneda y Ac es


obviamente que salga cruz.

2. En el problema del agente 00111 de Golomb (ver material


adicional) el suceso Ac es que salga el cero en la ruleta y A
es que no salga (la ruleta tiene los números del 0 al 36).

3. Puntos en blanco y negro como podría ser el contenido de


una hoja.

Rafael Molina Tema 3: Codificación Huffman 48


1. Observa que para la ruleta P(A)=36/37 y P(Ac)=1/37.
2. En el caso de la moneda (si no está sesgada)
P(A)=P(Ac)=1/2.
3. En el caso de hojas en blanco y negro se podría estimar p.
Los fabricantes de impresoras suponen p=0.05

Lo que queremos codificar son las realizaciones de la variable


aleatoria N definida por

N= número de veces que aparece A antes de que aparezca


Ac.

Esta variable tiene la siguiente distribución de probabilidad

P(N=n)=pnq n=0,1,2,….

Rafael Molina Tema 3: Codificación Huffman 49


Una posible codificación sería:

Cada vez que aparezca el suceso A lo codificamos con un uno


y cuando se produzca el suceso Ac lo codificamos con un
cero.

De esta forma el valor n de la variable aleatoria N se codifica


mediante n unos seguidos de un cero. Es decir,
N código
0 0 Este código recibe el nombre de
1 10 código unario.
2 110
¿Cuál es el número medio de bits que
3 1110 este código, C, usa para codificar la
. . variable N?
. .
Rafael Molina Tema 3: Codificación Huffman 50
∞ ∞ ∞
C p ( N ) = ∑ (n + 1)qp = q ∑ p + q ∑ np
n n n

n =0 n =0 n =0

q ∞
q ⎛ ∞
n⎞
= + qp ∑ np =
n −1
+ pq deriv ⎜ ∑ p ⎟
1− p n =0 1− p ⎝ n =0 ⎠
q 1 1
= + pq =
1− p (1 − p ) 1 − p
2

Recuerda que q=1-p

Observa que si p está muy próximo a uno Cp(N) es muy


grande.
¿Cuánto vale la entropía de la variable aleatoria N en
función de p?.

Rafael Molina Tema 3: Codificación Huffman 51


( )
∞ ∞ ∞
H p ( N ) = −q ∑ p log qp = −q log(q )∑ p − q log( p )∑ np
n n n n

n =0 n =0 n =0

q log(q )
=− − pq log( p )∑ np n −1

1− p n =0

q log(q ) ⎛ ∞ n⎞
=− − pq log( p )derivada⎜ ∑ p ⎟
1− p ⎝ n =0 ⎠
= − log(q ) −
q log(q ) 1 p
=− − pq log( p ) log( p )
1− p (1 − p )2
1− p

=−
1
(q log q + p log p )
1− p
Recuerda que q=1-p

Rafael Molina Tema 3: Codificación Huffman 52


Representación gráfica de Cp(N) –Hp(N)

Observa que para p grande deberíamos ser capaces de mejorar el código


unario.

Sin embargo, para p=0.5, Cp(N) –Hp(N)=0 y el código unario es el mejor


que podemos utlizar.
Rafael Molina Tema 3: Codificación Huffman 53
Veamos la idea del código de Golomb intuitivamente.

Supongamos que tenemos una racha de apariciones de A de


longitud n1 y otra racha de apariciones de A de longitud
n2(>n1) cuya probabilidad es la mitad.

¿Cómo están relacionados n2 y n1?.


P ( N = n2 ) = qp n2 = q 2 n2 log p
= 0.5 × P( N = n1 ) = 0.5q 2 n1 log p = q 2 −1+ n1 log p
de donde
n2 log p = −1 + n1 log p
Muy importante
o 1 ⎛ 1 ⎞
n2 = n1 − = n1 + ⎜⎜ − ⎟⎟
log p ⎝ log p ⎠
Rafael Molina Tema 3: Codificación Huffman 54
Intutivamente, nos gustaría que el código de n2 fuese un bit
más largo que el de n1. Esto es lo que consigue el código de
Golomb.

Antes un poco de notación

⎣x ⎦ = entero más próximo a x por abajo


⎡x ⎤ = entero más próximo a x por arriba
⎣3.5⎦ = 3
⎡3.5⎤ = 4
Continuemos con el código de Golomb. Sea

⎡ 1 ⎤
w = ⎢− ⎥
⎢ log p ⎥
Rafael Molina Tema 3: Codificación Huffman 55
⎢n⎥
Para cada n sean Q=⎢ ⎥ y R = n − Qw
⎣ w⎦
En otras palabras Q es el cociente y R es el resto de la
división de n por w

(Observa que si n’=n+w entonces Q’=Q+1)

La codificación de Golomb para n consiste en:

1. un prefijo unario (para el cociente, es decir para Q),

2. y un sufijo binario (para el resto, R) usando ⎡log w ⎤ bits *

* Este código va a ser mejorado después

Rafael Molina Tema 3: Codificación Huffman 56


Supongamos que p=2^(-1/4) ~ 0.8409, entonces
w = 4, ⎡log w⎤ = 2

N Q R Representación
0 0 0 000
1 0 1 001
2 0 2 010
3 0 3 011
4 1 0 1000
5 1 1 1001
6 1 2 1010
Rafael Molina Tema 3: Codificación Huffman 57
Supongamos que p=2^(-1/5) , entonces

w = 5, ⎡log w⎤ = 3

N Q R Representación
0 0 0 0000
1 0 1 0001
2 0 2 0010
3 0 3 0011
4 0 4 0100
5 1 0 10000
6 1 1 10001
Rafael Molina Tema 3: Codificación Huffman 58
La parte sufijo del código es mejorable cuando w no sea una
potencia de 2, si usamos la siguiente representación de
longitud variable:

Sea R ε {0,1,…,w-1}

Usando ⎡logw ⎤ bits nos sobran M = 2 ⎡logw ⎤ − w códigos

Si R < M usamos representación binaria con ⎣logw ⎦ bits

Si R ≥ M usamos la representación en ⎡log w⎤ bits de R + M

Rafael Molina Tema 3: Codificación Huffman 59


Ejemplos:

w=2 w=3 0 1
Los arcos determinan el código
1 Los nodos contienen el resto
0 0
0 1 0 1
Resto R Representación
Resto R Representación 1 2
0 0
0 0 1 10
1 1 2 11

Rafael Molina Tema 3: Codificación Huffman 60


Más ejemplos de la representación de la parte sufijo

w=4 w=5
0 1 0 1

0 1 0 1 0 1 0 1
0 1 2 3 0 1 2
0 1
Resto R Representación Resto R Representación
0 00 0 00 3 4
1 01 1 01
2 10 2 10
3 11 3 110
4 111
Rafael Molina Tema 3: Codificación Huffman 61
Otro ejemplo de código Gollub:
Supongamos que p=2-1/5 . Entonces

w = 5, ⎡log w⎤ = 3

C N Q R Representación
Ó
D
0 0 0 000
I
G
1 0 1 001
O 2 0 2 010
G 3 0 3 0110
O
L 4 0 4 0111
L
U 5 1 0 1000
B
6 1 1 1001
Rafael Molina Tema 3: Codificación Huffman 62
III.5 Código Tunstall
Es un código de longitud fija en el que cada palabra del código puede representar
un número diferente de letras.
Código de Tunstall
Supongamos que tenemos inicialmente m símbolos y
queremos usar como salida representaciones de longitud fija
con n bits, siendo 2n>m. Suponemos que las realizaciones de
dichos símbolos son independientes. Construcción del árbol:

•Formar un árbol con una raíz y m hijos con arcos


etiquetados con los símbolos del alfabeto,
•Si el número de hojas del árbol, l, cumple l+(m-1)< 2n
seguir, en caso contrario parar.*
•Encontrar la hoja con mayor probabilidad (la probabilidad es
el producto de las probabilidades de los símbolos del camino
de la raíz a las hojas) y expandirla para que tenga m hijos.
Volver al paso anterior,
Rafael Molina Tema 3: Codificación Huffman 63
*Justificación de la condición de parada:

Veamos cuantos hojas tiene el árbol,

Si en un instante tiene l hojas, para expandir le quitamos una


y de esa una salen m. Por tanto una vez realizada la expansión
tenemos l-1+m que necesitaremos que sea menor que 2n ya
que necesitamos dejarnos al menos un código libre como ya
veremos.

Una vez construido el árbol le asignamos un código de


longitud n a cada una de las hojas.

Rafael Molina Tema 3: Codificación Huffman 64


Supongamos que P(A)=0.6, P(B)=0.3 y P(C)=0.1 y n=3.
Por tanto, deseamos generar una representación de
longitud fija 3.

Paso 1

A B C

0.6 0.3 0.1

Rafael Molina Tema 3: Codificación Huffman 65


Paso 2
l=3, 3+2=5, 5<8 Seguimos

Paso 3

A B C

0.3 0.1
A B C

0.36 0.18 0.06

Rafael Molina Tema 3: Codificación Huffman 66


Paso 2
l=5, 5+2=7, 7<8 Seguimos

Paso 3
A B C

A B C

A B C

Rafael Molina Tema 3: Codificación Huffman 67


Paso 2
L=7, 7+2=9, 9 ≥8, Salimos

Codificación final (hay


varias opciones)
A B C

Observa que 101 110


A B C
tenemos libre la
palabra del código
111
A B C 011 100

000 001 010


Rafael Molina Tema 3: Codificación Huffman 68
El código de Tunstall ha generado la siguiente representación

Entrada Salida ¿Qué ocurre si queremos


codificar la secuencia AA?.
AAA 000
AAB 001 AA no tiene representación.

AAC 010 Para codificar el AA enviamos


el código no utilizado (111) y
AB 011 un código fijo para AA.
AC 100 Generalmente, si hay k nodos
internos en el árbol
B 101 necesitaremos k-1 códigos
fijos. En nuestro problema A
C 110 y AA.

Rafael Molina Tema 3: Codificación Huffman 69


Otro ejemplo. Supongamos P(A)=0.9 y P(B)=0.1 y
usamos n=2.

El árbol que construiríamos sería

Entrada Salida
A B
AA 00
AB 01 10
A B
10
00 01

Y dejaríamos el 11 para enviar el código de A


Rafael Molina Tema 3: Codificación Huffman 70
Si usásemos las cuatro palabras tendríamos

Entrada Salida
AAA 00 A B
AAB 01
11
AB 10 A B
B 11 10
A B

00 01

y no podríamos enviar código para A


Rafael Molina Tema 3: Codificación Huffman 71
Problema: considera la tabla en la que el código 111 es
utilizado para anunciar que a continuación viene el código de
A o AA.
Entrada Salida
¿Qué proceso seguiríamos
AAA 000 para codificar las secuencias

AAB 001 CABBAAC


AAC 010 CBBACA

AB 011 ?

AC 100
B 101
C 110
Rafael Molina Tema 3: Codificación Huffman 72
III.6 Aplicaciones del código de Huffman
En las clases de prácticas se estudiarán las siguientes
aplicaciones:

Imágenes: Usaremos imágenes de niveles de gris, es decir,


que en cada punto toman un valor entre 0 y 255. Estimaremos
la probabilidad de ocurrencia de cada nivel de gris usando el
histograma y aplicaremos Huffman. El modelo será por tanto
no adaptativo.

Como los valores de los píxeles están muy correlados


codificaremos la diferencia entre un píxel y el anterior usando
Huffman, veremos que mejoramos el nivel de compresión.

También usaremos imágenes binarias y códigos de Huffman


adaptativos
Rafael Molina Tema 3: Codificación Huffman 73
Texto: Usaremos diferentes tipos de texto y aplicaremos
Huffman habiendo calculado antes las probabilidades de
cada letra a partir del texto.

Eliminar la correlación aquí es más complicado y veremos


como hacerlo en capítulos posteriores.

Sonido: Cada canal estéreo se muestrea a 44.1 kHz y


utiliza una representación de 16 bits. Aunque no vamos a
construir el código Huffman (tendría 216 entradas),
calcularemos la entropía y por tanto una estimación de la
mejor compresión que podemos alcanzar. Podemos
también eliminar (o disminuir) la correlación entre los
datos y volver a calcular la entropía y por tanto una
estimación de la compresión a alcanzar con este modelo.
Rafael Molina Tema 3: Codificación Huffman 74
III.7 Resumen del tema

1. Código de Huffman, no adaptativo y adaptativo,


2. Códigos unarios y de Golomb,
3. Códigos de Tunstall,
4. Aplicaciones.

Rafael Molina Tema 3: Codificación Huffman 75


III.8 Bibliografía
K. Sayood, “Introduction to Data Compression”, Morgan and
Kaufmann, 2000.
Material adicional de la asignatura
•G. Langdon, Data Compression, Universidad de California, 1999. (langdon_Run-
Length_Encodings.pdf).
•Roque Marín,”Compresores estadísticos”, Universidad de Murcia,
(00_compresores_estadísticos_univ.murcia.pdf).
•Notas sobre el código de Golomb (Golomb_Notes.pdf).
•Otra presentación sobre compresores estadísticos,
(00_compresores_estadísticos_II.pdf).
•Temas 2, 3 y 4 del curso de compresión de datos impartido en Stony Brook
University (NY, USA), (tema[2,3,4]_stony.pdf).
•Tema 3 del curso de compresión de datos impartido en Chalmers University of
Technology (Suecia), curso 2003-2004. (tema3_chalmers.pdf).

•S. W. Golomb, “Run-Length Encodings”, IEEE Trans. On Information Theory, IT-


12: 399-401, 1966.
•D.A. Huffman, “A method for the construction of minimum redundancy codes”,
Proceedings of the IRE, 40:1098-1101, 1951.
Rafael Molina Tema 3: Codificación Huffman 76

También podría gustarte