La Compression de Données Par Sébastien Vaie M2 ISV Paris V René Descartes
Introduction Cela consiste en la réduction des données pour permettre le transit via les réseaux d’informations Le coût et les limites de stockage ont forcé l’utilisation de la compression de données. Et donc pour compresser il faut coder l’information pour qu’elle prenne moins de place.
Introduction(2) On distingue 2 types de compression La compression sans perte Où les données ne doivent pas être altérées (texte, programme informatique,…). La compression avec perte Où la qualité des données est limitée par la perception humaine (Vidéo,Son,Image,….).
Introduction(3) Dans cet exposé nous allons traiter uniquement la compression sans perte. Pour cela nous allons étudier les 3 algorithmes les plus utilisés. RLE LZW Huffman
RLE introduction RLE ou run lenght encoding C’est un type d’algorithme relativement simple. Qui est utilisé pour compresser tout type de données sans tenir compte du type de données, même si le contenu des données conditionne l’efficacité de cet algorithme. En effet, il est basé sur la répétition de caractère et donc si les données à compresser sont peu ou pas répétées le taux de compression sera faible.
RLE Principe Recherche de caractère répété. Remplacement de ces caractères. Par un caractère spécifique marquant la compression. Nombres de répétitions. Et le caractère qui est répété. Sortie du fichier compressé. Remarque : imposer un seuil de répétition de minimum 3 si < 3 = augmentation de la taille
RLE Exemple de principe ex: AAAARRRRRROLLLLBBBBBUUTTTTTT On choisit comme caractère spécial : @ et comme seuil de répétition : 3 Après compression : @5A@6RO@4L@5BUU@6T gain : 11 caractères soit 38% Ce qui fait un gain relativement faible.
Algorithme ENTREE: fichier à compresser SORTIE: fichier compressé pour tous les bytes{ Tant que les bytes sont égaux{ compteur++; } Si compteur >n (seuil de redondance){ Remet le pointeur au début de la chaîne identique Remplace le premier byte par le marqueur de compression le 2ieme par Compteur passe un byte et efface jusqu’à n-3 Bytes Else { passe au byte suivant et relance la boucle
Décompression Pour la décompression c’est aussi simple que la compression l’algorithme a juste à lire le fichier dès qu’il rencontre la marque de compression il regarde le second et tant que le nombre est inférieur à celui-ci il met le troisième caractère et il passe au caractère suivant.
Variantes En effet, il existe plusieurs variantes du RLE et qui ont toutes leurs variations sur la méthode de recherche des répétitions sur le RLE de base la recherche de répétitions se fait ligne par ligne. Mais il est possible de modifier cela pour faire: En verticale colonne par colonne. En ligne mais 4 bytes par 4 bytes. Ou encore en Zig-Zag. Ce qui va permettre de mieux traiter certains types de données Exemple RLE-Colonne sur texte.
Variantes(2) Representation de variante de codage du RLE
Conclusion Performances Limitations Donc ce type d’algorithme va être très performant sur les types de données où il y a des redondances comme les images synthétiques ou encore certains programmes. Il n’a pas besoin de fichier annexe (dictionnaire) . Limitations Cette méthode est très peu applicable sur la compression de données type « texte » due à la faible présence de redondance. Si le texte ne compte pas de redondance l’espace pris sera le double donc la compression sera sous performante.
LZW introduction LZW ou Lempel-Ziv-Welch Cet algorithme fonctionne sur le même principe que le RLE à savoir supprimer les redondances. Il ne lit pas byte par byte mais plutôt « mot » par « mot ». Et donc pour cela il doit utiliser une bibliothèque de mot.
Principe Le LZW est une amélioration du code LZ78 et c’est une méthode adaptative. Il a pour principe de ne plus coder des bytes mais des groupes de bytes grâce à l’utilisation d’un dictionnaire qui permet au cours de la compression de ne plus stocker les mots mais juste leurs références vers le dictionnaire. Ce dictionnaire est créé de manière dynamique qui en fonction des mots qu’il rencontre. S’il ne sont pas encore apparus, il créé une nouvelle entrée dans le dictionnaire et contient préalablement les 256 caractères du code ASCII pour des données de type texte.
Principe (2) Le système va lire chaque caractère du fichier et s’il est dans le dictionnaire il sort le code correspondant sinon il créé une nouvelle entrée dans le dictionnaire avec un nouveau code. En passant au caractère suivant il va regarder si cette chaîne de caractères est présente dans le dictionnaire si oui elle ressort le code de cette chaîne sinon elle créée un nouvelle entrée avec la plus petite chaîne déjà connue contenue dans la chaîne analyser . donc il va former des nouvelles chaînes avec des chaînes déjà connues du dictionnaire en ajoutant à la fin le caractère non connu et cette nouvelle chaîne est à son tour entrée dans le dictionnaire avec une référence spécifique et pour être utilisée de la même manière.
Principe (3) Exemple Chaîne à encoder: /WED/WE/WEE/WEB/WET Caractère lu Code ressorti Nouveau code Nouvelle entrée Chaîne compressé ou encodé: /WED 256 257 256 260 261 257 B 260 T
Principe(4) Exemple 2 aaababbbaaabaaaaaaabaabb 0 1 2 3 4 5 6 7 8 9 10 0a|1a|0b|1b|3b|2a|3a| 6a | 2b | 9b Division: index Codage
Algorithme STRING = get input character WHILE there are still input characters DO CHARACTER = get input character IF STRING+CHARACTER is in the string table then STRING = STRING+character ELSE output the code for STRING add STRING+CHARACTER to the string table STRING = CHARACTER END of IF END of WHILE output the code for STRING
Explication L’algorithme prend le premier caractère et tant qu’il y a des caractères dans le fichier il va concaténer le premier et celui d’après et là il fait une vérification si le premier plus le second sont dans le dictionnaire, il la concatène avec le troisième et ainsi de suite. Et si cette chaîne n’est pas dans le dictionnaire il créé une nouvelle entrée dans celui si et lui donne un code. Et il ressort le code correspondant à la chaîne.
Décompression Le RLE a juste besoin de lire le fichier compressé pour la décompression. Alors que le LZW devrait avoir le dictionnaire pour la décompression. Mais ceci a été résolu grâce à l’incorporation de phrase minimale d’office dans le dictionnaire. Comme les entrées sont séquentielles à la décompression possibilité de reconstruire le dictionnaire.
Performances Il arrive à des taux de compression au plus bas de l’ordre du RLE (38%). Et en moyenne a presque 50% lus performent sur les fichiers de grande taille mais avec les modifications LMZW permet de traiter les fichiers plus petits avec la même performance. A le gros avantage de ne pas avoir besoin du dictionnaire pour la décompression.
Limitations Le problème de ce type d’algorithme est qu’il est peu performant sur les données de type image car il y a peu, dans les images, de répétitions de longue suite de pixels. Ce qui fait la force de ces algorithmes. Le deuxième problème est plus technique dû à la complexité au niveau programmation surtout au niveau des déplacements de pointeur sur les fichiers à compresser. Et dernière limitation est d’ordre légal puisque ces algorithmes sont l’objet de 2 brevets.
Variantes Les variantes du LSW s’intéressent principalement sur les points faibles de ce dernier. PKZIP Évite le problème de fichier de petite taille en permettant un redimensionnement dynamique de la taille de l’identifiant ressorti par le dictionnaire . Car si le fichier est petit des identifiants de plus petites tailles donnent un meilleur taux de compression. LMZW Il modifie la méthode d’entrée dans le dictionnaire. En effet, il ne créé pas de nouvelle phrase en concaténant une déjà existante avec un autre caractère mis avec une autre phrase. Cela complique le dictionnaire mais permet de gagner en performance,même sur les fichiers de petite taille.
Conclusion On peut dire que les algorithmes de LZ et de LZW sont de très bons algorithmes de compression pour les données de type texte ou encore binaires car il partent d’un taux de compression initiale proche de celui du RLE (38%) pour arriver à près de 50% de compression. Ils sont utilisés dans beaucoup d’outils de compression tels que PKzip ARJ etc… Ils sont également beaucoup plus performants sur des fichiers de grandes tailles. En effet, ils ont besoin d’un certain nombre de caractères pour bien remplir leurs dictionnaires. Cet algorithme est symétrique ce qui veut dire qu’il met autant de temps en compression qu’en décompression.
Huffman introduction Il a pour but de transformer les caractères en identifiant binaire ( suite de 0 et de 1). De manière à ce qu’aucun code ne soit le préfix d’un autre. Ex : 110 et 1101 ne peuvent pas être présents car problème de compréhension lors de la décompression. Pour se faire il va donc utiliser des arbres de Huffman pour créer les identifiants.
Principe Cet algorithme se base sur les fréquences d’apparition des caractères. Il va les stocker dans une table et construire l’arbre de codage à partir de cette table. Donc il va réduire le nombre de bytes occupés par les caractères dont la fréquence est élevée et augmenter celui dont elle est faible.
Principe(2) Pour la création de l’arbre Pour chaque caractère il créé un arbre (feuille) où est stocké sa fréquence d’apparition. Tant que le nombre d’arbres est supérieur à 1, il fusionne les deux arbres ayant la fréquence d’apparition la plus faible. Une fois l’arbre construit il associe aux branches de chaque nœud 1 si c’est une branche droite 0 sinon.
Principe(3) En partant de la racine on peut obtenir le code de chaque caractère. On a également l’assurance de l’unicité de chaque code grâce à cette méthode de construction. Le fait que ce soit un arbre binaire. on sait que chaque feuille a un chemin unique pour aller jusqu’à la racine. Don unicité du code de chaque caractère.
Principe(4) Exemple Table de fréquence et construction de l’arbre.
Principe(5) Résultat de la construction a = 0 z = 100 c = 1010 x = 110 b = 111 Texte à compresser : axabataaxbcbtaabxxaazazaa (24 caractères) 011001110101100110111101011110110011111011000100010000 (54 bits) 01100111-01011001-10111101-01111011-00111110-11000100-010000 (7 octets)
Algorithme {T est le texte} {F est une file de priorité} C caractère de A calculer l'alphabet A et les fréquences f F =Null ; pour chaque c є A faire F = F + CreerArbreFeuille(c; f(c))g), tant que F contient plus d'un arbre faire a =ExtraireLeMin(F), b =ExtraireLeMin(F), F = F + CreerArbre(a; b; freq(a) + freq(b))g), renvoyer (F), ExtraireLeMin(F) : renvoie à la structure de tas binaire
Explication Calculs de fréquence. Regroupement des arbres-feuilles. Si branche droite ou gauche allocation du code pour chaque caractère.
Décompression Pour la décompression il faut que le programme ait l’arbre de Huffman ou la table de fréquence afin de pouvoir le reconstruire. une fois l’arbre reconstruit, il obtient les codes correspondants à chaque caractère il suffit plus que de les remplacer.
Performances Il a des taux de compression proches de celui du RLE. Mais a le gros avantage de traiter aussi bien les données de type texte que les images photographiques. Pas basé sur les répétitions. Pas de problème de fréquence égale, le code de sortie différent mais compressions identiques.
Limitations Nécessité de fournir l’arbre ou la table de fréquence. Il peut donc arriver que la taille de table plus le fichier compressé soit plus imposant ou égal a celle du fichier non compressé donc compression inutile. Peu performant sur les fichiers de petites tailles. Très sensible à la perte d’un bit.
Variantes Variante principale se base la création dynamique de l’arbre. Création de l’arbre au fur et à mesure de la lecture du fichier. Variante adaptative. Codage sur plus d’un caractère complexité plus grande et très peu utilisé en pratique.
Huffman adaptatif Cette variante permet de ne plus avoir besoin de parcourir les données avant. Il créé l’arbre de Huffman à la volée. L’arbre sera donc vide à l’origine à l’exception de 2 symboles <NEW> et <EOF> avec comme poids de départ 1
Huffman adaptatif(2) Donc dès l’apparition d’un nouveau symbole il sera mis en <NEW>. Et si le symbole est déjà présent sa fréquence sera augmentée et il sera replacée à sa bonne place dans l’arbre. Comme ce sont des arbres équilibrés ils sont régis par des lois très strictes sur l’addition et la suppression de feuille. Ce qui permet de ne pas devoir reconstruire l’arbre mais juste de permuter les branches mises en jeux.
Huffman adaptatif(3) Exemple: Codage de BAN Insertion de B Insertion de A
Huffman adaptatif(4) Résultats Là, on obtient donc le codage désiré Il faut remarquer que lors de la construction de l’arbre le code des caractères change.
Hauffman adaptatif(5) Avec cette variante il n’est plus nécessaire de fournir la table de fréquence et donc le gain de compression est relativement important Mais cet algorithme étant généralement récursif il est plus lent que la version statique.
Conclusion On peut dire que ce type d’algorithme a de bonnes performances qu’ils sont adaptés à quasiment tous les types de données. Ils sont très sensibles à la perte de bytes et que le fait de devoir fournir la table de fréquence fait baisser énormément la performance. Chose qui est plus ou moins réglée avec la version adaptative.
Conclusion générale « les conseils du chef » La chose primordiale à savoir est quel type de donnéeq on veut compresser Algorithme Remarque RLE(faible) Compression moyenne Efficace pour les données a forte répétition LZW(bon) Bonne compression Efficace sur texte. Breveter Huffman(moyen) Bonne compression mais nécessité de fournir la table de fréquence Efficace sur tous types de données Forme adaptative très intéressante.
MERCI
Rappel sur les arbres binaire Propriétés Tel que les 2 sous arbres de tout nœud on une hauteur différente d’au plus 1. Construction La construction se fait par insertion sur un arbre vide Inser L’insertion se fait toujours en feuille et est suivi d’un rééquilibrage Rééquilibrage (rotation) Pas de délétion pour le codage de hufmann
Rotation Si l’arbre reste équilibré pas de rotation S’il penche a gauche rotation droite Décalage des nœud sur le chemin de l’insertion vers la droite. S’il penche a droite rotation gauche Décalage des noeud sur le chemin de l’insertion vers le gauche. Si l’insertion est du même coté sue le sous arbre simple rotation. Sinon double rotation en fonction du déséquilibre.
Algo de création d’arbre huffman L’algorithme Hu-Tucker est l’example d’un algorithme gourmand (greedy). Il est execute en temps (n log n).