LZ77 en détail : comment fonctionne la compression par dictionnaire ?

Conclusion d'abord : LZ77 est un algorithme de compression par dictionnaire basé sur une fenêtre glissante, dont l'idée centrale est « utiliser les données historiques comme dictionnaire, et référencer en arrière lors de contenu répété ». Le codage produit des triplets (distance, length, next_char) : retour en arrière de distance caractères pour trouver une correspondance, longueur de correspondance length, suivi d'un caractère non correspondant next_char. Prenons les 11 caractères de « abracadabra » : après codage LZ77, seuls 5 triplets suffisent, soit une compression significative. LZ77 est un composant central de DEFLATE (ZIP/GZIP/PNG) et l'ancêtre commun d'algorithmes modernes tels que LZSS/LZMA/LZ4. Commençons par le principe de la fenêtre glissante, puis démontrons pas à pas le processus de codage.

Si vous n'êtes pas encore familier avec le principe du codage de Huffman, nous vous recommandons de lire d'abord Principe du codage de Huffman : pierre angulaire des algorithmes de compression.

I. Qu'est-ce que la compression par dictionnaire

Les algorithmes de compression se divisent en deux grandes familles : le codage statistique (comme le codage de Huffman) attribue des codes de longueur variable selon la fréquence des caractères ; la compression par dictionnaire remplace le contenu répété par des « références de pointeur ». LZ77 appartient à la famille de la compression par dictionnaire — il ne construit pas de table de dictionnaire à l'avance, mais utilise les données historiques déjà traitées comme dictionnaire implicite : lorsque du contenu répété est rencontré, un « pointeur de retour » référence la position où il est apparu précédemment.

Famille de compressionPrincipe centralAlgorithmes représentatifsAvantagesInconvénients
Codage statistiqueCodes de longueur variable selon la fréquenceHuffman, codage arithmétiqueProche de la borne d'entropiePeu adapté aux répétitions longue portée
Compression par dictionnaireRemplace le contenu répété par des référencesLZ77, LZW, LZMAExcellente pour les motifs répétitifsInefficace sur données aléatoires
Codage hybrideDictionnaire + statistique en deux phasesDEFLATE, ZSTDOptimal globalImplémentation plus complexe
Codage par transforméeTransformée en domaine fréquentiel puis quantificationDCT (JPEG), DWTCompression avec perte efficacePerte d'information

En pratique, les algorithmes de compression les plus populaires sont presque tous « hybrides » — LZ77 élimine d'abord les motifs répétitifs, puis Huffman applique une compression par fréquence sur les résidus. DEFLATE est la combinaison classique LZ77 + Huffman, largement utilisée par ZIP, GZIP et PNG.

II. Principe détaillé de l'algorithme LZ77

Le cœur de LZ77 est le mécanisme de fenêtre glissante. La fenêtre est divisée en deux parties : le tampon de recherche (données historiques déjà traitées) et le tampon d'anticipation (données futures à traiter). Lors du codage, on prend un segment du tampon d'anticipation, on recherche la plus longue correspondance dans le tampon de recherche — si une correspondance est trouvée, on produit un triplet ; sinon, on produit le caractère brut.

1. Structure de la fenêtre glissante

La taille de la fenêtre glissante détermine directement l'efficacité de la compression — plus la fenêtre est grande, plus on peut rechercher de données historiques en arrière, et plus la probabilité de correspondance est élevée. La taille de fenêtre varie considérablement selon les algorithmes.

AlgorithmeTampon de rechercheTampon d'anticipationLongueur max. de correspondanceScénario type
LZ77 originalQuelques KoDizaines d'octets16 octetsExemple pédagogique
DEFLATE32 Ko258 octets258 octetsZIP/GZIP/PNG
LZMA8 Mo (configurable)273 octets273 octetsArchivage 7z/xz
LZ464 KoSans limiteSans limiteCompression temps réel
ZSTD8 Mo (max 1 Go)Sans limiteSans limiteUsage moderne général

2. Format du codage par triplets

L'unité de sortie de LZ77 est le triplet (distance, length, next_char). La signification des trois champs est présentée dans le tableau ci-dessous.

ChampSignificationPlage de valeurs (DEFLATE)Bits de codageExemple
distanceDistance de retour (combien de caractères en arrière)1–3276815 bitsdistance=10 → 10 caractères en arrière
lengthLongueur de correspondance (combien de caractères consécutifs)3–2588 bitslength=5 → 5 caractères correspondants
next_charCaractère suivant la correspondance0–2558 bitsnext_char='d' → ASCII 100

L'astuce du triplet est qu'après une correspondance, un next_char supplémentaire est produit, garantissant que l'encodeur avance toujours d'au moins 1 caractère, sans jamais se bloquer. Si aucune correspondance n'est trouvée (length=0), distance et length sont tous deux à 0, et seul next_char est produit — ce qui revient à un stockage brut du caractère.

3. Stratégie de recherche de correspondance

