INF-145 Programmation avancée et langage C Automne 2013 / Page 1
École de technologie supérieure Frédérick Henri
INF-145 Travail pratique #3
Travail en équipe de 2
L’algorithme de compression de LZW
1 Objectifs
Retour sur les notions de pointeur, d’enregistrement et de fichier binaire.
Mise en place d’une petite liste chaînée.
Apprentissage d’un algorithme de compression.
2 Description du problème: Compresser un fichier ?
La compression consiste à prendre un fichier et à diminuer sa taille. Cela a pour effet
de rendre le fichier inutilisable (comme c’est le cas pour un .zip) ou de dégrader sa
qualité (comme c’est le cas pour un .jpg ou .mp3).
Certains diront que la compression permet d’écrire sur un support (disquette ou CD)
un document qui autrement ne pourrait y être inscrit en raison de sa grosseur.
Cependant, dans cette ère la télécommunication s’infiltre partout, le principal
avantage de la compression repose sur l’équation suivante :
Temps de
compression +
Temps de
transmission du
document compressé
+ Temps de
décompression <
Temps de transmission
du document non
compressé
Votre travail consiste à écrire un programme en C permettant de compresser un
fichier. Vous devez utiliser l’algorithme LZW décrit ci-dessous et utiliser les modules
spécifiés. Prenez note que ce travail porte sur un algorithme servant à la
compression de plusieurs types de fichiers dont les .GIF, les .TIFF et les .ZIP.
INF-145 Programmation avancée et langage C Automne 2013 / Page 2
3 Description de l’algorithme de compression de Lempel Ziv
Welch
Voici l’algorithme général suivi d’une trace pour bien saisir son fonctionnement :
chaîne : t_chaîne // Une chaîne pouvant contenir '\0'.
caractère : t_caractère // Un caractère non signé.
dictionnaire : t_dictionnaire // Un dictionnaire de chaînes.
ajouter tous les codes ASCII au dictionnaire
tant que (on peut lire un caractère dans le fichier source)
caractère lire_un_caractère(fichier_source)
si (dictionnaire contient la chaîne chaîne+caractère) alors
chaîne chaîne+caractère // On concatène les deux.
sinon
si (le dictionnaire contient moins de 2
12
chaînes) alors
ajouter chaîne+caractère dans le dictionnaire
fin si
écrire le code de chaîne dans le fichier destination
chaîne caractere;
fin si
fin tant que
écrire le code de chaîne dans le fichier destination
Pour bien saisir l’exemple qui suit, il faut savoir que lorsqu'on écrit le code de la
chaîne dans le fichier destination, celui-ci prend 12 bits. En effet, l’objectif de
l’algorithme est de trouver des chaînes qui se répètent et de les remplacer par un
nombre (un code). Puisqu’il y a en partant 256 chaînes possibles (les codes ASCII),
on ne peut pas conserver ces codes sur 8 bits. Nous encoderons donc les chaînes sur
12, 13 ou 14 bits (arbitrairement, nous choisissons 12). Voici un exemple de
fonctionnement de l’algorithme les écritures dans le fichier destination sont
présentées sous forme de lettres et de bits pour mieux comprendre :
INF-145 Programmation avancée et langage C Automne 2013 / Page 3
Exemple de compression
Contenu du fichier source : LE PAPA PALE
Remplissage du dictionnaire : 0 = "\0", …, 48 = "0", …, 97 = "a", etc.
Contenu de
chaîne :
Caractère lu
dans le fichier
source :
Ajout au
dictionnaire : Écriture binaire
dans le fichier
Équivalent de ce
qui a été écrit (pour
la compréhension)
"" (vide) 'L' - - -
"L" 'E' 256 = "LE"
000001001100 76 = "L"
"E" ' '
(blanc) 257 = "E "
000001000101 69 = "E"
" " (blanc)
'P' 258 = " P"
000000100000 32 = " "
(blanc)
"P" 'A' 259 = "PA"
000001010000 80 = "P"
"A" 'P' 260 = "AP"
000001000001 65 = "A"
"P" 'A' - - -
"PA" ' '
(blanc)
261 =
"PA " 000100000011 259 = "PA"
" "
(blanc) 'P' - - -
" P" 'A' 262 =
" PA" 000100000010 258 = " P"
"A" 'L' 263 = "AL"
000001000001 65 = "A"
"L" 'E' - - -
"LE" - - 000100000000 256 = "LE"
Ainsi, le fichier destination contiendra les bits suivants :
000001001100 000001000101 000000100000 000001010000 000001000001
000100000011 000100000010 000001000001 000100000000
qui correspondent à écrire les entiers 76, 69, 32, 80, 65, 259, 258, 65 et 256 sur 12
bits chacun.
INF-145 Programmation avancée et langage C Automne 2013 / Page 4
4 Description de l’algorithme de décompression de Lempel Ziv
Welch
Voici l’algorithme général permettant d’effectuer la décompression d’un fichier
compressé à l’aide de l’algorithme précédent.
chaîne : t_chaîne // Une chaîne pouvant contenir ‘\0’.
caractère : t_caractère // Un caractère non signé.
dictionnaire : t_dictionnaire // Un dictionnaire de chaînes.
vieux_code : entier
nouveau_code : entier
ajouter tous les codes ASCII au dictionnaire
vieux_code lire_un_code(fichier_source)
chaîne chercher la chaîne du vieux_code dans le dictionnaire
écrire_une_chaîne(chaîne, fichier destination)
caractère premier caractère de la chaîne
tant que (on peut lire un code dans le fichier source)
nouveau_code lire_code(fichier_source)
si (nouveau_code n’est pas present dans le dictionnaire) alors
chaîne chercher la chaîne du vieux_code dans le dictionnaire
chaîne chaîne + caractère // On concatène.
sinon
chaîne chercher la chaîne du nouveau_code dans le dictionnaire
fin si
écrire_une_chaîne(chaîne, fichier destination)
caractère premier caractère de chaîne
chaîne chercher la chaîne du vieux_code dans le dictionnaire
chaîne chaîne + caractère
si (le dictionnaire contient moins de 2
12
chaînes) alors
ajouter la chaîne dans le dictionnaire
fin si
vieux_code nouveau_code
fin tant que
INF-145 Programmation avancée et langage C Automne 2013 / Page 5
Exemple de décompression
Contenu du fichier source : 000001001100000001000101000000100000
(voir le résultat de la compression ci-dessus)
Remplissage du dictionnaire : 0 = "\0", …, 48 = "0", …, 97 = "a", etc.
AVANT LA BOUCLE :
vieux_code 000001001100 (76 = "L")
chaîne "L"
écriture de "L" dans le fichier destination
caractère 'L'
BOUCLE (1
ère
passe)
nouveau_code 000001000101 (69 = "E")
chaîne "E"
écriture de "E" dans le fichier destination
caractère 'E'
chaîne "LE"
ajout de 256 = "LE" dans le dictionnaire
vieux_code 69
BOUCLE (2
e
passe)
nouveau_code 000000100000 (32 = " ")
chaîne " "
écriture de " " dans le fichier destination
caractère ' '
chaîne "E "
ajout de 257 = "E " dans le dictionnaire
vieux_code 32
BOUCLE (3
e
passe)
nouveau_code 000001010000 (80 = "P")
chaîne "P"
écriture de "P" dans le fichier destination
caractère 'P'
chaîne " P"
ajout de 258 = " P" dans le dictionnaire
vieux_code 80
1 / 9 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !