Está en la página 1de 27

Captulo 4

Otros Sistemas de Codicacion


En general, los codigos de Human no son adecuados cuando el tama no
del alfabeto fuente es peque no y la probabilidad m axima grande, pues la
longitud media puede distar bastante de la entropa. Cuando esto ocurre,
hemos visto que cabe la posibilidad de codicar grupos de smbolos en lugar
de generar una palabra-c odigo para cada smbolo del alfabeto. Sin embargo,
en la practica esta posibilidad presenta un grave inconveniente. Si queremos
determinar la palabra-codigo que corresponde a una cadena concreta de longi-
tud k, el algoritmo extendido de Human exige encontrar las palabras-c odigo
de todas las cadenas de longitud k. En este tema estudiamos el codigo arit-
metico, que no presenta este inconveniente, y algunas tecnicas de diccionario.
4.1. El codigo aritmetico
En la codicaci on aritmetica, se genera una unica etiqueta o marca para la
sucesi on que se desea codicar. Esta etiqueta es cierto n umero del intervalo
(0, 1] y en su determinaci on juegan un papel fundamental las frecuencias
acumuladas de los smbolos del alfabeto. El uso de estas frecuencias para
determinar un codigo ya aparece en el trabajo de Shannon de 1948. Pero
el codigo aritmetico fue creado independientemente en 1976 por Pasco y
Rissanen.
43
44 CAP

ITULO 4. OTROS SISTEMAS DE C

ODIFICACI

ON
El procedimiento para generar la marca de la sucesi on consiste en ir re-
duciendo la longitud del intervalo que contiene dicha marca a medida que se
van recibiendo los elementos de la sucesi on.
Para simplicar el desarrollo teorico, supondremos que el alfabeto fuente
es S = {1, 2, 3, ..., n}. Si el conjunto de probabilidades es P = {p
1
, .., p
n
}, las
frecuencias acumuladas vienen dadas por
F(k) =
k

i=1
p
i
, y F(0) = 0,
de modo que los intervalos [F(i 1), F(i)), con i = 1, .., n, constituyen una
particion del intervalo [0, 1). Asignamos el smbolo i con el intervalo [F(i
1), F(i)). Se comienza con el intervalo [0, 1). Seguidamente se divide este en
subintervalos de la forma [F(i1), F(i)), i = 1, 2, ..., n. Si el primer elemento
recibido es i, consideramos ahora el nuevo intervalo [F(i 1), F(i)). Este
intervalo se divide en n subintervalos con longitudes proporcionales a las de
los de la primera divisi on. Por tanto, tienen la forma
[F(i 1) + rF(j 1), F(i 1) + rF(j)), j = 1, 2, .., n,
donde r = F(i) F(i 1), es decir, r es la longitud del intervalo actual
[F(i 1), F(i)). Si el segundo elemento recibido es j, entonces el intervalo
que contiene la marca es [F(i1)+rF(j 1), F(i1)+rF(j)). Continuando
de esta forma se determina una sucesi on decreciente de intervalos encajados y
el proceso termina cuando encontramos el intervalo que corresponde al ultimo
elemento recibido. La marca de la sucesi on a codicar es cualquier elemento
de este intervalo nal (suele tomarse el punto medio).
Para facilitar la comprension del algoritmo de codicaci on, vamos a con-
siderar un ejemplo sencillo
Ejemplo 4.1.1. Supongamos que el alfabeto fuente es S = {1, 2, 3} con las
probabilidades P = {0.8, 0.04, 0.16} y se desea codicar la sucesion 1 3 2.
4.1. EL C

ODIGO ARITM

ETICO 45
Empezamos elaborando una tabla con las frecuencias acumuladas y los
subintervalos de (0, 1] de la forma [F(i 1), F(i)), donde i = 1, 2, 3:
smbolos F(i) subintervalos
1 0.8 [0,0.8)
2 0.84 [0.8,0.84)
3 1 [0.84,1)
Denotamos por ([a
k
, b
k
))
k
la sucesion de intervalos que contienen la marca de
la sucesion a codicar. Empezamos con [a
0
, b
0
) = [0, 1). El primer elemento
de la sucesion es 1, por tanto, el siguiente intervalo es
a
1
= a
0
+ (b
0
a
0
) F(0) = 0 + (1 0) 0 = 0
b
1
= a
0
+ (b
0
a
0
) F(1) = 0 + (1 0) 0.8 = 0.8.
A continuaci on se determina el intervalo [a
2
, b
2
) usando el hecho de que el
siguiente elemento en la sucesion es 3:
a
2
= a
1
+ (b
1
a
1
) F(2) = 0 + (0.8 0) 0.84 = 0.672
b
2
= a
1
+ (b
1
a
1
) F(3) = 0 + (0.8 0) 1 = 0.8.
Notese que cada intervalo esta contenido en el anterior. Finalmente, deter-
minamos el intervalo [a
3
, b
3
), sabiendo que el tercer smbolo es 2:
a
3
= a
2
+ (b
2
a
2
) F(1) = 0.672 + (0.8 0.672) 0.8 = 0.7744
b
3
= a
2
+ (b
2
a
2
) F(2) = 0.672 + (0.8 0.672) 0.84 = 0.77952.
La marca de la sucesi on es el punto medio de este ultimo intervalo: m =
0.77696.
A la vista de las ideas anteriores, es facil determinar un algoritmo para
generar la marca:
1. Inicializar a
0
= 0, b
0
= 1.
2. Al recibir cada smbolo del mensaje fuente, determinar el intervalo
[F(i 1), F(i)) que le corresponde
46 CAP

ITULO 4. OTROS SISTEMAS DE C

ODIFICACI

ON
3. Actualizar a
k
y b
k
:

a
k
= a
k1
+ (b
k1
a
k1
)F(i 1)
b
k
= a
k1
+ (b
k1
a
k1
)F(i).
(4.1)
4. Continuar hasta codicar la sucesi on entera.
Para probar que el codigo aritmetico es instant aneo, necesitamos la sigu-
iente expresion explcita de la marca.
Denotemos por x la cadena x
1
, .., x
k
formada por smbolos fuente y por
P(x) la probabilidad del mensaje x. Recordemos que la probabilidad de
recibir un smbolo fuente es independiente de los anteriormente recibidos.
Si S
k
el conjunto de todas las cadenas en S de longitud k, consideramos en
S
k
el orden lexicogr aco y denimos
F(x
1
, .., x
n
) =

