Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parFrançoise Couture Modifié depuis plus de 6 années
1
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
2
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 nl 110 es 101 T 100 S 011 I 010 E 001 A 000 Dr. Nejib Zaguia 12/28/2018
3
Exemple 1 nl 110 es 101 T 100 S 011 I 010 E 001 A 000 A E I S T es nl
1 Dr. Nejib Zaguia 12/28/2018
4
longueur variable Exemple 2 nl 11 es 101 T 100 S 011 I 010 E 001 A 000
1 11 Dr. Nejib Zaguia 12/28/2018
5
Exemple 3 TEST = 11100000011 Symbol Code 00001 nl 001 es 11 T 00000 S
I es A E T S nl 1 0001 001 01 10 11 Symbol Code 00001 nl 001 es 11 T 00000 S 0001 I 10 E 01 A TEST = Dr. Nejib Zaguia 12/28/2018
6
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
7
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
8
Ou 11 01 00001 11 00 P Symbole Code 00001 nl 001 es 11 T 00000 S 0001
= 00 P Symbole Code 00001 nl 001 es 11 T 00000 S 0001 I 10 E 01 A Ou I es P A E T S nl 1 0001 001 01 10 11 Préfixe!! Dr. Nejib Zaguia 12/28/2018
9
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
10
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
11
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
12
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
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/28/2018
14
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
15
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
16
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
17
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
18 25 30 32 P E T A T1 I S L T2 21 Dr. Nejib Zaguia 12/28/2018
19
E 25 T 30 A 32 T1 I P S L T2 T3 39 T4 55 Dr. Nejib Zaguia 12/28/2018
20
T E T4 55 T1 I P A S L T2 T3 T5 71 126 T6 Dr. Nejib Zaguia 12/28/2018
21
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
22
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
23
Maintenant, il faut implémenter l’algo aussi efficacement que possible:
Dr. Nejib Zaguia 12/28/2018
24
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
25
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
26
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
27
Compléter class arbreDeChar
A faire en classe: Compléter class arbreDeChar Dr. Nejib Zaguia 12/28/2018
28
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
29
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
30
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
31
Sauf que on va jouer sur la structure de l’arbre pour faciliter nos opération. Requirements
Dr. Nejib Zaguia 12/28/2018
32
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
33
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
34
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
35
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
36
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
37
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
38
H = 2 23-1 = 7 noeuds. Dr. Nejib Zaguia 12/28/2018
39
Quand on enleve… On remplace… Dr. Nejib Zaguia 12/28/2018
40
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
41
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
42
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: Dr. Nejib Zaguia 12/28/2018
43
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
44
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
Présentations similaires
© 2025 SlidePlayer.fr Inc.
All rights reserved.