Codage de Huffman et arbres pondérés
Codage de Huffman et arbres pondérés
L2 Mathématique et Informatique
Outline
1 Introduction
2 Notion de codes
Idée 2 : les lettres sont codées par des mots de longueurs variables :
les lettres apparaissant le plus grand nombre de
fois sont associées à des mots les plus courts pos-
sibles.
Propriété :
Si une lettre a est une lettre du texte apparaissant nb(a) fois dans le
texte et est associé à un mot de longueur l(a), alors la longueur du texte
compressé est
L(compressé) = nb(a) · l(a) .
X
a∈texte
Lettre a b c d e f
Nombre d’occurence 350 330 20 160 90 50
Lettre a b c d e f
Codage 1 :
Codage 000 001 010 011 100 101
Lettre a b c d e f
Codage 2 :
Codage 0 11 10000 101 1001 10001
1 Introduction
2 Notion de codes
Définition :
Soit A un ensemble, appelé un alphabet.
Un mot sur un alphabet A est une suite finie d’éléments de A.
Exemples :
Définition :
Soit A un ensemble, appelé alphabet.
Un code sur un alphabet A est un ensemble C de mots construits sur A
tels qu’une concaténation de mots de C ne peut être séparée en mots de
C que d’une unique façon :
Pour tous entiers n et p, pour tous mots x1 , · · · , xn , y1 , · · · , yp ∈ C,
p=n
x0 x1 . . . xn = y0 y1 . . . yp =⇒ (1)
∀i ∈ [[1; n]] , xi = yi
Définition :
Un code est dit binaire s’il est construit sur un alphabet à deux éléments.
(On identifiera alors ces deux lettres aux entiers 0 et 1).
Exemples
C0 = {001, 100, 010} est un code : tous ses mots sont de même
longueur
1001000101110 = 1|00|10|00|10|1|1|10
Définition :
Un code préfixe est un ensemble C de mots sur un alphabet A dans
lequel aucun mot du code n’est préfixe d’un autre mot du code.
Contre-exemple :
Exemple :
Preuve :
Exemple :
0 1
0 1
0 1
Code binaire 2/2
Exemple :
Exemple :
0 1
Exemple :
0 1
0 1 0
Exemple :
0 1
0 1 0
0
Code binaire 2/2
Exemple :
0 1
0 1 0
0 1
Code binaire et factorisation d’un message
Propriété :
Un code préfixe sur un alphabet à deux lettres est un code : la
factorisation d’une suite de mot construite à partir du code préfixe est
unique.
Preuve :
0 1
1100000011000110
0 1 C={000,00110,00111,110}
0 1 0
↓
1
0 1
110|000|00110|00110
Code binaire et factorisation d’un message
Propriété :
Un code préfixe est un code.
Preuve :
1 Introduction
2 Notion de codes
Objectif : Représenter une suite d’octets (le texte) par une suite
d’octets plus courte (le compressé) de sorte que le texte
reconstruit à partir du compressé soit identique à l’original.
1 Introduction
2 Notion de codes
Rappel :
Si une lettre a est une lettre d’un texte à compresser apparaissant nb(a)
fois et est associé à un mot de longueur l(a), alors la longueur du texte
compressé vaut
a∈texte
le poids d’un nœud interne est la somme des poids de ses enfants ;
le coût d’une feuille est le produit de son poids par son niveau ;
f feuille de A
Arbre pondéré et cout
le coût d’une feuille est le produit de son poids par son niveau ;
niveau = longueur du mot codant l’étiquette de la feuille
le coût d’un arbre est la somme des coûts de ses feuilles :
f feuille de A
Cout(A) ←→ L(compréssé)
Recherche de minimisation du cout
Pour une fonction de poids donné, il existe des arbres de coût minimum.
Ces arbres sont localement complets (tous les nœuds ont 0 ou 2 enfants).
Considérons la fonction de poids Considérons l’arbre A suivant :
suivante :
p(a) 350
=
p(b) 330
=
a
p(c) 20
=
p(d) = 160
p(e) 90 b
=
p(f ) 50
=
c f
Alors :
Cout(A) = p(a) + 2p(b) + 3p(d) + 4p(e) + 5 p(c) + p(f ) = 2200
Recherche de minimisation du cout
Pour une fonction de poids donné, il existe des arbres de coût minimum.
Ces arbres sont localement complets (tous les nœuds ont 0 ou 2 enfants).
p(a) 350
=
p(b) = 330
p(c) 20
=
p(d) = 160
p(e) 90
=
p(f ) 50 e f
=
a b c d
Alors :
1 Introduction
2 Notion de codes
Définition :
Soit C un ensemble quelconque et E un ensemble ordonné.
Une file de priorité est un ensemble de couples (cle,priorite) ∈ C × E ,
sur lequel on souhaite pouvoir réaliser les opérations suivantes :
• maximum : File −→ C × E ou minimum : File −→ C × E
• inserer : File×C × E −→ File ;
• supprimer : File −→ File.
Définition :
Soit C un ensemble quelconque et E un ensemble ordonné.
Une file de priorité est un ensemble de couples (cle,priorite) ∈ C × E ,
sur lequel on souhaite pouvoir réaliser les opérations suivantes :
• maximum : File −→ C × E ou minimum : File −→ C × E
• inserer : File×C × E −→ File ;
• supprimer : File −→ File.
x
1
c
1
d 1
Priorité
importante
b
2
r
3
a
6
Exemple
d 1
b
2
Priorité
importante
x c
1 1
r
3
a
6
Exemple
x c
1 1
r
3
Priorité
importante
d b
1 2
a
6
Exemple
d b
1 2
Priorité
importante
r
3
x c
1 1
a
6
Exemple
a
6
Priorité
importante
d b r
1 2 3
x c
1 1
Exemple
a
6
Priorité
importante
d b r
1 2 3
x c
1 1
Exemple
Texte à compresser : ”xabracadabrara”
a
6
Priorité
importante
d b r
1 2 3
x c
1 1
Codage :
a: 0 d: 100
b : 101 r: 111
c : 1101 x: 1100
Exemple
Texte à compresser : ”xabracadabrara”
a
6
Priorité
importante
d b r
1 2 3
x c
1 1
Codage :
a: 0 d: 100 Compressé :
b : 101 r: 111 1100|0|101|111|0|1101|0|100|0|101|
c : 1101 x: 1100 32 bits contre 14 · 8 = 112 bits
Exercice
Lettre a b c d e f
Nombre d’occurence 350 330 20 160 90 50
1 Introduction
2 Notion de codes
a o e v h i
l t u y
Exemple
a o e v h i
l t u y
Texte décompréssé :
Exemple
a o e v h i
l t u y
Texte décompréssé :
Exemple
a o e v h i
l t u y
Texte décompréssé : i
Exemple
a o e v h i
l t u y
Texte décompréssé : i
Exemple
a o e v h i
l t u y
Texte décompréssé : i
Exemple
a o e v h i
l t u y
Texte décompréssé : i
Exemple
a o e v h i
l t u y
Texte décompréssé : il
Exemple
a o e v h i
l t u y
Texte décompréssé : il
Exemple
a o e v h i
l t u y
Texte décompréssé : il
Exemple
a o e v h i
l t u y
a o e v h i
l t u y
a o e v h i
l t u y
a o e v h i
l t u y
a o e v h i
l t u y
a o e v h i
l t u y
a o e v h i
l t u y
a o e v h i
l t u y
a o e v h i
l t u y
a o e v h i
l t u y
a o e v h i
l t u y
a o e v h i
l t u y
a o e v h i
l t u y
a o e v h i
l t u y
a o e v h i
l t u y
a o e v h i
l t u y
a o e v h i
l t u y
a o e v h i
l t u y
1 Introduction
2 Notion de codes
typedef struct {
char lettre;
int occurence;
int gauche,droit;
} NoeudHuffman;
Construction de l’arbre
Les deux nœuds de poids minimum sont donc parmi les deux
premières feuilles ou les deux premiers nœuds internes non traitées.
Exemple
x lettre Poids G D
1
0 x 1 - -
c 1 c 1 - -
1 2 d 1 - -
d 3 b 2 - -
1
Priorité 4 r 3 - -
importante 5 a 6 - -
b
2
6
r 7
3
8
a 9
6 10
Exemple
d lettre Poids G D
1
0 x 1 - -
b 1 c 1 - -
2 2 d 1 - -
3 b 2 - -
Priorité 4 r 3 - -
importante a 6 - -
x c 5
1 1 6 - 2 0 1
r 7
3
8
a 9
6 10
Exemple
lettre Poids G D
0 x 1 - -
x c 1 c 1 - -
1 1 2 d 1 - -
r 3 b 2 - -
3
Priorité 4 r 3 - -
importante 5 a 6 - -
6 - 2 0 1
d b 7 - 3 2 3
1 2 8
a 9
6 10
Exemple
lettre Poids G D
0 x 1 - -
d b 1 c 1 - -
1 2 2 d 1 - -
3 b 2 - -
Priorité 4 r 3 - -
importante a 6 - -
r 5
3 6 - 2 0 1
x c 7 - 3 2 3
1 1 8 - 5 6 4
a 9
6 10
Exemple
a lettre Poids G D
6
0 x 1 - -
1 c 1 - -
2 d 1 - -
3 b 2 - -
Priorité 4 r 3 - -
importante a 6 - -
d b r 5
1 2 3 6 - 2 0 1
x c 7 - 3 2 3
1 1 8 - 5 6 4
9 - 8 7 8
10
Exemple
lettre Poids G D
0 x 1 - -
a 1 c 1 - -
6
2 d 1 - -
3 b 2 - -
Priorité 4 r 3 - -
importante a 6 - -
d b r 5
1 2 3 6 - 2 0 1
x c 7 - 3 2 3
1 1 8 - 5 6 4
9 - 8 7 8
10 - 14 5 9
Deux difficultés :
Un arbre de Huffman :
01[a]001[d]1[b]001[x]1[c]1[r]
x c
1 1
Padding
Warning : Il peut y avoir des bits non valides dans dernier octet du fichier
compressé.
La longueur du compressé est égale au coût de l’arbre.
Le codage de l’arbre utilise un bit par nœud.
Le fichier compressé débute par 3 bits indiquant le nombre de bits
invalides du dernier octet (de 0 à 7).
Exemple : xabracadabrara
1 On lit le padding ;
1 Introduction
2 Notion de codes
Solutions :
• utiliser un code fixe;
• version adaptative de Huffman qui modifie le code au fur et à mesure
de son utilisation.
Dans un arbre de Huffman, on peut ranger les nœuds dans une liste
• croissante pour les poids
• dans laquelle deux enfants du même nœud sont consécutifs.
13
a 6 7
r 3 4
2
b 2
c 1 d 1
Mise à jour dans l’algorithme d’Huffman adaptatif
T=abracadabrara
lu 2 3
a 1
b 1
0 a1 r a1 2
émis 0[b] 00[r]
0 a1
[a] 0 b1 1 b1
01100001
0 r1
4 5 6
a a2 2 c 3 a 3
a2 a3
0 100[c] 0
1 b1 b1 2 b1 2
0 r1
1 r1 1 r1
0 c1 0 c1
Exemple 2/2
T=abracadabrara
7 8 9
a3 4 4 5
a4 a4
d 2 a b 3
2 2 2 2
1100[d] 0 110
1 c1 b1 r1 1 c1 b1 r1 1 c1 r1 b2
0 d1 0 d1 0 d1
a r 12 a 13
r 10 11 0
0 110
110 a5 7
a4 6 a5 6 a6 7
4
4 2 4 r3 r3 4
2
2 b2 2
1 c1 r2 b2 1 c1 r2 b2 b2
1 c1 1
0 d1 0 d1 c1
0 d1
0 d1