Beruflich Dokumente
Kultur Dokumente
En este algoritmo el codificador analiza el texto como una El decodificador es más simple que el codificador. El
secuencia de caracteres, mediante una ventana deslizable decodificador debe mantener una ventana de igual tamaño
compuesta por dos partes; un buffer hacia el frente que es que la ventana de búsqueda empleada en el codificador. Al
la opción que está a punto de ser codificada y un buffer principio, este buffer es rellenado con el mismo símbolo
de búsqueda (la ventana en sí), que es la parte dónde se empleado para rellenar el buffer inicialmente en el
buscan secuencias iguales a las existentes en el buffer de codificador.
anticipación. Para codificar el contenido, o parte de él, del
El método LZ77 no requiere de las frecuencias de
buffer de anticipación, se busca la secuencia igual en el
ocurrencia de los símbolos presentes en los datos que se
buffer de búsqueda y la codificación resulta en indicar
van a comprimir. El método solo busca patrones de
esta repetición como una tripleta [offset, longitud,
subcadena en el buffer de búsqueda que ocurran en el
carácter siguiente]. Donde:
buffer hacia el frente, suponiendo que dichos patrones
Offset es la distancia desde el principio del buffer ocurren continuamente, al menos dentro de la subcadena
de anticipación hasta el comienzo de la secuencia que engloban ambos buffers. Si esta suposición se cumple
repetida. en el conjunto de datos que se va a comprimir, el método
logra buenas razones de compresión.
Longitud es la cantidad de caracteres repetidos.
A continuación, se muestra el algoritmo de codificación en
Carácter siguiente es el símbolo siguiente a la LZ77 que muestra la secuencia de pasos de como funciona
secuencia en el buffer de anticipación. teóricamente el proceso de compresión de datos:
Pero, ¿cómo sabe el descompresor si lo que lee es un par
desplazamiento/tamaño o un byte sin comprimir?. La Guardar el tamaño del archivo a comprimir.
respuesta es simple, usamos un prefijo, un bit que actúa Repetir hasta que no haya más bytes para
como una bandera, de forma similar a un interruptor con comprimir.
dos estados que nos permite saber qué tipo de datos Escanear el buffer hacia el frente comenzando en
vienen a continuación. Si el prefijo es 0, entonces lo que posición_actual-tamaño_de_ventana_corrediza
viene es un byte sin comprimir. Si, por el contrario, el hasta el byte actual que estamos comparando.
prefijo es 1, entonces lo que sigue a continuación es un (Notar que el descompresor no puede copiar bytes
par desplazamiento/tamaño. A estos prefijos también se de una posición desde donde sus bytes no han sido
les llama “banderas”. El par desplazamiento/tamaño es previamente definidos).
llamado una palabra clave. Una palabra clave es un grupo ¿Hemos encontrado un byte igual al actual?
de bits (o bytes) que contienen alguna clase de
Caso Si:
información usada por el compresor y el descompresor.
o Comparamos el siguiente byte desde la
La otra salida posible de LZ77 es un literal, la cual es
posición actual con el byte en la posición
simplemente un byte sin comprimir, de manera que la
siguiente de donde encontramos un byte igual
salida de LZ77 puede ser de tres formas:
3
al primero. La primera fila de la tabla 1indica la posición dentro del
o Continuar comparando hasta que buffer y la segunda su contenido. Consideraremos la
encontremos un byte que no es igual. posición más a la izquierda como posición 1
o Se ha encontrado un byte que no es igual. ¿Es Supongamos también que los tres primeros elementos,
el número de bytes mayor que tres? 001, ya han sido codificados; en este momento nos da igual
Caso Si: que hayan sido comprimidos o tomados como literales.
o Escribir el desplazamiento del PRIMER byte Posteriormente nos ocuparemos de ese aspecto, pero ahora
hallado y el número de bytes repetidos tenemos que codificar lo que sigue: 01011. Llamaremos a
(tamaño). la secuencia ya codificada secuencia 1 y a la que será
o Movemos el puntero a la posición con el codificada ahora secuencia 2.
número de bytes repetidos (porque no los Si a alguien le pedimos que encuentre en 01011 una
hemos “salvado”) y seguimos buscando. secuencia que esté repetida a partir de lo que ya hemos
o También se escribe una bandera 1. codificado (001), nos dirá que los dos primeros elementos
Caso No: de la secuencia a codificar (posiciones 4 y 5 dentro del
o Continúa la búsqueda. buffer) son iguales a los dos últimos de 001 (posiciones 2
Caso No: y 3), y que ahí hay una repetición. Y tendrá razón, pero la
o Si no se encuentra ninguna coincidencia, genialidad de LZ está en darse cuenta de que se puede ir
simplemente se escribe un byte sin comprimir más allá y utilizar la propia secuencia a codificar como
(también se escribe un literal si no hay datos lugar donde seguir buscando repeticiones, a pesar de que
en la ventana corrediza). aún no se haya codificado.
o Debe recordar poner la bandera a 0. Veamos la secuencia 2 empieza por 0101 (posiciones 4 a
7). Si empezamos a mirar en lo que ya hemos codificado,
Por otra lado, se muestra el algoritmo de decodificación la secuencia 1, tenemos que finaliza en 01, pero si
en LZ77 que muestra la secuencia de pasos de cómo seguimos entrando en la secuencia 2 ahora veremos que
funciona teóricamente el proceso de descompresión de empieza por 01. Si juntamos el final de la secuencia 1 con
datos: el principio de la secuencia 2, tenemos 0101, que es igual
al comienzo de la secuencia a codificar o secuencia 2. Es
Se lee el tamaño del archivo sin comprimir. decir: los elementos 4, 5, 6 y 7 de la secuencia total son
Se repite hasta que se ha descomprimido todo una "repetición'' de los elementos 2, 3, 4 y 5. Por tanto se
el archivo. codificarán como un puntero a la posición número 2 más
Se lee un bit (la bandera). una longitud de 4.
Si es 0: La codificación se lleva a cabo introduciendo los datos
o Se leen 8 bits, se escriben al buffer de salida dentro de un buffer de una longitud prefijada, n, dentro del
(recordar que son un byte descomprimido) y se cual se van buscando subcadenas ya repetidas haciendo
incrementa el puntero a la salida. uso del método que acabamos de explicar.
Si es 1: Veamos otro ejemplo. Supongamos que queremos
o Se lee el desplazamiento completo (13 bits), luego codificar la secuencia S=001010210210212021021200.
el tamaño, copiar “tamaño” bytes de Por razones didácticas usaremos un buffer de longitud
“desplazamiento” a la posición actual, y añadir al
n=18 y una longitud máxima de cadena Ls de 9.
puntero a la salida “tamaño”
Inicialmente se llenan las n – Ls posiciones del buffer con
ceros, y las Ls restantes con los primeros datos de la
Se tomará como ejemplo para poder explicar los
secuencia, con lo que el buffer en la posición inicial
algoritmos la secuencia S=00101011. Pongámoslo
quedaría como se ve en la tabla 2.
tabulado, de forma que podamos hacer referencia a cada
elemento de la secuencia fijándonos en el orden en el que 1 2 3 4 5 6 7 8 9 1 1 1 1 1 1 1 1 1
aparece dentro de esta. 0 1 2 3 4 5 6 7 8
1 2 3 4 5 6 7 8 s 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 2 1 0
s 0 0 1 0 1 0 1 1 n - Ls Ls
Secuencia 2 Tabla 2: Estado Inicial de compresión del segundo ejemplo
Secuencia 1
Tabla 1: Buffer con la secuencia de datos del primer ejemplo
4
La extensión reproducible de Ls, empezando a buscar en 1 2 3 4 5 6 7 8 9 1 1 1 1 1 1 1 1 1
0 1 2 3 4 5 6 7 8
la parte ya "codificada" (las n-Ls primeras posiciones del
s 2 1 0 2 1 0 2 1 2 0 2 1 0 2 1 2 0 0
buffer), aparece en gris. La primera subcadena a codificar
se formará a partir de esa extensión reproducible, 00, n - Ls Ls
seguida del siguiente elemento que ya no está repetido 1, Tabla 5: Tercera iteración de compresión del segundo ejemplo
luego S1=001. La palabra código que representa a esa
Por último, tras desplazar las 8 posiciones que ocupa S3,
subcadena será, por convenio y en ese orden, el puntero
se obtiene S4=021021200 y C4=280 (Tabla 5).
al comienzo de la repetición menos 1, seguido de la
Comprobemos que la secuencia comprimida
longitud de la repetición, seguido del elemento final, que
C=821732672280 puede decodificarse unívocamente
no entraba en la repetición. Es decir, para este caso:
dando como resultado la secuencia original
C1=021.
S=001010210210212021021200. Es importante darse
Puesto que S1 tenía longitud 3, todo el contenido del
cuenta de que, si bien la longitud de las subcadenas no es
buffer es desplazado hacia la izquierda 3 posiciones.
fija (aunque sí limitada), la de las palabras código (C) sí lo
Posteriormente, seguiremos buscando a partir de la
es: en este caso, 3 caracteres. Esto permite separar la
posición 10 la extensión reproducible. Se grafica en la
palabra código de forma simple. Incluso dentro de una
tabla 3.
1 2 3 4 5 6 7 8 9 1 1 1 1 1 1 1 1 1 misma palabra código, los tamaños asignados a una u otra
0 1 2 3 4 5 6 7 8 función (posición a partir de la que empieza una repetición,
s 0 0 0 0 0 0 0 0 1 0 1 0 2 1 0 2 1 0 longitud de esta y elemento siguiente a ella), son también
Ls fijos, y fácilmente separables,
n - Ls
Tabla 3: Primera iteración de compresión del segundo ejemplo
La longitud de cada uno de estos campos, y de la palabra
código como suma de todos ellos, está directamente
relacionada con el tamaño del buffer, n, y con el de la
Aquí, la extensión periódica de los elementos a partir de máxima subcadena, Ls. Para descomprimir se emplea un
la posición 10 se haya en la posición 8. Empezando tanto buffer de longitud n-Ls donde se van guardando los
por 8 como por 10 encontramos la secuencia 010, así que símbolos descodificados. Inicialmente el buffer se pone
S2 es la parte que se repite del comienzo de Ls, 010 todo a 0.
(posiciones 10 a 12), más el siguiente elemento, 2, que ya Seguidamente se van leyendo una por una las palabras
no se repite (posición 13). Luego S2=0102, que se código, lo cual puede hacerse sin especial cuidado al tener
codifica como C2=732. Desplazamos 4 posiciones a la la misma longitud. También en este caso ilustraremos la
izquierda, que es lo que mide S2, y la "repetición'' de la descompresión paso por paso. La primera iteración se
secuencia Ls se encuentra en la zona marcada en la tabla ilustra en la figura 2.
4.
1 2 3 4 5 6 7 8 9 1 1 1 1 1 1 1 1 1
0 1 2 3 4 5 6 7 8
s 0 0 0 0 1 0 1 0 2 1 0 2 1 0 2 1 2 0
n - Ls Ls
Tabla 4: Segunda iteración de compresión del segundo ejemplo
3.2. Limitaciones
9
- Las redes tienen como principal inconveniente la
velocidad de transferencia de grandes cantidades de
datos, y es este punto en donde la compresión sigue
teniendo su punto fuerte en temas de eficiencia en la
transmisión de datos.
- Teniendo en cuenta que existen algoritmos de
compresión con pérdida que omiten algo de
información y generan archivos más pequeños, el
algoritmo LZ77 es un algoritmo de compresión sin
pérdida, es decir que no omiten información al
momento de la compresión.
- El algoritmo LZ77 se utiliza cuando la información a
comprimir es importante y crítica y no es necesario
perder información y aun así es considerado un
algoritmo de compresión eficiente.
- El funcionamiento del algoritmo es simple, se
encarga de encontrar secuencias repetidas, pero al
incluir al final de la búsqueda el siguiente carácter del
buffer a comprimir que no forma parte de la secuencia
repetida, que talvez no tiene repetición por lo cual se
ahorra tiempo tratando de encontrar coincidencias.
Bibliografía
1
0
1
1