y<x
P(y).
Entonces se verica:
(1) La marca que corresponde al mensaje fuente x = x
1
x
2
...x
k
es
m(x) =

y<x
P(y) + (1/2)P(x).
(2) Los extremos del intervalo marca vienen dados por
a
k
= F(ant(x
1
, .., x
k
)), b
k
= F(x
1
, ...x
k
),
donde ant(x
1
, .., x
k
) denota la cadena inmediatamente anterior a x
1
x
2
...x
k
.
Vamos a probar (2) por inducci on sobre k:
i) Si se recibe el mensaje i, hemos visto que su intervalo identicador es
[F(i 1), F(i)), por lo que (2) es cierta para k = 1.
ii) Supongamos que (2) es cierto para k y consideremos un mensaje fuente
x
1
x
2
...x
k
i de longitud k+1. Por el algoritmo de generaci on del intervalo marca
a
k+1
= a
k
+ (b
k
a
k
) F(i 1), b
k+1
= a
k
+ (b
k
a
k
) F(i), (4.2)
4.2. GENERACI

ON DE UN C

ODIGO BINARIO 47
donde [a
k
, b
k
) es el intervalo correspondiente al mensaje x
1
x
2
...x
k
. Vamos a
probar solo la igualdad
b
k+1
= F(x
1
, .., x
k
, i),
puesto que la otra se prueba de manera similar. Por la hip otesis de induccion,
tenemos
b
k
= F(x
1
, .., x
k
), y a
k
= F(ant(x
1
, .., x
k
)). (4.3)
Teniendo en cuenta que
F(i) =

ji
P(j) y 1 F(i) =

j>i
P(j)
las relaciones (4.2) y (4.3) permiten obtener
b
k+1
= a
k
(1F(i))+b
k
F(i) =

y<ant(x
1
..x
k
)

j>i
P(y)P(j)+

yx
1
..x
k

ji
P(y)P(j).
Finalmente, basta observar que, en el segundo miembro, las sumas de la
derecha son exactamente las sumas de las probabilidades de las cadenas de
la forma y
1
..y
k
j con y
1
..y
k
anterior o igual a x
1
..x
k
y j i, mientras que
las sumas de la izquierda son las sumas de las probabilidades de las cadenas
y
1
..y
k
j con y
1
..y
k
anterior a ant(x
1
, .., x
k
) y j > i, lo que constituye el total
de las sumas que determinan la frecuencia acumulada F(x
1
, .., x
k
).
4.2. Generaci on de un codigo binario
Acabmos de ver como se genera la marca para cada mensaje, pero ahora
deseamos determinar un codigo binario para representar de una forma e-
ciente y unica cualquier mensaje. La marca m es un n umero del intervalo
[0, 1) y una forma de conseguir un codigo binario para este n umero coonsiste
en considerar su representacion binaria, truncada adecuadamente.
Para ello, denotamos por (x) el n umero natural
log

1/P(x)

+ 1,
48 CAP

ITULO 4. OTROS SISTEMAS DE C

ODIFICACI

ON
donde a denota el menor n umero entero que es mayor o igual que a y x es
una cadena nita en S cualquiera (recordemos que log denota el logaritmo
en base 2). La palabra-c odigo que asignaremos al mensaje x sera la formada
por los (x) primeros dgitos de la representaci on binaria de la marca m(x) y
denotamos por m(x)
(x)
el n umero real que resulta al truncar el desarrollo bi-
nario de m(x). Hemos visto que a mensajes fuente diferentes les corresponde
marcas diferentes; sin embargo, con los desarrollos truncados puede no ocur-
rir lo mismo. Es decir, tenemos que probar que al truncar las marcas de dos
mensajes diferentes se obtienen dos cadenas binarias distintas. Como los in-
tervalos identicadores son disjuntos, bastara probar que m(x)
(x)
pertenece
al intervalo [F(ant(x)), F(x)). A la vista de las relaciones obvias

0 m(x) m(x)
(x)
<
1
2
(x)
m(x)
(x)
< F(x),
(4.4)
solo necesitamos mostrar que F(ant(x)) m(x)
(x)
. Con este objetivo, n otese
que
1
2
(x)
=
1
2
(1/P(x))+1

1
2
log(1/P(x))+1
=
P(x)
2
. (4.5)
Por otra parte, sabemos que
m(x) F(ant(x)) =
P(x)
2
. (4.6)
De (4.5) y (4.6) se sigue
m(x) F(ant(x))
1
2
(x)
. (4.7)
Esta desigualdad junto con (4.4) permiten obtener
m(x)
(x)
F(ant(x)) 0,
lo que concluye la prueba de que m(x)
(x)
pertenece al intervalo [F(ant(x)), F(x)).
Terminamos esta seccion probando que el codigo aritmetico es instan-
t aneo, es decir, que una palabra-c odigo no puede ser el comienzo de otra.
Hemos comprobado que al truncar la marca m(x) de la forma establecida
4.3. ALGORITMO DE DECODIFICACI