La recherche de correspondance est le goulot d'étranglement de LZ77 — on prend un segment du tampon d'anticipation et on cherche la plus longue correspondance dans le tampon de recherche. La recherche par force brute a une complexité O(n×m) ; les implémentations réelles utilisent des tables de hachage ou des arbres de suffixes pour accélérer.

Stratégie de rechercheStructure de donnéesComplexité de rechercheEmpreinte mémoireApplication type
Force bruteAucuneO(n×m)AucuneExemple pédagogique
Chaîne de hachageTable de hachage + liste chaînéeO(n) en moyenneFaiblezlib (DEFLATE)
Seau de hachageTable de hachage + tableauO(1) en moyenneMoyenneLZ4
Arbre de suffixesArbre/tableau de suffixesO(n) pire casÉlevéeLZMA

III. Étude de cas : démonstration du codage de « abracadabra »

Codage complet de « abracadabra » (11 caractères) avec LZ77. État initial : tampon de recherche vide, tampon d'anticipation contenant toute la chaîne. On scanne position par position, en cherchant la plus longue correspondance dans les données historiques.

Texte original : a b r a c a d a b r a

Processus de codage :

ÉtapePosition couranteContenu d'anticipationRecherche dans le tamponTriplet de sortieExplication
1Position 1abracadabraVide, pas de correspondance(0, 0, 'a')Premier caractère, sortie directe
2Position 2bracadabra« a », pas de correspondance « b »(0, 0, 'b')Première occurrence, sortie directe
3Position 3racadabra« ab », pas de correspondance « r »(0, 0, 'r')Première occurrence, sortie directe
4Position 4acadabra« a » trouvé dans « abr »(0, 0, 'a')« a » présent mais suite non correspondante
5Position 5cadabraPas de « c » dans « abra »(0, 0, 'c')Première occurrence, sortie directe
6Position 6adabra« a » trouvé dans « abrac »(0, 0, 'a')« a » correspondant mais suite non correspondante
7Position 7dabraPas de « d » dans « abraca »(0, 0, 'd')Première occurrence, sortie directe
8Position 8abraRetour 7, correspondance « abra »(7, 4, end)Correspondance « abra » sur 4 caractères

Comparaison d'efficacité de codage :

Méthode de codageNombre d'unités de sortieBits par unitéBits totauxÉconomie vs original
ASCII original11 caractères888— (référence)
LZ77 (sans optimisation de correspondance)8 triplets31 (moyenne)248-182 % (expansion)
LZ77 (optimisation des bits de marquage)8 unités12 (moyenne)96-9 % (légère expansion)
LZ77+Huffman8 unités4,5 (moyenne)3659 %

Analyse des résultats : le LZ77 pur peut provoquer une expansion sur des chaînes courtes (un triplet occupe plus d'espace qu'un caractère brut), c'est pourquoi LZ77 est généralement combiné au codage de Huffman — DEFLATE est LZ77 + Huffman. Dans le cas de « abracadabra », la correspondance à la position 8, « abra » (distance=7, length=4), est le point de compression clé : 4 caractères représentés par un seul triplet. Pour des textes plus longs avec davantage de motifs répétitifs (comme les fichiers de code ou les journaux), l'efficacité de compression de LZ77 s'améliore considérablement.

IV. Variantes de LZ77 et évolution moderne

Depuis sa proposition en 1977, LZ77 a donné naissance à de nombreuses variantes, chacune optimisant une dimension pour un scénario spécifique. Le tableau ci-dessous compare les principaux membres de la famille LZ77.

AlgorithmeAmélioration cléTaux de compressionVitesse de compressionVitesse de décompressionApplication type
LZ77 (original)Codage par tripletsFaibleLentMoyennePédagogie
LZSSBits de marquage pour distinguer correspondances/littérauxMoyenneMoyenneRapideSystèmes anciens
DEFLATELZSS + Huffman en deux phasesMoyenne à élevéeMoyenneRapideZIP/GZIP/PNG
LZMAGrande fenêtre + codage par intervalles + analyse optimaleÉlevéeLentMoyenneArchivage 7z/xz
LZ4Sacrifie le taux de compression pour une vitesse extrêmeFaibleTrès rapideTrès rapide (4 Go/s)Temps réel / noyau
LZWDictionnaire explicite (pas de fenêtre glissante)MoyenneRapideRapideGIF/TIFF
ZSTDVariante LZ77 + FSE + dictionnaire prédéfiniÉlevéeRapideTrès rapideUsage moderne général

En termes d'évolution, les algorithmes modernes (ZSTD, brotli) maintiennent un taux de compression élevé tout en améliorant considérablement la vitesse, remplaçant progressivement DEFLATE comme nouvelle norme. Mais l'idée fondamentale de LZ77 — la référence par dictionnaire à fenêtre glissante — reste inchangée, et toutes les variantes reposent sur cette base.

