Algorithme de compression. Le codage de Huffman est un

publicité
Algorithme de compression.
Le codage de Huffman est un algorithme de compression qui fut mis au point en 1952 par
David Huffman.
Il s’agit d’un algorithme qui a pour objectif de compresser les fichiers sans perte (le résultat
du fichier décompressé doit être strictement équivalent au résultat du fichier avant la
compression).
Constat : Dans la plupart des fichiers classiques, chaque caractère est stocké sur le même
nombre d'octet : Par exemple, dans un texte écrit en caractère Ascii chaque caractère est codé
sur un Octet. Dans une image (ou une vidéo) non compressé, chaque pixel est codé par un
nombre d'octet qui dépend du nombre de couler autorisé. Dans un fichier construit «
normalement »(Un texte tapé par un utilisateur, une photo réel...), il y a des caractères
récurrents et des caractères rares. Idée : L'idée est donc de coder sur un plus petit nombre de
bit les caractères les plus courant.
Problème :
Si on code les caractères avec des tailles différentes, comment au décodage, savoir quand est
ce qu'on a lu un caractère complet? Comment choisir le nombre de bit de codage de chaque
lettre.
Idée de Huffman (version semi adaptative) : Commencer par parcourir le fichier, faire la liste
des caractères rencontrés en comptant leur nombre d'occurrence.
Trier par nombre d’occurrences croissantes et construire ensuite un arbre binaire en suivant la
logique suivante.
Chaque caractère représentera une feuille, et le « poids » de cette feuille correspond au
nombre d'occurrence de ce caractère. Chaque nœud interne aura pour poids la somme des
poids de ses fils. On construit ensuite l'arbre de cette manière : A chaque étape on sélectionne
les deux nœuds (nœuds internes ou feuilles) qui n'ont pas encore de père et qui ont le plus
faible poids( plus faible fréquence). On crée un nœud qui sera père des deux éléments et dont
le poids sera égal à la somme du poids des deux fils.. Le processus est répété sur l’ensemble
des caractères jusqu'à qu’il ne reste plus qu’un seul élément parent formant la racine de
l’arbre.
Cette construction d'arbre résoud les deux problèmes : Un bit représente une descente dans
l'arbre : 0 pour fil gauche et 1 pour fil droit. Tant qu'on est sur des nœuds internes, il faut
continuer de descendre dans l'arbre jusqu'a arriver sur une feuille. Ainsi, on sait toujours à
quel moment on a fini de lire un caractère, malgré la différence de codage entre les caractères.
Lorsque l'arbre se construit, les caractères les plus courant se trouvent forcement plus haut et
se codent donc avec un nombre plus réduit de bit. On peut même démontrer que ce codage est
le meilleur possible pour un codage par symbole.
Pour décoder il suffit de redescendre et de noter les chemins parcourus pour arriver jusqu’aux
feuilles et ainsi on obtient le caractère correspondant au code de Huffman. Une caractéristique
essentielle du codage de Huffman est qu’il n’utilise pas de séparateur entre deux symboles.
Chaque symbole est décodable de manière unique grâce à une technique de préfixe, c'est-àdire si aucun mot du code n'est le préfixe d'un autre mot du code (par exemple 01 étant préfixe
de 0111, ces deux mots ne peuvent appartenir à un code préfixe).
Voici un exemple avec le mot « abracadabra » :
Fréquences :
a = 5, b = 2, c = 1, d = 1, r = 2
Étape 1 : c1
d1
Étape 2 : b2
b2
r2
r2
2
c1
Étape 3 :
c1
Étape 4 :
2
(On joint c et d)
a5
(On joint b et r)
a5
(On joint les 2 premiers)
d1
4
d1
a5
b2
r2
a5
(Reste à joindre les 2 restants)
6
4
2
c1
Étape 5 :
d1
b2
r2
11
a5
6
2
c1
4
d1
b2
r2
Implémentation de Huffman (version semi adaptative) :
I : Compression
1. : Ouverture d'un fichier.
Le programme doit éventuellement définir la taille de codage du caractère dans le fichier ou le
demander à l'utilisateur, ou alors, définir par défaut une taille de 8 bit par caractère.
2 : Comptage du nombre de caractères.
Le programme doit parcourir le document et compter le nombre d'occurrence de chaque
caractère puis les trier par ordre croissant de fréquence.
3 : Construction de l'arbre.
Le programme doit construire un arbre selon la méthode décrite plus haut.
II : Écriture du fichier compressé :
1. : Écriture de l'en tête :
Le programme doit écrire les éléments important (taille d'un caractère, taille de l'arbre....)
2 : Ecriture de l'arbre :
Le programme doit écrire l'arbre de manière claier de façon à être décodable.
3 : Ecriture du corps du texte.
Le programme doit écrire le texte codé en fonction de l'arbre.
III : Décompression :
1. : Ouverture du fichier compressé :
Lecture de l'en tête, de l'arbre et du texte compressé.
2 : Création du texte décompressé. 3 : Écriture dans un fichier.
Téléchargement