ON 49
no nos salimos del intervalo identicativo. No obstante, vamos a ver que, de
hecho, se verica que todo el intervalo [m(x)
(x)
, m(x)
(x)
+ 2
(x)
) est a in-
cluido en [F(ant(x)), F(x)). Como la relacion F(ant(x)) m(x)
(x)
ya se ha
obtenido, basta probar la desigualdad
m(x)
(x)
+ 2
(x)
) F(x). (4.8)
Y (4.8) se obtiene como sigue
F(x) m(x)
(x)
F(x) m(x) =
P(x)
2
2
(x)
.
4.3. Algoritmo de decodicaci on
Abordamos ahora el problema de la decodicacion de la marca de un men-
saje. Veremos que el proceso consiste en ir siguiendo los pasos de que consta
el proceso de generaci on de la marca. Nuevamente, consideramos primero el
ejemplo anterior. Habiamos obtenido la marca m = 0.77696 y recordemos
que los intervalos que se van determinando durante el proceso de generaci on
de m forman una sucesi on decreciente de intervalos
[a
k
, b
k
) [a
k1
, b
k1
) [a
1
, b
1
) [a
0
, b
0
) = [0, 1).
Iniciamos el proceso de decodicaci on con [a
0
, b
0
) = [0, 1) y ponemos r =
b
0
a
0
. En la tabla de frecuencias acumuladas encontramos i {1, ..., n} de
modo que
F(i 1)
m a
0
r
< F(i),
dado que la marca m se tomo en [a
0
+rF(i1), a
0
+rF(i)) = [F(i1), F(i)),
al recibir el primer elemento del mensaje fuente. En nuestro ejemplo, se tiene
m a
0
r
= m = 0.77696.
Como m [0, 0.8) = [F(0), F(1)), se sigue que i = 1, lo que signica que el
primer elemento del mensaje es 1. Ahora se procede a actualizar
50 CAP

ITULO 4. OTROS SISTEMAS DE C

ODIFICACI

ON
1) el intervalo

a
1
= a
0
+ rF(0) = 0
b
1
= a
0
+ rF(1) = 0.8,
2) r = b
1
a
1
= 0.8.
Como la marca pertenece al intervalo [a
1
+rF(i 1), a
1
+rF(i)), para cierto
i {1, ..., n}, igual que en el primer paso buscamos en la tabla de frecuencias
acumuladas i de modo que
F(i 1)
m a
1
r
< F(i).
Dado que
m a
1
r
=
0.77696 0
0.8
= 0.97,
deducimos que i = 3 y hemos encontrado el segundo elemento del mensaje.
El proceso de decodicaci on contin ua de esta forma hasta que decodicamos
el ultimo smbolo del mensaje. Hay dos formas de saber cu ando se ha decod-
icado el mensaje entero. a) El decodicador conoce la longitud del mensaje
fuente y b) se establce un smbolo que marque el n de la transmisi on.
Terminamos esta seccion estableciendo el algoritmo de decodicacion que
resulta obvio a la vista del ejemplo que hemos desarrollado:
1. Inicializar a
0
= 0, b
0
= 1.
2. Para cada k, encontrar
s =
m a
k1
b
k1
a
k1
.
3. Encontrar i n de modo que
F(i 1) s < F(i).
4. Actualizar a
k
y b
k
:

a
k
= a
k1
+ (b
k1
a
k1
)F(i 1)
b
k
= a
k1
+ (b
k1
a
k1
)F(i).
(4.9)
5. Continuar hasta codicar la sucesi on entera.
4.4. LONGITUD MEDIA DEL C

ODIGO ARITM

ETICO 51
4.4. Longitud media del codigo aritmetico
Nos ocupamos ahora de averiguar hasta que punto es eciente el codigo
aritmetico. Notemos, en primer lugar, que la longitud media de las palabras
que codican los mensajes fuente de longitud k viene dada por
L =

P(x) (x),
donde la suma se extiende a todas las cadenas de longitud k formadas por
smbolos del alfabeto fuente S. Teniendo en cuenta la denicion de (x),
resulta
L =

P(x)

log(1/P(x)) + 1

P(x)

log(1/P(x)) + 2

=
= H(S
k
) + 2

P(x) = H(S
k
) + 2.
Por otra parte, se tiene la desigualdad H(S
k
) L, ya que el codigo aritmetico
es instant aneo. Por tanto, se verica
H(S
k
) L H(S
k
) + 2. (4.10)
Si denotamos por
S
la longitud media por smbolo fuente, entonces L = k
S
y (4.10) adopta la forma
H(S
k
)
k

S

H(S
k
)
k
+
2
k
. (4.11)
Finalmente, recordando que en el tema anterior hemos visto que H(S
k
) =
kH(S), puede escribirse la relaci on anterior en la forma
H(S)
S
H(S) +
2
k
,
lo que prueba que podemos conseguir que
S
este tan pr oxima a la entropa
como se quiera sin mas que tomar k convenientemente grande.
52 CAP

ITULO 4. OTROS SISTEMAS DE C

ODIFICACI

ON
4.5. Generaci on del codigo aritmetico con es-
calado
Hemos visto que la marca se genera mediante el algoritmo

a
n+1
= a
n
+ (b
n
a
n
)F(i 1)
b
n+1
= a
n
+ (b
n
a
n
)F(i).
(4.12)
En las aplicaciones surge un importante problema en relaci on con el codigo
aritmetico. A medida que n aumenta, los extremos del intervalo [a
n
, b
n
) se
aproximan y puede ocurrir que la m aquina no pueda distinguirlos. En este
apartado vamos a desarrollar un metodo que resuelve este problema y que
consiste en ir reescalando los intervalos que se van obteniendo.
El algoritmo se desarrolla con normalidad hasta encontrar el primer in-
tervalo [a
n
, b
n
) que verique una de las tres condiciones siguientes:
(a) [a
n
, b
n
) [0, 0.5).
(b) [a
n
, b
n
) [0.5, 1).
(c) [a
n
, b
n
) [0.25, 0.75) y 5 [a
n
, b
n
).
Para simplicar, consideraremos por el momento solo las dos primeras posi-
bilidades. Supongamos que el intervalo [a
n
, b
n
) es el primero que verica (a)
o (b). Si est a contenido en [0, 0.5), tambien lo est an los intervalos siguientes.
Por tanto, la marca del mensaje que estamos codicando pertenece a [0, 0.5)
y el dgito mas signicativo de la representaci on binaria de la marca es 0 (ten-
gase en cuenta que 0.5 = 0.1
2
). Si, por el contrario, [a
n
, b
n
) esta contenido en
la mitad superior, el dgito m as signicativo de la marca sera 1. Es decir, en
el momento que encontramos que un intervalo determinado por el algoritmo
anterior est a contenido en [0, 0.5) o [0.5, 1), el signo m as signicativo de la
representaci on binaria de la marca esta completamente determinado: es un 0
en el caso (a) y un 1 en el (b). Este hecho puede trnasmitirse o almacenarse
sin necesidad de esperar a codicar el resto del mensaje. Para evitar el prob-
lema de la reduccion progresiva del intervalo, tras transmitir el primer dgito,
procedemos a reescalar el intervalo actual [a
n
, b
n
). Para ello, consideramos las
4.5. GENERACI

