Le code de Huffman 1 est une mthode












































- Slides: 44
Le code de Huffman: ¢ ¢ ¢ 1 est une méthode de compression statistique de données qui permet de réduire la longueur du codage d'un alphabet. Le code de Huffman (1952) est un code de longueur variable optimal, c'est-à-dire tel que la longueur moyenne d'un texte codé soit minimale. On observe ainsi des réductions de taille de l'ordre de 20 à 90%. Dr. Nejib Zaguia 12/23/2021
¢ ¢ ¢ Codes de longueur fixe: 000 Chaque caractères est codé avec 001 le même nombre de bits. Pour C caractères on a besoin de 010 011 l log C bits A 100 T 101 es 110 nl 2 ¢ Simple, et facile a manipuler TEST l 100001011100 l 2 Dr. Nejib Zaguia E I S 12/23/2021
¢ Exemple 1 0 0 0 1 0 A 1 E 000 001 3 1 0 I 1 S 010 011 0 T 1 es 100 101 Dr. Nejib Zaguia 1 0 nl 110 000 A 001 E 010 I 011 S 100 T 101 es 110 nl 12/23/2021
¢ Exemple 2 longueur variable 0 0 1 E 000 001 4 0 I A 001 E 010 I nl 011 S 11 100 T 101 es 11 nl 1 0 A 000 1 S 010 011 0 T 1 es 100 101 Dr. Nejib Zaguia 1 12/23/2021
¢ Exemple 3 0 0 0 1 1 I 0001 0 1 0 1 1 A 01 E 10 T 11 es 001 S nl 000001 Symbol Code A 01 E 10 I 0001 S 00000 T 11 es 001 nl 00001 TEST = 11100000011 5 Dr. Nejib Zaguia 12/23/2021
CSI 3505 Algorithmes Voraces Caractère Fréquence Longueur fixe Code Total Bits Longueur variable Code Total Bits A 41 000 123 01 82 E 35 001 105 10 70 I 12 010 36 0001 48 S 4 011 12 00000 20 T 32 100 96 11 64 es 18 101 54 001 54 nl 5 110 15 00001 25 6 441 Dr. Nejib Zaguia 363 12/23/2021
¢ Pour qu’un codage soit sans ambiguïté il doit avoir la propriété de préfixe: une séquence binaire ne peut jamais être à la fois représentative d'un élément codé et constituer le début du code d'un autre élément. 7 Dr. Nejib Zaguia 12/23/2021
11010000111 = 11 01 00 001 11 Ou 11 01 00001 11 0 1 0 1 A 01 E 10 0 1 1 I 0001 S nl 000001 8 P es 001 Préfixe!! Dr. Nejib Zaguia Symbole Code A 01 1 E 10 T 11 I 0001 S 00000 T 11 es 001 nl 00001 P 00 12/23/2021
Cette caractéristique préfixe du codage permet une codification à l'aide d'une structure d'arbre binaire. l'arbre de décodage du code 9 l Les caractères sont placés uniquement sur les feuilles de l’arbre. l Tout nœud interne (c'est-à-dire qui n'est pas une feuille) a deux fils non vides. Dr. Nejib Zaguia 12/23/2021
CSI 3505 Algorithmes Problème: Voraces ¢ Input l ¢ Une liste de caractères et leurs fréquences. Output l l'arbre de décodage du code avec un Coût total minimal • Coût total = • ls = nombre de bits du code pour le caractère s • fs = fréquences du caractère s 10 Dr. Nejib Zaguia 12/23/2021
CSI 3505 Algorithmes Voraces ¢ Algorithme de Huffman (1952) un code optimal de longueur variable Huffman propose de recoder les données qui ont une occurrence très faible sur une longueur binaire supérieure à la moyenne, et recoder les données très fréquente sur une longueur binaire très courte. 11 Dr. Nejib Zaguia 12/23/2021
¢ L'algorithme opère sur une forêt. Ceux-ci sont des arbres étiquetés complets: tout noeud interne (c'est-à-dire qui n'est pas une feuille) a deux fils non-vides. l La forêt initiale est formée d'un arbre à un noeud pour chaque caractère du langage-source, dont l'étiquette est la fréquence (ou probabilité) de ce caractère. l La forêt finale est formée d'un unique arbre, qui est l'arbre de décodage du code. ¢ L'algorithme est de type vorace «glouton» : il choisit à chaque étape les deux arbres d'étiquettes minimales, soit x et y, et les remplace par l'arbre formé de x et y et ayant comme étiquette la somme de l'étiquette de x et de l'étiquette de y. 12 Dr. Nejib Zaguia 12/23/2021
l 13 Le code d'un caractère est alors déterminé en suivant le chemin depuis la racine de l'arbre jusqu'à la feuille associée à ce caractère en concaténant successivement un 0 ou un 1 selon que la branche suivie est à gauche ou à droite. Dr. Nejib Zaguia 12/23/2021
Example: Supposons que les lettres a coder ont les fréquences suivantes: 14 32 25 12 4 30 18 5 A E I S T P L Dr. Nejib Zaguia 12/23/2021
La premiere chose: Trier par ordre de fréquence 4 5 12 18 25 30 32 S L I P E T A Mettre en ordre: mergesort O(n log n) 15 Dr. Nejib Zaguia 12/23/2021
9 T 1 16 4 5 12 18 25 30 32 S L I P E T A Choisir les deux fréquence les moins élevées et les utiliser pour fabriquer un arbre Dr. Nejib Zaguia 12/23/2021
S 9 12 18 25 30 32 T 1 I P E T A L Insérer dans liste ordonée: -O(log(n)) pour trouver endroit l’index d’insertion - + whatever pour 21 insérer (dépend de l’implémentation de la liste) T 2 Réinsérer dans la liste d’arbres ordonnée 17 Dr. Nejib Zaguia 12/23/2021
18 25 30 32 P E T A 21 T 2 T 1 S 18 L I Dr. Nejib Zaguia 12/23/2021
25 30 32 39 E T A T 3 T 2 T 1 S P I 55 T 4 L 19 Dr. Nejib Zaguia 12/23/2021
55 126 T 4 E T T 5 T 3 T 2 T 1 S 71 T 6 A P I L 20 Dr. Nejib Zaguia 12/23/2021
Codage Symbol 126 0 T 6 T 5 0 1 T 3 A 0 1 T 2 0 T 1 0 S 21 1 1 0 Code 1 A 01 T 4 E 10 I 0001 S 00000 T 11 P 001 L 00001 E P I L Dr. Nejib Zaguia 1 T 12/23/2021
A E T A P I S T E P I L S L Ne fait aucune différence 22 Dr. Nejib Zaguia 12/23/2021
Maintenant, il faut implémenter l’algo aussi efficacement que possible: 23 Dr. Nejib Zaguia 12/23/2021
Huffman (C){ Q = C mis dans une structure ordonnée while(Q. size( ) > 1){ x = Extraire-Minimum (Q) y = Extraire-Minimum (Q) fabriquer z à partir de x et y f[z] = f[x] + f[y] Insérer z dans Q } Retourner l’arbre fabriqué à partir du seul élt de Q } 24 Dr. Nejib Zaguia 12/23/2021
Ca se résume à implémenter ces trucs là aussi efficacement que possible: … Q = C mis dans une structure ordonnée … x = Extraire-Minimum (Q) y = Extraire-Minimum (Q) fabriquer z à partir de x et y … Insérer z dans Q 25 Dr. Nejib Zaguia 12/23/2021
fabriquer z à partir de x et y class arbre. De. Char{ char lettre; int Fréquence const arbre. De. Char* Gauche const arbre. De. Char* Droit 39 T 3 21 public: boolean est. Feuille() { return Gauche==Droit==NULL}; arbre. De. Char(char a, int f): Gauche(NULL), Droit(Null), Frequence(f) {lettre=a; }; T 1 S T 2 P 18 I L arbre. De. Char( const arbre. De. Char& d, const arbre. De. Char& g): lettre((char)0), Frequence(d. Frequence + g. frequence), Droit(&d), Gauche(&g){ } } 26 Dr. Nejib Zaguia 12/23/2021
A faire en classe: Compléter class arbre. De. Char 27 Dr. Nejib Zaguia 12/23/2021
Fabriquer une structure dans laquelle on peut: - Retirer des arbre. De. Char par ordre de fréquence aussi efficacement que possible - Insérer de nouveaux arbre. De. Char aussi facilement que possible. (Ca éliminent tableaux (pourquoi ? )) 28 Dr. Nejib Zaguia 12/23/2021
Comme on retire de manière inversement proportionel à la fréquence, on peut se servir de la variable int Fréquence pour minimiser nos opération de base. 29 Dr. Nejib Zaguia 12/23/2021
Utilisons un arbre binaire dont les noeuds sont… Des objets de type arbre. De. Char Et qu’on remplira toujours de doite à gauche et de manière à le garder aussi feuillu que possible 30 Dr. Nejib Zaguia 12/23/2021
Sauf que on va jouer sur la structure de l’arbre pour faciliter nos opération. Requirements 31 Dr. Nejib Zaguia 12/23/2021
- Il faut que ca soit aussi facile que possible de retirer les nœud contenant des arbre. De. Char à plus basse fréquence. (et donc de les trouver) - Il faut que ca soit aussi facile que possible d’insérer de nouveaux nœuds. 32 Dr. Nejib Zaguia 12/23/2021
39 T 3 T 2 55 T 1 T 4 E S P I 32 A L T On va nécéssairement cher à partir de la racine, donc on veut que les nœud à fréquence plus basses soient plus proche de la racine. 33 Dr. Nejib Zaguia 12/23/2021
32 A 39 T 3 T 2 T 1 S T 4 P E I L 45 67 . . . 56 . 55 67 34 . T 56 65 . . 78 88 95 . . Dr. Nejib Zaguia . 12/23/2021
L’arbre. De. Char qui a la plus basse fréquence est mis à la racine. Il est donc très facile a extraire 32 39 La racine de cet arbre à A on a plus basse fréquence que Maintenant, 2 sous-arbres tous ces sous arbres T 3 T 2 T 1 S 55 P T 4 I L E T La racine de cet arbre à plus basse fréquence que tous ces sous arbres La racine de cet arbre à plus basse fréquence que tous Dr. Nejib Zaguia ces sous 35 arbres 12/23/2021
Il faut recombiner de manière à garder la propriété d’ordre dont on se sert 39 55 T 3 T 2 T 1 S A T 4 P I 32 E T L La racine de cet arbre à plus basse fréquence que tous ces sous arbres basse fréquence que tous Dr. Nejib Zaguia 12/23/2021 ces sous 36 arbres
Supposons que notre arbre binaire est plein…. Hauteur (définie par le nombre d’arc de la racine a la feuille) H 2 H+1 -1 noeuds 37 Dr. Nejib Zaguia 12/23/2021
H=2 23 -1 = 7 noeuds. 38 Dr. Nejib Zaguia 12/23/2021
Quand on enleve… On remplace… 39 Dr. Nejib Zaguia 12/23/2021
Si on a encore la propriété que la racine à fréquence plus basse on garde… Sinon: on échange contre celui des deux enfants qui a la fréquence la plus basse. 40 Dr. Nejib Zaguia 12/23/2021
On continue comme ca jusqu’a ce qu’on trouve le bon endroit ou insérer… On ne remplacera jamais plus que H. Donc: Enlever un élément ne coute que O(log n) 41 Dr. Nejib Zaguia 12/23/2021
Rajouter un élément coute aussi O(log n). On rajoute l’élément en feuille et on le place à la bonne position Démo: http: //www. cs. auckland. ac. nz/software/Alg. Anim/heaps. html 42 Dr. Nejib Zaguia 12/23/2021
Huffman (C){ Q = C mis dans une structure ordonnée while(Q. size( ) > 1){ x = Extraire-Minimum (Q) y = Extraire-Minimum (Q) fabriquer z à partir de x et y f[z] = f[x] + f[y] Insérer z dans Q } Retourner l’arbre fabriqué à partir du seul élt de Q } 43 Dr. Nejib Zaguia 12/23/2021
Complexité: Initialisation du heap O(n) n-1 itérations dans la boucle while: chaque itération (nombre constant d’opérations) log (n) Total: O(n logn) 44 Dr. Nejib Zaguia 12/23/2021