ScénarioAlgorithme recommandéRaisonTaux de compression de référence
Archivage de fichiersLZMA (xz)Taux de compression le plus élevé, vitesse non prioritaire70 %–85 %
Compression généraleZSTDBon équilibre taux de compression / vitesse60 %–80 %
Transmission temps réelLZ4Décompression à 4 Go/s, latence très faible50 %–65 %
Transmission WebDEFLATE/GZIPMeilleure compatibilité, tous navigateurs50 %–70 %
Format d'imageDEFLATE (PNG)Compression sans perte, adapté aux graphiques50 %–75 %
Données en mémoireLZ4Faible utilisation CPU, adapté à la compression haute fréquence50 %–65 %

Pour l'application spécifique de DEFLATE dans le format PNG, consultez Principe de compression PNG en détail. Pour la distinction entre compression sans perte et compression avec perte, consultez Compression sans perte vs compression avec perte : différences essentielles.

V. Questions fréquentes (FAQ)

Q1 : Qu'est-ce que l'algorithme LZ77 ?

LZ77 est un algorithme de compression par dictionnaire basé sur une fenêtre glissante, proposé par Lempel et Ziv en 1977. L'idée centrale est : utiliser les données déjà traitées comme dictionnaire, et lorsque du contenu répété est rencontré, remplacer les données originales par un triplet (distance, length, next_char), où distance représente la distance de retour en arrière, length la longueur de correspondance, et next_char le caractère suivant la correspondance. LZ77 est un composant central de DEFLATE (ZIP/GZIP/PNG) et l'ancêtre d'algorithmes modernes tels que LZSS/LZMA/LZ4.

Q2 : Que signifie la fenêtre glissante de LZ77 ?

La fenêtre glissante est la structure de données centrale de LZ77, divisée en tampon de recherche (données historiques déjà traitées) et tampon d'anticipation (données futures à traiter). Lors du codage, on prend un segment du tampon d'anticipation et on recherche la plus longue correspondance dans le tampon de recherche. La taille de fenêtre typique est de 32 Ko (standard DEFLATE) ; plus la fenêtre est grande, plus la probabilité de correspondance est élevée, mais plus l'empreinte mémoire est importante. La taille de la fenêtre détermine la limite supérieure de la distance de retour en arrière.

Q3 : Quelle est la différence entre LZ77 et LZ78 ?

LZ77 utilise une fenêtre glissante comme dictionnaire implicite, le contenu correspondant référence directement les données historiques sans stocker de dictionnaire séparé ; LZ78 utilise un dictionnaire explicite, stockant les chaînes déjà vues sous forme d'entrées numérotées, et produit des indices de dictionnaire lors du codage. LZ77 est mieux adapté aux données avec des répétitions locales (comme le texte), LZ78 aux données avec des répétitions globales. En pratique, les descendants de LZ77 (DEFLATE/LZMA/LZ4) sont bien plus répandus que ceux de LZ78 (LZW).

Q4 : Lequel de LZ77, LZMA, LZ4 a le meilleur taux de compression ?

Classement par taux de compression : LZMA > LZ77 (DEFLATE) > LZ4. LZMA utilise une fenêtre plus grande (8 Mo par défaut), un algorithme de correspondance optimisé et un codage par intervalles, offrant le meilleur taux de compression mais la vitesse la plus lente ; DEFLATE avec fenêtre de 32 Ko + Huffman offre un taux de compression et une vitesse moyens ; LZ4 sacrifie le taux de compression pour une vitesse extrême, avec le taux le plus bas mais une vitesse de décompression atteignant 4 Go/s. Le choix dépend du scénario : archivage → LZMA, usage général → DEFLATE/ZSTD, temps réel → LZ4.

Résumé

LZ77 est l'ancêtre des algorithmes de compression par dictionnaire. Son principe central est « fenêtre glissante + référence par triplet » : utiliser les données historiques comme dictionnaire implicite, et produire un triplet (distance, length, next_char) lors de contenu répété. Le LZ77 pur peut provoquer une expansion sur des textes courts, mais combiné au codage de Huffman (DEFLATE), il devient la solution de compression standard de ZIP/GZIP/PNG. La variante moderne LZMA vise un taux de compression extrême, LZ4 vise une vitesse extrême, et ZSTD équilibre les deux.

Trois points clés pour comprendre LZ77 : premièrement, la fenêtre glissante détermine la portée de correspondance (DEFLATE 32 Ko, LZMA 8 Mo) ; deuxièmement, le triplet est l'unité de codage de base (retour en arrière + longueur + caractère suivant) ; troisièmement, la stratégie de recherche de correspondance détermine les performances (chaîne de hachage la plus rapide, arbre de suffixes le plus optimal). Le codage hybride LZ77 + Huffman est le standard d'or de la compression sans perte moderne.

Besoin de compresser des fichiers ? Essayez SmartSlim

Construit sur un moteur de compression Rust auto-développé, prenant en charge 10 catégories et plus de 40 formats, dont PDF, images, vidéo, Office et OFD, avec une compression locale qui garde vos données sur place.