ON DEL C

ODIGO ARITM

ETICO CON ESCALADO 53


funciones
f
1
: x [0, 0.5) 2x [0, 1),
f
2
: x [0.5, 1) 2(x 0.5) [0, 1),
y se continua el algoritmo con el nuevo intervalo [a
n
, b
n
) = [f
i
(a
n
), f
i
(b
n
)),
con i igual a 1 o 2 seg un estemos en el caso (a) o (b). Es decir, para encontrar
el siguiente bit mas signicativo de la marca, debemos escoger i de forma que

a
n+1
= a
n
+ (b
n
a
n
)F(i 1)
b
n+1
= a
n
+ (b
n
a
n
)F(i).
(4.13)
Si no hubiesemos reescalado, el algoritmo continua con el siguiente inter-
valo dado por (4.12). Para jar ideas, supongamos que estamos en el caso
[a
n
, b
n
) [0, 0.5).Si multiplicamos los dos miembros de (4.12) por 2, resulta

2a
n+1
= a
n
+ (b
n
a
n
)F(i 1)
2b
n+1
= a
n
+ (b
n
a
n
)F(i),
(4.14)
lo que prueba que, con escalado o sin el, el valor de i es el mismo.
Imaginemos que por segunda vez el intervalo actual esta en una de las
situaciones (a) o (b). El dgito mas signicativo de los puntos de dicho interva-
lo est a entonces determinado y es, a su vez, el segundo dgito m as signicativo
de la marca (recuerdese que el intervalo se ha duplicado una vez). Por tanto,
podemos almacenar o transmitir este dgito y continuar con el algoritmo, tras
reescalar el intervalo actual por segunda vez. La codicaci on termina cuando
se ha considerado el ultimo smbolo del mensaje fuente.
Pasamos ahora a considerar la posibilidad de que el intervalo actual
[a
n
, b
n
) este contenido en [0.25, 0.75). Si este es el caso, duplicamos dicho
intervalo usando la aplicaci on
f
3
: x [0.25, 0.75) 2(x 0.25) [0, 1).
El codicador toma nota de que ha aplicado la funci on f
3
y continua el
algoritmo con el nuevo intervalo [a
n
, b
n
) = [f
3
(a
n
), f
3
(b
n
)). Si se da el caso
54 CAP

ITULO 4. OTROS SISTEMAS DE C

ODIFICACI

ON
de que, tras aplicar k veces f
3
, el nuevo intervalo obtenido por aplicaci on
del algoritmo resulta estar contenido en [0.5, 1), puede demostrarse que los
siguientes k +1 dgitos del desarrollo binario de la marca son necesariamente
1 seguido de k ceros. Si, por el contrario, despues de k aplicaciones de f
3
,
encontramos un intervalo contenido en [0, 0.5), entonces los k + 1 siguientes
dgitos son 0 seguido de k unos. Estos dgitos pueden ser ya transmitidos (o
almacenados) antes de continuar con el proceso de codicaci on.
Para justicar las armaciones anteriores, vamos a considerar el caso mas
simple siguiente. Supongamos que se ha iniciado el algoritmo de codicacion
y, por primera vez, encontramos un intervalo [a
n
, b
n
) que est a en alguna
de las situaciones (a), (b) o (c). Concretamente, asumimos que [a
n
, b
n
)
[0.25, 0.75). Entonces procedemos a reescalar el intervalo
a
n
= 2(a
n
0.25), b
n
= 2(b
n
0.25) (4.15)
y seguidamente, tras recibir el siguiente smbolo, procedemos a determinar
el siguiente intervalo

a
n+1
= a
n
+ (b
n
a
n
)F(i 1)
b
n+1
= a
n
+ (b
n
a
n
)F(i),
(4.16)
Puede ocurrir que este intervalo este contenido en [0, 0.5), en [0.5, 1) o ni una
cosa ni la otra. Estamos interesados en el caso de que se de alguna de las dos
primeras.
a) [a
n+1
, b
n+1
) [0.5, 1). En este momento del proceso de codicaci on,
seg un hemos dicho m as arriba, los dos primero dgitos del desarrollo binario
de la marca seran 10. Para probar que esto es as, denotemos por [a
s
n+1
, b
s
n+1
)
el intervalo que que se obtendra al aplicar el algoritmo de codicacion con
el intervalo [a
n
, b
n
), es decir, sin aplicar f
3
. Sustituyendo los valores de a
n
y
b
n
, dados por (4.15) en (4.16), obtenemos

a
n+1
= 2(a
n
0.25) + 2(b
n
a
n
)F(i 1)
b
n+1
= 2(a
n
0.25) + 2(b
n
a
n
)F(i),
4.5. GENERACI

ON DEL C

ODIGO ARITM

ETICO CON ESCALADO 55


Notese que a
n+1
= 2(a
s
n+1
0.25) y b
n+1
= 2(b
s
n+1
0.25) y, teniendo en
cuenta que [a
n+1
, b
n+1
) [0.5, 1), se sigue que
a
s
n+1
= 0.25 +
a
n+1
2
0.25 +
0.5
2
= 0.5
y
b
s
n+1
= 0.25 +
b
n+1
2
0.25 +
1
2
= 0.75.
Esto muestra que [a
s
n+1
, b
s
n+1
) [0.5, 0.75), por lo que la marca tiene como
primeras dos cifras signicativas 10, ya que
0.25 = 0.01
2)
; 0.5 = 0.1
2)
, 0.75 = 0.11
2)
.
b) [a
n+1
, b
n+1
) [0, 0.5). Procediendo de igual forma, se probara que
[a
s
n+1
, b
s
n+1
) [0.25, 0.5), por lo que la marca comenzara por 01.
Ejemplo 4.5.1. Sea S = {1, 2, 3, 4} el alfabeto fuente y P = {0.3, 0.15, 0.25, 0.3}
el conjunto de probabilidades. Usar el algoritmo con reescalado para codicar
el mensaje 3 2 1 2.
En primer lugar, elaboramos la tabla con las frecuencias acumuladas y
los subintervalos que corresponden a cada smbolo fuente
smbolos F(i) intervalos
1 0.3 [0, 0.3)
2 0.45 [0.3, 0.45)
3 0.7 [0.45, 0.7)
4 1 [0.7, 1)
Se inicia el algoritmo de codicacion con a
0
= 0 y b
0
= 1. Se recibe el smbolo
3 al que corresponde el intervalo [a
1
, b
1
) = [0.45, 0.7). Como est a contenido
en [0.25, 0.75), aplicamos la funcion f
3
para obtener los nuevos valores de a
1
y b
1
:
a
1
= 2(0.45 0.25) = 0.4, b
1
= 2(0.7 0.25) = 0.9
56 CAP

