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.