Codage de Huffman
Pour transmettre ou stocker un document electronique il est souvent tres pratique de compresser ce
document prealablement afin de diminuer le volume des donnees a transferer et sans alterer son
contenu. Dans ce sujet vous allez developper une methode de compression tres efficace, appelee
codage de Huffman d'apres le nom de son inventeur.
Le code de Huffman s applique principalement a la compression de donnees textuelles. Son principe
est le suivant dans l'ordinateur chaque caractere de l'alphabet est represente par un chiffre
variant entre 0 et 255 (le code ASaI). Ce chiffre exprime en base 2 correspond CI une serie de 8
bits. Par exemple pour le caractere ' ' on aura le code 01100001. Ainsi pour enregistrer un texte de n
caracteres dans l'ordinateur on a generalement besoin de 8n bits. Le but du codage de Huffman est
de reduire le nombre de bits necessaire pour chaque caractere. Plus precisement le nombre de bits
necessaire va devenir une fonction de la frequence du caractere dans le texte CI compresser: plus un
caractere est frequent moins il faudra de bit pour le coder. Le codage se deroule en trois phases:
tout d'abord on commence par compter le nombre d' occurrences de chaque caractere , Puis en
utilisant ces occurrences, on construit un arbre binaire dont les feuilles sont les caracteres ; cet
arbre permet d'associer CI chaque caractere un code binaire optimal, enfin dans la troisieme etape
on remplace chaque caractere dans le texte par son code optimal.
Arbres binaires.
Le but est de programmer une classe ((TNoeudBinaire)) representant les arbres binaires. Un arbre
binaire est un arbre tel que chaque nreud a au plus deux descendants: un CI gauche et un CI droite.
arbre binaire represente ci contre (fig 1) comporte 5 nreuds notes ((A, B
, D, E)) Le nreud ((A )) a deux descendants. (( B)) CI gauche et ((C)) CI droite.
Le nreud ((B )) a deux descendants (.(D )) a gauche et .(.(E )) a droite. Enfin les
nreuds .(C, D, E)) n ont aucun descendant, ce sont des feuilles.
La classe .(TNoeudBinaire)) que vous allez programmer permet de
representer recursivement les arbres binaires. Chaque instance de
((TNoeudBinaire )) possede quatre variables une pour le contenu du nreud
deux .((TNoeudBinaire)) gauche et droite pour les deux descendants, et enfin un (.(TNoeudBinaire))
parent pour le nreud directement au-dessus. Par exemple pour l'arbre figure 1 le nreud (.( B)) a pour
descendant gauche et droit respectivement.(.( D)) et.( E)) et pour parent le nreud .( A )) quant CI lui
a pas de parent (c est la racine).
1. Ecrire un constructeur pour la classe .(.(TNoeudBinaire )) prenant en parametre un Object
contenu. Ce constructeur construit un nouveau nreud contenant l'objet contenu, n ayant
ni parent, ni descendant.
2. Ecrire un constructeur pour la classe (.(TNoeudBinaire)) prenant en parametre un object
contenu et deux ((TNoeudBinaire)) gauche et droite. Ce constructeur construit
.(.(TNoeudBinaire)) contenant l'objet contenu et dont les branches gauche et droite sont
respectivement gauche et droite.
3. Ecrire une methode (( EstUneFeuile( ))) renvoyant
.(.(
true )) si le .(.(TNoeudBinaire))
appelant n a pas de descendants CI gauche ni CI droite.
4. Ecrire une methode.(( EstLaRacine( ))) renvoyant.( true )) si le ((TNoeudBinaire))
appelant n a pas de parent.
Fig 1 : Arbre binaire
1/5