ITULO 4. OTROS SISTEMAS DE C

ODIFICACI

ON
y ponemos el contador en 1. Al no estar el nuevo intervalo [0.4, 0.9) en ninguna
de las situaciones (a), (b) 0 (c), prosegimos con la codicacion del siguiente
smbolo, 2.

a
2
= 0.4 + (0.9 0.4)0.3 = 0.55
b
2
= 0.4 + (0.9 0.4)0.45 = 0.625
El intervalo [a
2
, b
2
) est a contenido en la mitad superior del intervalo unidad,
por tanto, transmitimos 10, ponemos el contador en cero y aplicamos f
2
para
reescalar el intervalo [a
2
, b
2
):
a
2
= 2(0.55 0.5) = 0.1, b
2
= 2(0.625 0.5) = 0.250.
El nuevo intervalo esta contenido en [0, 0.5). Entonces transmitimos 0 y apli-
camos f
1
para reescalar el intervalo actual
a
2
= 2 0.1 = 0.2, b
2
= 2 0.250 = 0.5.
De nuevo transmitimos 0 y reescalamos con la funci on f
1
a
2
= 2 0.2 = 0.4; b
2
= 2 0.5 = 1.
Nuevamente, el intervalo no est a en ninguna de las tres condiciones que pre-
cisan reescalado y, por tanto, damos entrada al siguiente smbolo, 1. Actual-
izamos el intervalo

a
3
= 0.4 + (1 0.4)0 = 0.4
b
3
= 0.4 + (1 0.4)0.3 = 0.58.
Como [a
3
, b
3
) esta contenido en [0.25, 0.75), ponemos el contador en 1 y
reescalamos por medio de f
3
a
3
= 2(0.4 0.25) = 0.3, b
3
= 2(0.58 0.25) = 0.66.
Ponemos el contador en 2 y reescalamos con f
3
a
3
= 2(0.3 0.25) = 0.1, b
3
= 2(0.66 0.25) = 0.82.
4.6. EL ALGORITMODE CODIFICACI

ONCONARITM

ETICAENTERA57
No se necesita reescalar, damos entrada al ultimo smbolo, 2, y actualizamos
el intervalo:

a
4
= 0.1 + (0.82 0.1) 0.3 = 0.316
b
4
= 0.1 + (0.82 0.1) 0.45 = 0.4240.
El intervalo [a
4
, b
4
) est a contenido en la mitad inferior del intervalo unidad y
el contador esta en 2, transmitimos 0 1 1. Hasta el momento se ha transmitido
la cadena 1 0 0 0 0 1 1.
4.6. El algoritmo de codicaci on con aritmeti-
ca entera
Resuelto el problema de la reducci on progresiva del intervalo [a
n
, b
n
),
a la hora de la aplicacion pr actica del codigo aritmetico, queda a un una
importante dicultad por resolver: encontrar el desarrollo binario de la marca
obtenida. En este apartado vamos a considerar una forma de implementar el
algoritmo de codicaci on usando aritmetica entera.
En primer lugar, debemos decidir el valor del parametro m que representa
la longitud de las cadenas binarias que manipularemos. Por el momento,
supondremos que ha sido determinado su valor. Denotamos por n
i
el n umero
de veces que aparece el smbolo i en una sucesi on de longitud N (suponemos
que el alfabeto fuente es S = {1, 2, .., s}). La sucesi on de frcuencias absolutas
acumuladas se denota por (N
k
)
s
0
, por tanto, se tiene
N
k
= n
1
+ n
2
+ + n
k
, (k 1) y N
0
= 0.
La frecuencia relativa acumulada F(i) viene dada por F(i) = N
i
/N. Las
expresiones (??) del algoritmo de codicaci on se sustituyen por

a
n+1
= a
n
+
(b
n
a
n
+1)N
i1
N

b
n+1
= a
n
+
(bnan+1)N
i
N
1,
(4.17)
58 CAP

ITULO 4. OTROS SISTEMAS DE C

ODIFICACI

ON
donde i es el smbolo que se acaba de recibir y x denota la parte entera de
x. Los puntos 0, 0.5 y 1 del intervalo [0, 1) se ponen en correspondencia con
cadenas binarias de longitud m del modo siguiente
0 0 (m) 0
0.5 1 0 (m 1) 0
1 1 (m) 1.
Una vez establecida las notaciones que necesitamos, para simplicar la ex-
plicaci on, vamos a desarrollar el metodo sobre un ejemplo concreto. Con-
sideramos el mismo ejemplo del apartado anterior. Suponemos que, en una
cadena de longitud 60, las frecuencias absolutas con que aparecen los smbolos
S = {1, 2, 3, 4} son las indicadas en la tabla siguiente.
smbolos frecuencias N
i
1 18 18
2 9 27
3 15 42
4 18 60
Debemos escoger m de modo que 2
m
supere a 4N. En nuestro caso, 4N = 240.
Por tanto, podemos escoger m = 8, pues 2
8
= 256. Supongamos que el
mensaje a codicar es 3 2 1 2.
Comenzamos con a
0
= 00000000
2)
= 0 y b
0
= 11111111
2)
= 255. Recibi-
mos el primer smbolo , 3, y determinamos a
1
y b
1
mediante las expresiones
(4.17):

