Codage préfixe.gcolas/algo-licence/slides/huffman-slides.pdf · lecture du texte et stockage dans...

Post on 14-Oct-2020

4 views 0 download

Transcript of Codage préfixe.gcolas/algo-licence/slides/huffman-slides.pdf · lecture du texte et stockage dans...

Codage préfixe.

A : alphabetS : texte à coderf(c) : fréquence du caractère c dans S

à chaque caractère c correspond un code Φ(c) (suite de bits)

aucun code n’est le préfixe d’un autre

▽ – p.1

Codage préfixe.

A : alphabetS : texte à coderf(c) : fréquence du caractère c dans S

à chaque caractère c correspond un code Φ(c) (suite de bits)

aucun code n’est le préfixe d’un autre

le codage est optimal si

c∈A

f(c) × |Φ(c)|

est minimal (taille du texte après codage)

– p.1

Arbre de codage.

On représente un codage préfixe par un arbre binaire

Codes

c : 10

0 1

1010

a : 00b : 01

d : 11da b c

Chaque feuille correspond à un caractère de l’alphabetChaque branche est étiquetée par la valeur 0 ou 1 (un bit)

dacadbaac → 11-00-10-00-11-01-00-00-10 (taille=18)

– p.2

Codage.

Soit un texte à coder S

calcul de l’alphabet A (et des fréquences)

calcul des codes des caractères de l’alphabet

parcours du texte en produisant à la place de chaque caractèreson code (parcours des feuilles vers la racine lorsqu’on utilise l’arbre de codage)

– p.3

Décodage.

codes + texte codé → texte original

Il n’y a pas d’ambiguité dans un codage préfixe, puisqu’aucun coden’est le préfixe d’un autre

analyse du texte codé en recherchant les codes (parcours de la racine

vers les feuilles dans l’arbre de codage)

La représentation des codes sous la forme d’un arbre de codagefacilite l’analyse.

– p.4

Codage préfixe optimal.

Idée : les caractères les plus fréquents ont des codes plus courts

L’arbre de codage est completarbre de codage optimal étiqueté par les caractères et les fréquences

4

2 1

2

Codesa : 0b : 111c : 10d : 110

a

bd

c 3

5

9

0

0

0

1

1

1

T fréquences

dacadbaac → 110-0-10-0-110-111-0-0-10 (taille=17)

– p.5

Codage préfixe optimal.

Pour l’alphabet A, les fréquences f et l’arbre T

B(T ) =∑

c∈A

f(c) × pT (c)

est minimal (pT (c) représente la profondeur de la feuille d’étiquette c)

Tp ( )b

4

2 1

2

a

bd

c 3

5

9

0

0

0

1

1

1

T

– p.6

Codage préfixe optimal : Huffman.

Huffman propose un algorithme glouton pour la construction d’un arbrede codage optimal

initialisation :construire l’ensemble F des arbres correspondants auxcaractères de l’alphabet (arbres-feuilles),

itération :tant que F contient plus d’un arbre, fusionner deux arbres dans F .

– p.7

Codage préfixe optimal : Huffman.

Texte : axabataaxbcbtaabxxaazazaa

Calcul des fréquences

Un arbre par caractère de l’alphabet

a : 12 b : 4 c : 1 t : 2 z : 2 x : 4

Ensuite

tant qu’il y a plus d’un arbre

choisir deux arbres de poids minimaux

fusionner ces deux arbres : la nouvelle racinea pour poids la somme des poids des racines de ses fils

– p.8

Codage préfixe optimal : Huffman.

c : 1 t : 2a : 12 b : 4 z : 2 x : 4

– p.9

Codage préfixe optimal : Huffman.

a : 12 b : 4

c : 1 t : 2

x : 43z : 2

– p.10

Codage préfixe optimal : Huffman.

a : 12

z : 2

c : 1 t : 2

b : 4 x : 4

3

5

– p.11

Codage préfixe optimal : Huffman.

a : 12

z : 2

c : 1 t : 2

x : 4 b : 43

85

– p.12

Codage préfixe optimal : Huffman.

z : 2

c : 1 t : 2

x : 4 b : 4

a : 12

3

8

13

5

– p.13

Codage préfixe optimal : Huffman.

0 1

1

1

0

0

0

01 1

a : 12

z : 2

c : 1 t : 2

x : 4 b : 43

8

13

25

5

– p.14

Codage préfixe optimal : Huffman.

Codes

a :

z :

c :

t :

x :

b :

0

100

1010

1011

110

111

0 1

1

1

0

0

0

01 1

a : 12

z : 2

c : 1 t : 2

