Le code de Huffman: 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/28/2018
log2 C bits TEST 100001011100 Codes de longueur fixe: Chaque caractères est codé avec le même nombre de bits. Pour C caractères on a besoin de log2 C bits Simple, et facile a manipuler TEST 100001011100 nl 110 es 101 T 100 S 011 I 010 E 001 A 000 Dr. Nejib Zaguia 12/28/2018
Exemple 1 nl 110 es 101 T 100 S 011 I 010 E 001 A 000 A E I S T es nl 1 000 001 010 011 100 101 110 Dr. Nejib Zaguia 12/28/2018
longueur variable Exemple 2 nl 11 es 101 T 100 S 011 I 010 E 001 A 000 1 000 001 010 011 100 101 11 Dr. Nejib Zaguia 12/28/2018
Exemple 3 TEST = 11100000011 Symbol Code 00001 nl 001 es 11 T 00000 S I es A E T S nl 1 00000 00001 0001 001 01 10 11 Symbol Code 00001 nl 001 es 11 T 00000 S 0001 I 10 E 01 A TEST = 11100000011 Dr. Nejib Zaguia 12/28/2018
CSI 3505 Algorithmes Voraces 110 101 100 011 010 001 000 Code Longueur fixe 441 15 54 96 12 36 105 123 Total Bits Longueur variable 5 18 32 4 35 41 Fréquence 363 25 64 20 48 70 82 Caractère 00001 nl es 11 T 00000 S 0001 I 10 E 01 A Dr. Nejib Zaguia 12/28/2018
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. Dr. Nejib Zaguia 12/28/2018
Ou 11 01 00001 11 00 P Symbole Code 00001 nl 001 es 11 T 00000 S 0001 11010000111 = 11 01 00 001 11 00 P Symbole Code 00001 nl 001 es 11 T 00000 S 0001 I 10 E 01 A Ou 11 01 00001 11 I es P A E T S nl 1 00000 00001 0001 001 01 10 11 Préfixe!! Dr. Nejib Zaguia 12/28/2018
l'arbre de décodage du code 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 Les caractères sont placés uniquement sur les feuilles de l’arbre. Tout nœud interne (c'est-à-dire qui n'est pas une feuille) a deux fils non vides. Dr. Nejib Zaguia 12/28/2018
CSI 3505 Algorithmes Voraces Problème: Input Une liste de caractères et leurs fréquences. Output 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 Dr. Nejib Zaguia 12/28/2018
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. Dr. Nejib Zaguia 12/28/2018
L'algorithme opère sur une forêt 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. 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 . 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. Dr. Nejib Zaguia 12/28/2018
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/28/2018
Example: Supposons que les lettres a coder ont les fréquences suivantes: 32 25 12 4 30 18 5 A E I S T P L Dr. Nejib Zaguia 12/28/2018
Trier par ordre de fréquence 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) Dr. Nejib Zaguia 12/28/2018
4 5 12 18 25 30 32 S L I P E T A 9 Choisir les deux fréquence les moins élevées et les utiliser pour fabriquer un arbre T1 Dr. Nejib Zaguia 12/28/2018
Réinsérer dans la liste d’arbres ordonnée 9 12 18 25 30 32 I P E T A Insérer dans liste ordonée: O(log(n)) pour trouver endroit l’index d’insertion + whatever pour insérer (dépend de l’implémentation de la liste) 21 T2 Réinsérer dans la liste d’arbres ordonnée Dr. Nejib Zaguia 12/28/2018
18 25 30 32 P E T A T1 I S L T2 21 Dr. Nejib Zaguia 12/28/2018
E 25 T 30 A 32 T1 I P S L T2 T3 39 T4 55 Dr. Nejib Zaguia 12/28/2018
T E T4 55 T1 I P A S L T2 T3 T5 71 126 T6 Dr. Nejib Zaguia 12/28/2018
T1 I T P A E S L T2 T3 T4 T5 T6 Symbol Code 00001 L 001 P 11 T 00000 S Codage T1 I T P A E S L T2 T3 T4 T5 126 T6 Symbol Code 00001 L 001 P 11 T 00000 S 0001 I 10 E 01 A 1 Dr. Nejib Zaguia 12/28/2018
Ne fait aucune différence P A E S L T E A P S L I Ne fait aucune différence Dr. Nejib Zaguia 12/28/2018
Maintenant, il faut implémenter l’algo aussi efficacement que possible: Dr. Nejib Zaguia 12/28/2018
Q = C mis dans une structure ordonnée while(Q.size( ) > 1){ 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 Dr. Nejib Zaguia 12/28/2018
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 Dr. Nejib Zaguia 12/28/2018
fabriquer z à partir de x et y class arbreDeChar{ char lettre; int Fréquence const arbreDeChar* Gauche const arbreDeChar* Droit public: boolean estFeuille() { return Gauche==Droit==NULL}; arbreDeChar(char a, int f): Gauche(NULL), Droit(Null), Frequence(f) {lettre=a;}; arbreDeChar( const arbreDeChar& d, const arbreDeChar& g): lettre((char)0), Frequence(d.Frequence + g.frequence), Droit(&d),Gauche(&g){ } 39 T3 21 T2 P 18 T1 I S L Dr. Nejib Zaguia 12/28/2018
Compléter class arbreDeChar A faire en classe: Compléter class arbreDeChar Dr. Nejib Zaguia 12/28/2018
Fabriquer une structure dans laquelle on peut: Retirer des arbreDeChar par ordre de fréquence aussi efficacement que possible Insérer de nouveaux arbreDeChar aussi facilement que possible. (Ca éliminent tableaux (pourquoi ?)) Dr. Nejib Zaguia 12/28/2018
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. Dr. Nejib Zaguia 12/28/2018
Utilisons un arbre binaire dont les noeuds sont… Des objets de type arbreDeChar Et qu’on remplira toujours de doite à gauche et de manière à le garder aussi feuillu que possible Dr. Nejib Zaguia 12/28/2018
Sauf que on va jouer sur la structure de l’arbre pour faciliter nos opération. Requirements Dr. Nejib Zaguia 12/28/2018
Il faut que ca soit aussi facile que possible de retirer les nœud contenant des arbreDeChar à 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. Dr. Nejib Zaguia 12/28/2018
T1 I P S L T2 T3 39 A 32 T E T4 55 On va nécéssairement chercher à partir de la racine, donc on veut que les nœud à fréquence plus basses soient plus proche de la racine. Dr. Nejib Zaguia 12/28/2018
A 32 T1 I P S L T2 T3 39 T E T4 55 . 56 . 65 .. 45 . 67 . 78 . 88 . 95 . 56 . 67 Dr. Nejib Zaguia 12/28/2018
L’arbreDeChar qui a la plus basse fréquence est mis à la racine L’arbreDeChar qui a la plus basse fréquence est mis à la racine. Il est donc très facile a extraire La racine de cet arbre à plus basse fréquence que tous ces sous arbres Maintenant, on a 2 sous-arbres A 32 T1 I P S L T2 T3 39 T E T4 55 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 ces sous arbres Dr. Nejib Zaguia 12/28/2018
Il faut recombiner de manière à garder la propriété d’ordre dont on se sert 39 A 32 T E T4 55 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 ces sous arbres Dr. Nejib Zaguia 12/28/2018
Supposons que notre arbre binaire est plein…. Hauteur (définie par le nombre d’arc de la racine a la feuille) H 2H+1-1 noeuds Dr. Nejib Zaguia 12/28/2018
H = 2 23-1 = 7 noeuds. Dr. Nejib Zaguia 12/28/2018
Quand on enleve… On remplace… Dr. Nejib Zaguia 12/28/2018
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. Dr. Nejib Zaguia 12/28/2018
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) Dr. Nejib Zaguia 12/28/2018
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/AlgAnim/heaps.html Dr. Nejib Zaguia 12/28/2018
Q = C mis dans une structure ordonnée while(Q.size( ) > 1){ 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 Dr. Nejib Zaguia 12/28/2018
Total: O(n logn) Complexité: O(n) log (n) Initialisation du heap n-1 itérations dans la boucle while: chaque itération (nombre constant d’opérations) O(n) log (n) Total: O(n logn) Dr. Nejib Zaguia 12/28/2018