a
1
= 0 +
25627
60
= 115 = 01110011
2)
b
1
= 0 +
25642
60
1 = 178 = 10110010
2)
.
Vemos que el primer bit de a
1
es diferente del de b
1
, pero el segundo bit es
mayor en a
1
que en b
1
(en el algoritmo con escalado, esto supondra que de-
beramos aplicar la funci on f
3
). En la implementaci on con aritmetica entera,
eliminamos el primer bit de ambos, el segundo se complementa y se a nade
4.6. EL ALGORITMODE CODIFICACI

ONCONARITM

ETICAENTERA59
a la derecha un nuevo dgito para completar los 8. a
1
lleva un 0 y
1
un 1,
obteniendose
a
1
= 01100110
2)
= 102, b
1
= 11100101
2)
= 229.
Para llevar la cuenta del n umero de veces que hacemos esta operacion, creamos
un contador al que damos el valor 1. Vemos que ahora el primer bit de a
1
y b
1
es diferente, pero el segundo de a
1
no es mayor que el de b
1
. Entonces
proseguimos con la codicaci on y consideramos el smbolo siguiente, 2.

a
2
= 102 +
12818
60
= 140 = 10001100
2)
b
2
= 102 +
12827
60
1 = 158 = 10011110
2)
.
Ahora el bit inicial es el mismo para a
1
y para b
1
. Transmitimos (o almacen-
amos) un 1, eliminamos el primer bit y se a nade a la derecha un 0 a a
2
y un
1 a b
2
, resultando
a
2
= 00011000
2)
, b
2
= 00111101
2)
.
Ahora bien, como el contador marca 1, transmitimos despues del 1 un 0 y
ponemos el contador en cero. Hasta ahora, la palabra-codigo tiene la forma
1 0. Prosiguiendo con el metodo, como el primer bit de a
1
y b
1
es el mismo,
0, transmitimos 0 y a nadimos a la derecha un 0 y un 1, respectivamente
a
2
= 00110000
2)
, b
2
= 01111011
2)
.
Nuevamente, el primer bit coincide, por lo que transmitimos el 0 y, tras
a nadir por la derecha un 0 y un 1, obtenemos
a
2
= 01100000
2)
= 96,
b
2
= 11110111
2)
= 247.
Como los primeros bits son diferentes, pero los segundos iguales, proseguimos
con la codicaci on recibiendo ahora el smbolo 1.

a
3
= 96 +
1520
60
= 96 = 01100000
2)
b
3
= 96 +
15218
60
1 = 140 = 10001100
2)
.
60 CAP

ITULO 4. OTROS SISTEMAS DE C

ODIFICACI

ON
Ahora el primer bit es diferente, pero el segundo es mayor en a
3
que en b
3
.
Ponemos el contador en 1, se elimina el primer bit de ambos extremos, se
complementa el segundo y se a nade por la derecha un 0 y un 1, respectiva-
mente
a
3
= 01000000
2)
, b
3
= 10011001
2)
.
Otra vez se da la situaci on anterior. Por tanto, ponemos el contador en 2,
eliminamos el primer bit, se complementa el segundo y se a nade un 0 y un
1, respectivamente, por la derecha
a
3
= 00000000
2)
= 0,
b
3
= 10110011
2)
= 179.
A la vista de los dos primeros bits, proseguimos la codicacion con el smbolo
nal, 2

a
4
= 0 +
18018
60
= 96 = 00110110
2)
b
4
= 0 +
18027
60
1 = 140 = 010100000
2)
.
0 es el bit inicial de ambos, por tanto, se transmite 0 seguido de 1 1, ya que
el contador marca 2. Se pone a cero el contador, se elimina el primer bit y se
a nade por la derecha un 0 y un 1 a cada uno
a
4
= 01101100
2)
, b
4
= 10100001
2)
.
Una vez que se ha codicado el ultimo smbolo, se a nade a la cadena ya
transmitida, 1 0 0 0 0 1 1, el codigo de a
4
. En denitiva, el mensaje codicado
es
1 0 0 0 0 1 1 0 1 1 0 1 1 0 0.
4.7. Decodicaci on con aritmetica entera
El algoritmo de decodicacion sigue los mismos pasos que el de codi-
caci on. A ttulo de ejemplo, consideramos la cadena binaria, 1 0 0 0 0 1 1 0 1 1 0 1 1 0 0,
4.7. DECODIFICACI

ON CON ARITM

ETICA ENTERA 61
obtenida en el apartado anterior al codicar el mensaje 3 2 1 2. Adoptamos
la misma longitud de palabra m = 8.
La decodicacion comienza tomando como marca los primeros 8 dgitos
de la cadena codicada, es decir, s = 10000110
2)
= 134 e inicializando el
intervalo
a = 00000000
2)
= 0, b = 11111111
2)
= 255.
Seguidamente, calculamos

(s a + 1) N 1
b a + 1

= 31.
En la tabla de frecuencias acumuladas encontramos
27 = N
2
31 < N
3
= 42,
por lo que decodicamos el primer smbolo como 3. A continuacion actual-
izamos el intervalo

a = 0 +

25627
60

= 115 = 01110011
2)
b = 0 +

25642
60

1 = 178 = 10110010
2)
.
Vemos que el primer dgito de a y b es diferente y el segundo es mayor en a
que en b. Entonces eliminamos el primer bit de a, b y s, complementamos el
segundo y se a nade (por la derecha) un bit: un 0 para a, un 1 para b, mientras
que se incorpora a s el siguiente bit en la cadena codicada, en nuestro caso,
1. Se obtienen los valores
a = 01100110
2)
, b = 11100101
2)
, s = 10001101
2)
.
Ahora el primer bit es diferente, pero el segundo no es mayor en a que en b.
Obtenemos los valores decimales de a, b y s
a = 102, b = 229, s = 141
y calculamos

(s a + 1) N 1
b a + 1

= 18.
62 CAP

ITULO 4. OTROS SISTEMAS DE C

ODIFICACI

ON
En la tabla de frecuencias encontramos
18 = N
1
18 < N
2
= 27,
lo que nos permite decodicar el segunso smbolo como 2. Ahora actualizamos
los valores de a y b

