pour chaque

publicité
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)
Conclusion
Performances
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
Division:
|a|aa|b|ab|bb|aaa|ba|aaaa|aab|aabb
index 0 1 2 3 4 5
6
7
8
9
10
Codage
0a|1a|0b|1b|3b|2a|3a| 6a | 2b | 9b
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
t = 1011
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
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).
Téléchargement