Lempel-Ziv-Welch - Définition

Source: Wikipédia sous licence CC-BY-SA 3.0.
La liste des auteurs de cet article est disponible ici.

Introduction

LZW (pour Lempel-Ziv-Welch) est un algorithme de compression de données sans perte. Il s'agit d'une amélioration de l'algorithme LZ78 inventé par Abraham Lempel et Jacob Ziv en 1978. LZW fut créé en 1984 par Terry Welch, d'où son nom.

L'algorithme LZW avait été breveté par la société Unisys. Il a été utilisé dans les modems (norme V42 bis) et est encore utilisé dans les formats d'image numérique GIF ou TIFF et les fichiers audio MOD.

L’algorithme a été conçu de manière à être rapide à implémenter, mais n’est la plupart du temps pas optimal car il effectue une analyse limitée des données à compresser.

Description de l'algorithme

L’algorithme de compression construit une table de traduction de chaînes de caractères à partir du texte à compresser. Cette table relie des codes de taille fixée (généralement 12-bit) aux chaines de caractères. La table est initialisée avec tous les caractères (256 entrées dans le cas de caractères codés sur 8 bits). À mesure que le compresseur examine le texte, il ajoute chaque chaîne de 2 caractères dans la table en tant que concaténation de code et de caractères, avec le code correspondant au premier caractère de la chaîne. En même temps qu’il enregistre ces chaines, le premier caractère est envoyé en sortie. Chaque fois qu’une chaîne déjà rencontrée est lue, la chaîne la plus longue déjà rencontrée est déterminée, et le code correspondant à cette chaîne avec le caractère concaténé (le caractère suivant du flux entrant) est enregistré dans la table. Le code pour la partie la plus longue de la chaîne de caractère rencontré est envoyé en sortie et le dernier caractère est utilisé comme base pour la chaîne suivante.

L’algorithme de décompression a seulement besoin du texte compressé en entrée. En effet il reconstruit une table chaine de caractères / code identique à mesure qu’il régénère le texte original. Cependant un cas inhabituel apparaît chaque fois que la séquence caractère/chaîne/caractère/chaîne/caractère (avec le même caractère pour chaque caractère et la même chaîne de caractère pour chaque chaîne) est rencontré en entrée et que caractère/chaîne est déjà présent dans la table. Quand l’algorithme de décompression lit le code pour caractère/chaîne/caractère, il ne peut pas le traiter car il n’a pas encore stocké ce code dans la table. Ce cas particulier peut être géré car le programme de décompression sait que le caractère supplémentaire est le précédent caractère rencontré.

Exemple

Compression

La table suivante montre le résultat de l'exécution de l'algorithme de compression sur la chaîne suivante :

         TOBEORNOTTOBEORTOBEORNOT      

On suppose qu'on utilise un code ASCII de 256 caractères (8-bits) comme dictionnaire de base. La longueur de cette chaîne est de 24 caractères. Elle nécessite donc 24 * 8 = 192 bits d'espace de stockage.

c w wc sortie dictionnaire
T T
O T TO T TO = <256>
B O OB O OB = <257>
E B BE B BE = <258>
O E EO E EO = <259>
R O OR O OR = <260>
N R RN R RN = <261>
O N NO N NO = <262>
T O OT O OT = <263>
T T TT T TT = <264>
O T TO
B TO TOB <256> TOB = <265>
E B BE
O BE BEO <258> BEO = <266>
R O OR
T OR ORT <260> ORT = <267>
O T TO
B TO TOB
E TOB TOBE <265> TOBE = <268>
O E EO
R EO EOR <259> EOR = <269>
N R RN
O RN RNO <261> RNO = <270>
T O OT
OT <263>

Après la compression, nous obtenons une séquence de codes de 9 bits sur la sortie :

         TOBEORNOT<256><258><260><265><259><261><263>      

Elle nécessite 16 × 9 = 144 bits d'espace de stockage.

Décompression

Le résultat de l'algorithme de décompression, sur la séquence compressée de codes de 9 bits, est présenté dans ce tableau :

k w entry w+entry[0] sortie dictionnaire
T T T
O T O TO O TO = <256>
B O B OB B OB = <257>
E B E BE E BE = <258>
O E O EO O EO = <259>
R O R OR R OR = <260>
N R N RN N RN = <261>
O N O NO O NO = <262>
T O T OT T OT = <263>
<256> T TO TT TO TT = <264>
<258> TO BE TOB BE TOB = <265>
<260> BE OR BEO OR BEO = <266>
<265> OR TOB ORT TOB ORT = <267>
<259> TOB EO TOBE EO TOBE = <268>
<261> EO RN EOR RN EOR = <269>
<263> RN OT RNO OT RNO = <270>
Page générée en 0.075 seconde(s) - site hébergé chez Contabo
Ce site fait l'objet d'une déclaration à la CNIL sous le numéro de dossier 1037632
A propos - Informations légales
Version anglaise | Version allemande | Version espagnole | Version portugaise