Projet D Informatique M1BI - Compression Et Décompression de Texte. 1 Généralités Sur La Compression - Décompression de Texte
Projet D Informatique M1BI - Compression Et Décompression de Texte. 1 Généralités Sur La Compression - Décompression de Texte
Projet D Informatique M1BI - Compression Et Décompression de Texte. 1 Généralités Sur La Compression - Décompression de Texte
2 L’algorithme RLE.
L’algorithme rle est un algorithme compressant des fichiers contenant des caractères se répétant plusieurs
fois à la suite. L’idée consiste simplement à remplacer une suite du même caractère par ce caractère suivie d’un
chiffre indiquant son nombre de répétitions. Ainsi, la chaı̂ne "aaaa" sera encodée par la chaı̂ne "a3" indiquant
que l’on a le caractère ’a’ suivie de 3 répétitions du même caractère. Cette méthode présente toutefois un
problème. Autant "aaaa" sera compressé, autant "bc" sera encodé par "b0c0", augmentant ainsi les données
au lieu de les compresser.
On propose de modifier légèrement cet algorithme et d’attendre de lire 2 fois de suite le même caractère pour
ensuite indiquer le nombre de répétitions qui suivent. Ainsi, "aaaa" sera encodé par "aa2" et, par exemple,
"aaaabcbb" sera encodé par "aa2bcbb0".
Cette algorithme ne fonctionne bien sûr que si le texte initial contient en moyenne beaucoup de répétitions
successives des caractères.
La décompression est alors relativement simple. On lit les caractères un par un. Tant que l’on ne lit pas
deux fois le même caractère, on se contente d’écrire le caractère lu dans le fichier résultat. Lorsqu’on lit deux
fois de suite le même caractère, on sait que suit un chiffre indiquant le nombre de répétitions restantes pour ce
caractère. Il suffit alors d’écrire autant de fois que nécessaire le caractère en question dans le fichier résultat.
3 L’algorithme de Huffman.
3.1 Principe de l’algorithme
Dans un fichier texte, chaque caractère du texte occupe le même espace physique, soit 8 bits (voir aussi 3.5
pour plus de détails là-dessus). L’idée est de changer cela, en donnant aux caractères les plus fréquents dans
le texte un codage plus court, quitte à donner à certains autres caractère peu fréquent un codage de plus de 8
bits.
1
Université Paris Diderot Projet d’informatique M1BI Année 2008
Pour cela, on va d’abord calculer les probabilités d’apparence de chaque caractère dans le texte à compresser.
Par exemple, supposons que l’on veuille compresser le texte "badbbacddcab", les probabilités1 de chaque car-
actère sont :
caractère probabilité
a 3
b 4
c 2
d 3
L’idée est alors d’associer aux caractères un code (binaire) d’autant moins long que le caractère est fréquent.
On pourrait, pour les probabilités ci-dessus, être tenté de prendre pour b le code 0, pour a le code 1, pour d
le code 10 et pour c le code 11. Ceci serait optimal en terme de longueur des codes mais malheureusement
le décodage du texte (la décompression) serait alors impossible. En effet, avec de tels codes, 101 pourrait être
décodé en "aba" mais aussi en "da".
On doit donc trouver des codes, certes moins optimal, mais tel que le décodage puisse s’effectuer sans
ambiguı̈té. C’est ce que Mr. Huffman (David A. Huffman, 1925-1999) nous propose en utilisant, dans notre
exemple, les codes suivants :
caractère code
a 01
b 00
c 11
d 10
Avec ces codes, 001011 par exemple, ne peut être décodé que par "bdc". Et puisque sur un ordinateur, un
caractère est normalement encodé sur 8 bits, "bdc" occupe 3 ∗ 8 = 24 bits, à comparer avec les 6 bits de son
code de Huffman. On a bien compressé le texte.
7 5
Dans cet arbre, les feuilles sont les caractères (avec leurs probabilités entre parenthèse) alors que les noeuds
représentent des caractères fictifs dont la probabilité est la somme des probabilités de leurs fils. Une fois cet
arbre construit, le code d’un caractère est facilement trouvé en suivant le chemin dans l’arbre depuis la racine
jusqu’au caractère et en prenant 0 lorsque l’on va à gauche et 1 lorsque l’on va à droite.
Comment créer l’arbre de Huffman ? Pour cela, on utilise un tas dont les éléments sont eux-même des arbres
de Huffman. Dans la suite, on appellera probabilité de l’arbre la probabilité du noeud racine d’un arbre donné.
On commence en remplissant le tas avec une feuille pour chaque caractère, et de façon à ce que le tas soit trié
par probabilité croissante. Autrement dit, initialement, l’arbre au sommet du tas contiendra le caractère avec
la plus petite probabilité (dans notre exemple, le caractère c). Ensuite, et tant que le tas contient plus d’un
élément, on récupère les deux derniers éléments du tas (qui sont donc les arbres de plus petites probabilités),
on créer un nouveau noeud fictif ayant pour fils les deux arbres récupérés et comme probabilité la somme des
probabilités de ces deux fils. Enfin, on insère l’arbre ainsi créé dans le tas de façon à ce que ce dernier reste trié
1 Ce qu’on appelle probabilité ici n’est que le nombre d’occurrences de chaque caractère. Pour avoir une probabilité d’apparence
il faudrait diviser ces chiffres par le nombre total de caractère du texte, mais cela ne changerait rien a notre algorithme.
2
Université Paris Diderot Projet d’informatique M1BI Année 2008
par probabilité croissante, et on continue. Lorsqu’il n’y a plus qu’un seul élément sur le tas, celui-ci est l’arbre
de Huffman.
Sur notre exemple précédent, la construction de l’arbre de Huffman suit les étapes suivantes :
On commence avec le tas contenant une feuille par caractère. Le tas est trié en fonction des probabilités :
On récupère les deux éléments au sommet du tas, qu’on joint par un noeud fictif de probabilité la somme des
probabilités de ces deux éléments :
b (4) a (3) 5
d (3) c (2)
Puis on insère l’arbre nouvellement créé à sa place dans le tas.
5 b (4) a (3)
d (3) c (2)
On recommence avec les deux nouveaux éléments au sommet.
5 7
7 5
12
7 5
12
7 5
3.3 Compression
L’algorithme de compression lit en entrée un fichier quelconque et écrit un fichier résultat contenant un
entête suivit de la suite de code de Huffman correspondant au fichier d’entrée. L’algorithme peut se résumer
ainsi :
– On compte, dans le fichier d’entrée, quels caractères apparaissent et combien de fois chacun ;
3
Université Paris Diderot Projet d’informatique M1BI Année 2008
3.4 Décompression
L’algorithme de décompression lit en entrée un fichier compressé avec l’algorithme ci-dessus, et donc com-
prenant un entête suivie d’une suite de code de Huffman, et écrit un fichier correspondant à la décompression
du fichier d’entrée. L’algorithme peut se résumer ainsi :
– On lit l’entête du fichier compressé, récupérant ainsi la liste des caractères avec leurs occurrences, et le
nombre de caractères à décoder ;
– On reconstruit l’arbre de Huffman à partir de la liste lue ;
– On lit alors bit par bit le reste des données du fichier compressé. On va alors se déplacer dans l’arbre de
Huffman. Lorsqu’on lit un 0 on se déplace à gauche, lorsqu’on lit un 1 on se déplace à droite. Et lorsqu’on
arrive à une feuille de l’arbre, on a décodé un caractère : celui de la feuille en question. On écrit alors ce
caractère dans le fichier résultat et on continue avec le bit suivant en repartant du noeud racine de l’arbre
de Huffman ;
– Lorsque l’on a lu le bon nombre de caractère, on a correctement décompressé notre fichier.
4 Réalisation du projet
Le but du projet est d’écrire un programme C effectuant la compression et la décompression d’un fichier
avec l’algorithme rle et l’algorithme basé sur les codes de Huffman. Pour cela, le projet comporte 2 parties.
La première partie consiste à coder l’algorithme rle et fait office d’échauffement. La seconde partie concerne
Huffman.
4
Université Paris Diderot Projet d’informatique M1BI Année 2008
5
Université Paris Diderot Projet d’informatique M1BI Année 2008
5 Organisation du projet
Le projet doit être réalisé en monôme. Un soin tout particulier devra être apporté à l’indentation et le code
devra être commenté correctement. On évitera également de coder l’intégralité du projet dans un seul fichier. La
date limite de rendu du projet est fixée au Vendredi 15 Février, 23h59. Des soutenances seront organisées
la semaine du 18 Février. Le rendu s’effectuera par mail à l’adresse sylvain.lebresne@pps.jussieu.fr. Ce
mail devra contenir :
– Tous les fichiers source (.c et .h) de votre projet. Chaque fichier source devra commencer par votre nom
et prénom en commentaire ;
– Un fichier Makefile permettant la compilation de votre projet, et ce simplement à l’aide de la commande
make ;
– Un simple fichier texte expliquant en quelques lignes comment utiliser le (les) binaire(s) créé(s) lors de la
compilation ;
– Un document de quelques pages expliquant les difficultés que vous avez rencontrées et les solutions que
vous y avez apportées.