1. Algorithme de compression de Huffman

Considérons le texte suivant et voyons comment nous pouvond le coder en binaire.

IL ETAIT UNE FOIS, DANS UN PAYS FORT FORT LOINTAIN, UNE PRINCESSE QUI N'AIMAIT PAS BEAUCOUP LES FRAISES DES BOIS. VOUS POURRIEZ PENSER QUE C'EST UN SIMPLE DETAIL, MAIS DANS CE PAYS, LES FRAISES ETAIENT ABONDANTES ET FAISAIENT LA FIERTE DES SUJETS DU ROYAUME. UN JOUR OU ELLE COMMENCAIT A AVOIR UNE SACRE DALLE, ELLE TROUVA UN HERISSON VOLANT EN TRAIN DE NAGER DANS LA MARRE AUX CANARDS. ELLE LE SORTIT DE L'EAU, TOUT DEGOULINANT, ET ELLE L'EMBROCHA AUSSI SEC POUR LE FAIRE GRILLER GENTILLEMENT. LE GOUT SE REVELA TELLEMENT ATROCE QU'ELLE SE DIT QUE, APRES TOUT, LES FRAISES DES BOIS N'ETAIENT SOMME TOUTE PAS SI MAUVAISES.

On peut attribuer un code binaire à chaque caractère utilisé dans ce texte :
Caractères ' , . A B C D E F G H I J L M N O P Q R S T U V X Y Z _
Occurences 6 9 5 49 5 11 15 80 9 5 2 36 2 35 13 33 28 11 4 30 48 38 31 6 1 3 1 106
Code binaire 0
0
0
0
0
0
0
0
0
1
0
0
0
1
0
0
0
0
1
1
0
0
1
0
0
0
0
1
0
1
0
0
1
1
0
0
0
1
1
1
0
1
0
0
0
0
1
0
0
1
0
1
0
1
0
0
1
0
1
1
0
1
1
0
0
0
1
1
0
1
0
1
1
1
0
0
1
1
1
1
1
0
0
0
0
1
0
0
0
1
1
0
0
1
0
1
0
0
1
1
1
0
1
0
0
1
0
1
0
1
1
0
1
1
0
1
0
1
1
1
1
1
0
0
0
1
1
0
0
1
1
1
0
1
0
1
1
0
1
1
Chaque caractère est représenté par un code de 5 bits et comme il y a 622 caractères dans le texte, nous avons donc besoin de 3110 bits.
L'astuce de Huffman est d'utiliser des codes de taille variable. On gagnerait beaucoup de place si le caractère "_" pouvait être codé avec un seul bit puisqu'il apparaît 106 fois dans le texte.
Pour trouver les codes à utiliser pour chaque caractère, nous allons utiliser un algorithme qui consiste à apparier les éléments qui ont la plus faible occurence.
Par exemple, le caractère X apparaît 1 fois et Z apparaît 1 fois, donc l'ensemble {X ;Z } apparaît 2 fois. En répétant cet algorithme jusqu'à n'avoir qu'une seule paire, on obtient ceci :
def simplify(x):
    y = x[2:]
    y.append(("{" + x[0][0] + ";" + x[1][0] + "}", x[0][1] + x[1][1]))
    y.sort(key=lambda x:x[1])
    return y


def compress(x):
    while len(x) > 1:
        x = simplify(x)
        # Afficher x
        printX(x)
