Este documento introduce los algoritmos de compresión LZ77 y sus variantes. LZ77 utiliza parte de la secuencia de entrada previa como un diccionario dinámico y codifica los datos mediante referencias a coincidencias en el diccionario junto con los siguientes caracteres no coincidentes, logrando tasas de compresión altas. Se describen mejoras como LZSS, LZR, LZB y LZH que optimizan aún más la compresión.
4. INTRODUCCIÓN
• La compresión de datos hasta finales de los 70 se dirigió principalmente a crear
mejores metodologías para la codificación de Huffman.
• Un método innovador y radicalmente diferente fue introducido en 1977 por
Abraham Lempel y Jacob Ziv.
• Esta técnica (llamada Lempel-Ziv) consiste en realidad en dos algoritmos
considerablemente diferentes, LZ77 y LZ78.
LZHLZBLZSSLZRLZ77
Variants
LZFGLZJLZMWLZTLZCLZWLZ78
Variants
6. INTRODUCCIÓN
• El diccionario contiene una lista de cadenas de símbolos y puede ser estático o
dinámico (adaptativo).
• Diccionario estático - permanente, a veces permitiendo la adición de string pero
no hay eliminaciones-
• Diccionario dinámico: contiene cadenas que se han encontrado previamente en
el flujo de entrada, permitiendo adiciones y supresiones de cadenas a medida
que se lee la nueva entrada.
• Los algoritmos de LZ se usan en el "DICCIONARIO ADAPTATIVO"
• El diccionario se está construyendo en una sola pasada, mientras que al mismo
tiempo la codificación se lleva a cabo.
• Reescribe continuamente el diccionario para un archivo, desechando los
patrones que previamente incluido y añadiendo nuevos cuando sea necesario.
7. LZ77
Utiliza parte de la
secuencia de entrada
previa a la actual
como diccionario.
Para la entrada utiliza
un buffer (memoria)
intermedia llamada
ventana.
Desplaza los datos
introducidos de
derecha a izquierda a
medida que codifica.
DEZLIZAMIENTO DE VENTANA
BUFFER DE BÚSQUEDA BÚFFER DE PREANÁLISIS
8. LZ77: VENTANA DESLIZANTE LEMPEL-
ZIV
a a c a a c a b c a b a b a c
Diccionario
(previamente codificado)
Lookahead
Buffer
Cursor
Las "ventanas" del diccionario y del buffer tienen una longitud fija y se
deslizan con el cursor.
En cada iteración:
• Salida (p, l, c)
• p: posición relativa de la coincidencia mas larga en el diccionario.
• l: longitud de la coincidencia mas larga.
• c: siguiente carácter en la memoria intermedia mas allá de la
coincidencia mas larga.
• Desplazar la ventana en una posición
9. CODIFICACIÓN LZ77
1 2 3 4 5 6 7 8 1 2 3 4 5 6 Output
a b r a c a 0,0,a
a b r a c a d 0,0,b
a b r a c a d a 0,0,r
a b r a c a d a b 3,1,c
a b r a c a d a b r a 2,1,d
a b r a c a d a b r a r r 7,4,r
c a d a b r a r r a y 3,2,y
STRING: abracadabrarray
TAMAÑO DE VENTANA: 14
BUFFER: 6
Buffer de Búsqueda Buffer de Preanálisis
11. CARACTERÍSTICAS LZ77
Para el LZ77, tenemos:
• Esquema de adaptación, sin conocimiento previo
• Aproxima a las estadísticas de la fuente
• Asume que los patrones recurrentes se acercan unos a otros
Posibles mejoras
• Codificación de bits variables: PKZip, zip, gzip, ..., etc., utiliza uncodificador de
longitud variable para codificar <o, 1, c>
• Tamaño del búfer variable: un búfer más grande requiere búsquedas más rápidas
• Eliminación de <0, 0, C(x)
• La LZSS envía un bit de bandera para señalar si el siguiente "token" es un<o,1>
par o la palabra clave de un símbolo
12. MEJORAS
• LZR
La modificación de Lempel - Ziv - Renau permite que los punteros hagan referencia a cualquier
cosa que ha sido codificado sin estar limitado por la duración de la búsqueda.
• LZSS
La modificación popular de Storer y Szymanski (1982) que se utiliza para la inclusión obligatoria
del siguiente símbolo no coincidente en cada palabra clave conducirá a situaciones en las que el
símbolo se codificará explícitamente a pesar de la posibilidad de que sea parte del próximo
partido.
• LZB
utiliza un elaborado esquema para codificar las referencias y las longitudes con varios tamaños
• LZH
La implementación del LZH emplea la codificación de Huffman para comprimir los punteros.
13. LZARI
• Compresión algebraica adaptativa para codificar caracteres.
• Compresión algebraica estática para codificar el campo posición.