La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

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.

Présentations similaires


Présentation au sujet: "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."— Transcription de la présentation:

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


Télécharger ppt "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."

Présentations similaires


Annonces Google