a = 102 +

12818
60

= 140 = 10001100
2)
b = 102 +

12827
60

1 = 158 = 10011110
2)
.
El primer bit de a y b es identico, entonces lo eliminamos y a nadimos a la
derecha de a y b un 0 y un 1, respectivamente. De igual forma, se elimina
el primer bit de s y se a nade por la derecha el siguiente bit en la cadena
codicada, es decir, 1. Los nuevos valores son
a = 00011000
2)
, b = 00111101
2)
, s = 00011011
2)
.
De nuevo, el primer dgito de a es identico al de b, entonces procedemos de
igual forma y obtenemos los nuevos valores
a = 00110000
2)
, b = 01111011
2)
, s = 00110110
2)
.
Nuevamente, son iguales y, repitiendo el proceso, obtenemos
a = 01100000
2)
= 96
b = 11110111
2)
= 247
s = 01101101
2)
= 109.
En este momento a y b tienen el primer bit diferente y el segundo no es mayor
en a que en b; por tanto, proseguimos la decodicaci on calculando

(s a + 1) N 1
b a + 1

= 5.
Como
0 = N
0
5 < N
1
= 18,
4.8. CODIFICACI

ON ARITM

ETICA CON MATLAB 63


decodicamos el tercer smbolo como 1 y actualizamos el intervalo

a = 96 +

1520
60

= 96 = 01100000
2)
b = 96 +

152cdot18
60

1 = 140 = 10001100
2)
.
a y b tienen diferente el primer bit, pero el segundo es mayor en a, entonces
eliminamos el primer bit en a, b y s, complementamos el segundo bit y a nadi-
mos un bit a la derecha: a se completa con un 0, b con un 1 y s con el siguiente
bit en la cadena codicada, 1. Por tanto, tenemos los nuevos valores
a = 01000000
2)
, b = 10011001
2)
, s = 01011011
2)
.
Se da la situaci on anterior otra vez, por lo que procedemos como antes y
obtenemos
a = 00000000
2)
= 0
b = 10110011
2)
= 179
s = 00110110
2)
= 54.
Para decodicar el siguiente smbolo, calculamos

(s a + 1) N 1
b a + 1

= 18.
Dado que
18 = N
1
18 < N
2
= 27,
podemos decodicar el cuarto y ultimo smbolo como 2. Por lo general, la
longitud del mensaje fuente se transmite junto con el mensaje codicado, por
lo que el decodicador sabe cu ando ha decodicado el ultimo smbolo.
4.8. Codicaci on aritmetica con Matlab
Matlab dispone de las dos funciones siguientes para codicar y decodicar
un codigo aritmetico: arithenco y arithdeco. Si el conjunto de smbolos
fuente es S = {1, 2, 3, ..., n}, denotamos por F = {N
1
, ..., N
n
} el conjunto
64 CAP

ITULO 4. OTROS SISTEMAS DE C

ODIFICACI

ON
de las frecuencias absolutas, es decir, N
k
es el n umero de veces que aparece
el smbolo k en un mensaje de longitud N =

k
N
k
. Si men es el mensaje
a codicar (una matriz la con elementos de S), el mensaje codicado se
obtiene como se indica en el ejemplo.
Ejemplo 4.8.1. Sea S = {1, 2, 3} el conjunto de smbolos fuente, F =
{10, 20, 70} el conjunto de frecuencias y men = [3321312] el mensaje a codi-
car.
Puede obtenerse el mensaje codicado con el programa
>> F = [10, 20, 70];
>> men = [3 3 2 1 3 1 2];
>> decomen = arithenco(men,F)
ans : 1 0 0 0 1 1 1 1 0 1 0 0 0 1 0 0 0 1 1 0 0.
Finalmente, para decodicar basta poner
>>arithdeco(codmen,F,length(men))
4.9. Tecnicas de diccionario
En numerosas ocasiones se da el caso de que la fuente produce determi-
nados grupos de letras con mayor frecuencia y, al contrario, otras combina-
ciones no se dan o son muy raras. Este es el caso cuando se trata con textos o
comandos de alg un lenguaje de programacion, por ejemplo, LaTex. Esta car-
acterstica puede explotarse para conseguir una mayor compresi on. Lo usual
es elaborar una lista o diccionario con las combinaciones m as frecuentes de
letras del alfabeto fuente y las palabras-c odigo correspondientes.
El diccionario puede ser estatico o dinamico. Cuando se tiene un buen
conocimiento a priori de la fuente en cuesti on, se utiliza un diccionario es-
t atico. Por ejemplo, si se desea comprimir los datos de los estudiantes de una
universidad, hay palabras como estudiante, nombre, creditos, etc que seran
muy frecuentes. Por el contrario, si no se dispone de ese conocimiento previo
4.10. DICCIONARIOS EST

ATICOS 65
de la fuente, tendremos que adquirirlo, de alg un modo, en el momento de
la codicacion. Esta es la idea clave para la elaboraci on de un diccionario
din amico.
4.10. Diccionarios estaticos
Una de las formas m as comunes de crear un diccionario estatico es la
siguiente. El diccionario consta de todas las letras del alfabeto fuente junto
con las cadenas de 2 smbolos (llamadas digrams) necesarias para completar
el tama no escogido para este.
Ejemplo 4.10.1. Supongamos que se desea crear un diccionario de tama no
256 para codicar los caracteres ASCII. Las primeras 95 entradas del dic-
cionario ser an los 95 caracteres ASCII y las restantes 161 entradas seran las
parejas de caracteres mas frecuentes.
4.11. Diccionarios dinamicos
La mayora de las tecnicas de compresion de datos que se basan en dic-
cionarios dinamicos tienen su raz en los trabajos de J. Ziv y A. Lempel de
1977 y 1978. Estos trabajos proporcionan dos modos diferentes de constru-
ir diccionarios din amicos y, de hecho, a partir de cada una de ellas se han
originado diversas variaciones de la idea original. A continuaci on vamos a
describir como se elabora el diccionario en una variacion del metodo LZ78
debida a T. Welch, que recibe el nombre de algoritmo LZW.
El diccionario debe ser creado tanto por el codicador como por el decod-
icador. Se inicia el metodo con un diccionario que contiene como entradas
todas las letras del alfabeto fuente. Para facilitar la explicacion, supongamos
que el alfabeto fuente es S = {a, b, c, v, &} y que deseamos codicar el men-
saje vbaab&vbaab&. Inicialmente, el diccionario tiene la forma
66 CAP