H2 J2 {X;Z}2 Y3 Q4 .5 B5 G5 '6 V6 ,9 F9 C11 P11 M13 D15 O28 R30 U31 N33 L35 I36 T38 S48 A49 E80 _106
{X;Z}2 Y3 Q4 {H;J}4 .5 B5 G5 '6 V6 ,9 F9 C11 P11 M13 D15 O28 R30 U31 N33 L35 I36 T38 S48 A49 E80 _106
Q4 {H;J}4 .5 B5 G5 {{X;Z};Y}5 '6 V6 ,9 F9 C11 P11 M13 D15 O28 R30 U31 N33 L35 I36 T38 S48 A49 E80 _106
.5 B5 G5 {{X;Z};Y}5 '6 V6 {Q;{H;J}}8 ,9 F9 C11 P11 M13 D15 O28 R30 U31 N33 L35 I36 T38 S48 A49 E80 _106
G5 {{X;Z};Y}5 '6 V6 {Q;{H;J}}8 ,9 F9 {.;B}10 C11 P11 M13 D15 O28 R30 U31 N33 L35 I36 T38 S48 A49 E80 _106
'6 V6 {Q;{H;J}}8 ,9 F9 {.;B}10 {G;{{X;Z};Y}}10 C11 P11 M13 D15 O28 R30 U31 N33 L35 I36 T38 S48 A49 E80 _106
{Q;{H;J}}8 ,9 F9 {.;B}10 {G;{{X;Z};Y}}10 C11 P11 {';V}12 M13 D15 O28 R30 U31 N33 L35 I36 T38 S48 A49 E80 _106
F9 {.;B}10 {G;{{X;Z};Y}}10 C11 P11 {';V}12 M13 D15 {{Q;{H;J}};,}17 O28 R30 U31 N33 L35 I36 T38 S48 A49 E80 _106
{G;{{X;Z};Y}}10 C11 P11 {';V}12 M13 D15 {{Q;{H;J}};,}17 {F;{.;B}}19 O28 R30 U31 N33 L35 I36 T38 S48 A49 E80 _106
P11 {';V}12 M13 D15 {{Q;{H;J}};,}17 {F;{.;B}}19 {{G;{{X;Z};Y}};C}21 O28 R30 U31 N33 L35 I36 T38 S48 A49 E80 _106
M13 D15 {{Q;{H;J}};,}17 {F;{.;B}}19 {{G;{{X;Z};Y}};C}21 {P;{';V}}23 O28 R30 U31 N33 L35 I36 T38 S48 A49 E80 _106
{{Q;{H;J}};,}17 {F;{.;B}}19 {{G;{{X;Z};Y}};C}21 {P;{';V}}23 O28 {M;D}28 R30 U31 N33 L35 I36 T38 S48 A49 E80 _106
{{G;{{X;Z};Y}};C}21 {P;{';V}}23 O28 {M;D}28 R30 U31 N33 L35 I36 {{{Q;{H;J}};,};{F;{.;B}}}36 T38 S48 A49 E80 _106
O28 {M;D}28 R30 U31 N33 L35 I36 {{{Q;{H;J}};,};{F;{.;B}}}36 T38 {{{G;{{X;Z};Y}};C};{P;{';V}}}44 S48 A49 E80 _106
R30 U31 N33 L35 I36 {{{Q;{H;J}};,};{F;{.;B}}}36 T38 {{{G;{{X;Z};Y}};C};{P;{';V}}}44 S48 A49 {O;{M;D}}56 E80 _106
N33 L35 I36 {{{Q;{H;J}};,};{F;{.;B}}}36 T38 {{{G;{{X;Z};Y}};C};{P;{';V}}}44 S48 A49 {O;{M;D}}56 {R;U}61 E80 _106
I36 {{{Q;{H;J}};,};{F;{.;B}}}36 T38 {{{G;{{X;Z};Y}};C};{P;{';V}}}44 S48 A49 {O;{M;D}}56 {R;U}61 {N;L}68 E80 _106
T38 {{{G;{{X;Z};Y}};C};{P;{';V}}}44 S48 A49 {O;{M;D}}56 {R;U}61 {N;L}68 {I;{{{Q;{H;J}};,};{F;{.;B}}}}72 E80 _106
S48 A49 {O;{M;D}}56 {R;U}61 {N;L}68 {I;{{{Q;{H;J}};,};{F;{.;B}}}}72 E80 {T;{{{G;{{X;Z};Y}};C};{P;{';V}}}}82 _106
{O;{M;D}}56 {R;U}61 {N;L}68 {I;{{{Q;{H;J}};,};{F;{.;B}}}}72 E80 {T;{{{G;{{X;Z};Y}};C};{P;{';V}}}}82 {S;A}97 _106
{N;L}68 {I;{{{Q;{H;J}};,};{F;{.;B}}}}72 E80 {T;{{{G;{{X;Z};Y}};C};{P;{';V}}}}82 {S;A}97 _106 {{O;{M;D}};{R;U}}117
E80 {T;{{{G;{{X;Z};Y}};C};{P;{';V}}}}82 {S;A}97 _106 {{O;{M;D}};{R;U}}117 {{N;L};{I;{{{Q;{H;J}};,};{F;{.;B}}}}}140
{S;A}97 _106 {{O;{M;D}};{R;U}}117 {{N;L};{I;{{{Q;{H;J}};,};{F;{.;B}}}}}140 {E;{T;{{{G;{{X;Z};Y}};C};{P;{';V}}}}}162
{{O;{M;D}};{R;U}}117 {{N;L};{I;{{{Q;{H;J}};,};{F;{.;B}}}}}140 {E;{T;{{{G;{{X;Z};Y}};C};{P;{';V}}}}}162 {{S;A};_}203
{E;{T;{{{G;{{X;Z};Y}};C};{P;{';V}}}}}162 {{S;A};_}203 {{{O;{M;D}};{R;U}};{{N;L};{I;{{{Q;{H;J}};,};{F;{.;B}}}}}}257
{{{O;{M;D}};{R;U}};{{N;L};{I;{{{Q;{H;J}};,};{F;{.;B}}}}}}257 {{E;{T;{{{G;{{X;Z};Y}};C};{P;{';V}}}}};{{S;A};_}}365
{{{{O;{M;D}};{R;U}};{{N;L};{I;{{{Q;{H;J}};,};{F;{.;B}}}}}};{{E;{T;{{{G;{{X;Z};Y}};C};{P;{';V}}}}};{{S;A};_}}}622
Cela peut aussi se représenter sous forme d'arbre :
O 1111
M 11101
D 11100
R 1101
U 1100
N 1011
L 1010
I 1001
Q 1000111
H 10001101
J 10001100
, 100010
F 100001
. 1000001
B 1000000
E 011
T 0101
G 0100111
X 010011011
Z 010011010
Y 01001100
C 010010
P 010001
' 0100001
V 0100000
S 0011
A 0010
_ 000
Algorithme de compression de Huffman
22 mai 2013
Sommaire général