Compresser en pratique

LZ77 : exploiter les répétitions

Une autre source de redondance

Huffman exploite la fréquence des symboles. Mais les vrais fichiers contiennent une autre redondance : des répétitions de séquences. Dans un texte, des mots reviennent ; dans une image, des motifs se répètent. L'algorithme LZ77 (Lempel-Ziv, 1977) exploite précisément ces répétitions, et c'est le cœur de formats comme ZIP, PNG ou gzip.

L'idée : remplacer une répétition par une référence

Quand une séquence a déjà été rencontrée récemment, au lieu de la réécrire, LZ77 insère une référence : « recopie tant de caractères, situés tant de positions en arrière ». Une longue répétition est ainsi remplacée par un petit couple (distance, longueur).

Fenetre glissante sur le texte "abcabcabc" :

[               ] abcabcabc      (fenetre vide au depart)
[a              ] bcabcabc       (on ecrit 'a' tel quel)
[ab             ] cabcabc        (on ecrit 'b')
[abc            ] abcabc         (on ecrit 'c')
[abc  ] abc <---- abc            ('abcabc' deja vu ! -> reference)

     -> on remplace la suite "abcabc" par (distance=3, longueur=6)
(distance = de combien reculer, longueur = combien de caracteres recopier)

La fenêtre glissante

LZ77 ne cherche pas les répétitions dans tout le fichier (trop coûteux), mais dans une fenêtre des caractères récents qui glisse au fil du texte. Une fenêtre plus grande trouve des répétitions plus lointaines (meilleure compression) mais coûte plus de mémoire et de temps de recherche.

Le meilleur des deux mondes

En pratique, les formats modernes combinent les deux approches : LZ77 remplace d'abord les répétitions par des références, puis Huffman code le résultat. C'est exactement ce que fait DEFLATE, l'algorithme derrière gzip et ZIP : deux idées complémentaires qui attaquent deux redondances différentes.

Piège classique

LZ77 ne gagne rien sur des données sans répétition, comme un fichier déjà compressé ou des données aléatoires : il n'y a alors aucune séquence à référencer. Pire, encoder des références inutiles peut légèrement grossir le fichier. Chaque algorithme cible une redondance précise ; là où elle est absente, il ne fait pas de miracle.