x : 4 b : 43

8

13

25

5

axabataaxbcbtaabxxaazazaa (24 caractères)011001110101100110111101011110110011111011000100010000 (54 bits)01100111-01011001-10111101-01111011-00111110-11000100-010000 (7octets)

– p.15

Codage préfixe optimal : Huffman.

procédure Huffman (T : texte){F est une file de priorité}1 calculer l’alphabet A et les fréquences f2 F = ∅,3 pour chaque c ∈ A faire4 F = F ∪ {CreerNoeud(c/f(c),NIL,NIL)},5 tant que card(F ) ≥ 2 faire6 a =ExtraireLeMin(F ),7 b =ExtraireLeMin(F ),8 F = F ∪ {CreerNoeud(f(a) + f(b), a, b)},9 renvoyer (F ),

ExtraireLeMin(F ) : renvoie à la structure de tas binaire

– p.16

Huffman : optimalité

Deux propriétés :

propriété du choix glouton : il existe toujours une solutionoptimale qui contient un premier choix glouton

propriété de sous-structure optimale : toute solution optimaleprivée d’un choix est elle-même une solution optimale dusous-problème.

– p.17

Huffman : optimalité (choix glouton)

Propriété. Si x et y sont les caractères de fréquences les plus faiblesalors il existe un arbre de codage optimal dans lequel x et y sont frères(et de profondeur maximale).

Preuve.Soit T un arbre de codage optimal,a et b deux frères de profondeur maximale.On suppose f(x) ≤ f(y) et f(a) ≤ f(b).Donc

f(x) ≤ f(a) et f(y) ≤ f(b)

En échangeant a et x d’une part, b et y d’autre part,on obtient un nouvel arbre de codage T ′ qui fournit uncodage au moins aussi bon que T

B(T ) =X

c∈A

f(c) × pT (c)

x

a b

y

T

– p.18

Huffman : optimalité (choix glouton)

x

a b

y

T T’

a

x y

b

– p.19

Huffman : optimalité (sous-structure optimale)

Trouver un arbre de codage optimal pour le problème P

a : 12 b : 4 c : 1 d : 2 e : 2 f : 4

revient à trouver un arbre de codage optimal pour le problème P ′

(obtenu après la fusion des arbres de plus petits poids)

a : 12 b : 4 e : 2 f : 4z1 : 3

Il suffit de montrer qu’à tout arbre optimal pour P ′ correspond un arbreoptimal pour P

– p.20

Huffman : optimalité (sous-structure optimale)

c et d caractères de plus petites fréquences dans P

T un arbre de codage pour P

T ′ : arborescence dérivée de T en substituant la feuille z au noeudinterne de fils c et d, avec f(z) = f(c) + f(d)

T T’

c : f(c) d : f(d)

z : f(c)+f(d)

Propriété. T ′ est optimal ⇔ T est optimal

– p.21

Huffman : optimalité (sous-structure optimale)

a : 12 b : 4 c : 1 d : 2 e : 2 f : 4

a : 12 b : 4 f : 4z2 : 5

z3 : 8

a : 12 z4:13

a : 12 z4:13

a : 12

z3 : 8 z2 : 5

b : 4 f : 4

a : 12

z2 : 5

b : 4 f : 4

a : 12

z1 : 3 e : 2

b : 4 f : 4 f : 4

a : 12

c : 1 d : 2

a : 12 b : 4 e : 2 f : 4z1 : 3

a : 12 z2 : 5

25

25

13

25

13

8

25

13

8 5

25

13

8 5

3

– p.22

Projet

lecture du texte et stockage dans un tableau de char

calcul de l’alphabet et des fréquences

construction de l’arbre de codage optimal en utilisant un tasbinaire

codage et sauvegarde des codes et du texte codé

procédure de reconstruction de l’arbre et de décodage

Le texte codé sous forme de caractères ASCII 0 et 1 n’est pas compressé.

Il faut produire une suite de bits stockés dans des unsigned char par exemple, enutilisant l’opérateur de décalage << et écride dans des fichiers binaires (fread etfwrite)

– p.23

Projet : modulesmodule toto.c :

#include <stdio.h>

#include ‘‘titi.h’’

#include ‘‘toto.h’’

UN_TYPE *maTable = NULL; /* Variable globale */

int Bidon(int a, int b)

{

.....

}

Fichier toto.h :typedef struct bidon *UN_TYPE;

struct bidon {

....

};

extern UN_TYPE *maTable; /* Utilisable dans d’autres modules */

int Bidon(int a, int b); /* Utilisable dans d’autres modules */

– p.24