ITULO 4. OTROS SISTEMAS DE C

ODIFICACI

ON
ndice entrada
1 &
2 b
3 a
4 c
5 v
El primer smbolo que se recibe es v, que esta en el diccionario. Se procede
a concatenarlo con el siguiente y resulta la cadena vb. Como no pertenece a
la lista, se codica v con el ndice que le corresponde en el diccionario (5) y
se a nade a este la cadena vb como sexta entrada. Proseguimos con la cod-
icaci on considerando la letra que sigue a la que acabamos de codicar, es
decir, b. Como esta en el diccionario, se concatena con el siguiente smbolo
y resulta la cadena ba. Como no pertenece al diccionario, codicamos b con
su ndice correspondiente (2) y se a nade a la lista ba como septima entrada.
Continuamos de esta forma con la codicacion y supongamos que se ha lle-
gado hasta la segunda v ( concretamente, acabamos de a nadir al diccionario
la cadena &v). En este momento, este tiene la forma siguiente:
ndice entrada
1 &
2 b
3 a
4 c
5 v
6 vb
7 ba
8 aa
9 ab
10 b&
11 & v
Llegados a este punto, procederamos a codicar & con su ndice (1), para
4.12. C

ODIGOS DE TUNSTALL 67
continuar con la codicacion de v. Como v est a en el diccionario, se concatena
v con el siguiente smbolo, lo que produce la cadena vb. Como esta en el
diccionario, se concatena con la siguiente letra del mensaje y resulta vba. Al
no estar en la lista, la a nadimos como la entrada n umero 12, codicamos vb
con su ndice (6) y se continua el proceso. La porcion del mensaje que hemos
codicado adopta la forma: 5233216.
Por su parte, la decodicaci on consiste en ir reproduciendo los pasos que
hemos ido dando durante la codicaci on (recordemos que el diccionario ini-
cial es el mismo en los dos procesos). El mensaje a decodicar comienza por
5 y vemos que esta en el diccionario y se corresponde con la letra v. Entonces
el decodicador decide que la primera letra del mensaje es v y pasa a consid-
erar el siguiente n umero que es 2. Le corresponde la entrada b, de modo que
el decodicador ya conoce las dos primeras letras del mensaje: vb. Concate-
nendo con la anterior, obtiene vb. Como el decodicador debe ir formando
el diccionario de manera analoga a como lo hace el codicador, a nade a su
diccionario la cadena vb como sexta entrada y pasa a considerar el siguiente
n umero (3). Le corresponde la entrada a que est a en el diccionario. Entonces
la concatena con la letra que se acaba de decodicar, b, y resulta ba. La a nade
a la lista como entrada n umero 7 y decodica 3 como a.
4.12. Codigos de Tunstall
Terminamos el captulo estudiando un codigo usado en la compresi on de
datos que presenta la particularidad de que las palabras-codigo son de igual
longitud. Su principal ventaja radica en el hecho de que los errores en las
palabras-codigo no se propagan, lo que s ocurre en el codigo de Human.
L ogicamente, el codigo de Tunstall trata de maximizar el n umero medio de
smbolos fuente representados por cada palabra-c odigo. Para facilitar su com-
prensi on vamos a considerar, en primer lugar, un ejemplo.
Ejemplo 4.12.1. Sea S = {a, b, c} el alfabeto fuente y P = {0.6, 0.3, 0.1}
68 CAP

ITULO 4. OTROS SISTEMAS DE C

ODIFICACI

ON
el conjunto de probabilidades. Construir el codigo de Tunstall con palabras-
codigo de longitud 3.
El primer paso consiste en seleccionar la letra del alfabeto fuente con
mayor probabilidad. En nuestro caso, es la letra a. Seguidamente, se considera
el conjunto formado por las cadenas de longitud 2 de la forma a, junto con
las de longitud 1 distintas de a. La tabla muestra cada una de estas cadenas
junto con la probabilidad que les corresponde.
cadenas probabilidades
b 0.3
c 0.1
aa 0.36
ab 0.18
ac 0.06
Ahora se selecciona la cadena con mayor probabilidad de la tabla anterior.
Se trata de la palabra aa cuya probabilidad es 0.36. Creamos un segundo
conjunto de cadenas eliminando en el anterior la cadena aa y a nadiendo
todas las palabras de longitud 3 de la forma aa:
{b, c, ab, ac, aaa, aab, aac}.
El conjunto resultante tiene 7 elementos por lo que puede codicarse (en
binario) con palabras-c odigo de longitud 3.
Para abordar un caso generico, supongamos que el alfabeto fuente S tiene
n smbolos y deseamos determinar el codigo de Tunstall con palabras-c odigo
de longitud L. El n umero m aximo de palabras-codigo es igual a 2
L
. Inicial-
mente, la tabla tiene la forma
cadenas probabilidades
a
1
p
1
a
2
p
2
... ...
a
n
p
n
4.13. PR

ACTICAS DE PROGRAMACI

ON 69
Por tanto, tenemos n cadenas. En el primer paso a nadimos n cadenas de
longitud 2 y eliminamos una de longitud 1. Es decir, tras el primer paso la
tabla contiene n+(n1) cadenas. Notese que en cada paso ocurre lo mismo:
se a naden n1 nuevas cadenas. Luego, despues de aplicar k veces el proceso,
tendremos una tabla provisional con n+k(n1) cadenas. El metodo termina
cuando k verica las desigualdades
n + k (n 1) 2
L
y n + (k + 1) (n 1) > 2
L
.
4.13. Practicas de Programacion
1. Elaborar un programa de Matlab para codicar y decodicar un men-
saje de longitud arbitraria:
a) con el codigo aritmetico y aritmetica entera
b) con un codigo de Tunstall
c) con un diccionario est atico
d) con un diccionario dinamico (algoritmo LZW)