Algorithme de compression de Burrows-Wheeler
Sujet propos´e par Jean-Pierre Tillich
Difficult´e : ** (moyenne)
1 Quelques mots sur le sujet
Le but de ce projet est de r´ealiser et de comprendre comment fonctionne l’algorithme de compression
bzip2 ainsi que l’algorithme de d´ecompression bunzip2 utilis´es fr´equemment en pratique et qui donnent
souvent des taux de compression meilleurs que l’algorithme de Lempel-Ziv (utilis´e dans zip, gzip par
exemple). Cet algorithme de compression fait appel `a de nombreuses transformations : transformation
de Burrows-Wheeler, algorithme de compression de Huffman adaptatif, transformation “move-to-front”
et fournit un bon panorama de diff´erentes techniques de compression. Certaines de ces transformations
comme la transformation “move-to-front” sont tr`es simples `a impl´ementer, d’autres sont en revanche plus
d´elicates `a mettre en oeuvre si l’on veut une impl´ementation efficace. Ainsi, bien que la transformation
de Burrows-Wheeler revient essentiellement `a impl´ementer un tri, le caract`ere sp´ecifique des chaˆınes `a
trier requiert un traitement sp´ecifique si l’on veut une bonne vitesse de compression sur tous les types
de texte. On verra notamment comment mettre `a profit ici les techniques de tri `a base d’arbres suffixes.
De mani`ere g´en´erale, l’algorithme de compression de Burrows Wheeler fournit une bonne illustration
de l’inerˆet d’utiliser diverses techniques algorithmiques sur les arbres pour obtenir une impl´ementation
efficace.
2 Quelques g´en´eralit´es sur la compression
Le texte `a compresser sera vu comme une suite x0x1. . . xn1de symboles pris dans un alphabet A.
Un algorithme de compression (sans perte) consiste `a calculer une suite binaire z0, z1,...zm1`a partir
de la suite pr´ec´edente de telle mani`ere `a ce qu’il soit possible de retrouver la suite x0x1. . . xn1d’origine
`a partir de la seule suite z0z1. . . zn1. Le taux de compression est d´efini par le rapport m
log2|A|n(ici |A|
d´esigne le cardinal de l’alphabet). Il vous est conseill´e de choisir A={0,1}8(cela reviendra donc `a lire
votre texte octet par octet).
3 L’algorithme de compression de Huffman adaptatif
On commencera ce projet par l’impl´ementation d’un algorithme de compression assez rudimentaire
qui est souvent utilis´e, c’est l’algorithme de Huffman adaptatif. On appelle A={0,1}8l’alphabet du texte.
Soit x0. . . xn1une suite de nsymboles de Aque l’on veut compresser. L’algorithme de compression
de Huffman adaptatif code chacun des xipar une s´equence binaire yi=y1
iy2
i. . . yli
io`u les yj
isont des
bits et lirepr´esente la longueur binaire du codage du symbole xi. La equence compress´ee est alors la
concat´enation des mots binaires yi:y0. . . yn1. Il se peut que certaines des longueurs lisoient sup´erieures
`a log2|A|, mais la longueur moyenne de ces liest elle en g´en´eral inf´erieure ou ´egale `a cette quantit´e. Le
texte est donc effectivement compress´e. En substance, l’id´ee est de coder les symboles fr´equents avec des
chaˆınes binaires courtes alors que les lettres peu fr´equentes sont coees avec des chaˆınes plus longues.
L’algorithme est dit adaptatif car il calcule `a chaque instant tles fr´equences d’apparition de chaque
1
symbole de Adans la suite d’octets x0. . . xt. En fonction de ces fr´equences il calcule le mot binaire yt
“optimal” par lequel on va coder xt. On utilise pour cela les arbres de Huffman.
3.1 Le codage de Huffman (non adaptatif)
Pour expliquer l’algorithme de Huffman adaptatif, consid´erons d’abord l’algorithme de Huffman non
adaptatif. Pour cela, nous supposons que nous connaissons pour chaque symbole ade l’alphabet Asa
fr´equence d’apparition f(a). Cela r´esulte soit d’un mod`ele pr´ealable pour le type de fichier `a compresser
ou par un calcul des fr´equences d’apparition de chaque symbole dans le texte `a compresser. Le codage de
Huffman (non adaptatif) consiste `a calculer dans un premier temps un arbre binaire dont les feuilles sont
associ´ees aux symboles de A. On appelle cet arbre l’arbre de Huffman associ´e `a l’ensemble {(a, f (a)), a
A}. On utilise ensuite cet arbre pour coder un symbole aen consid´erant l’unique chemin menant de la
racine de l’arbre binaire `a la feuille de l’arbre associ´e `a a. Ce chemin peut se coder par une suite de 0 et
1, 0 indiquant que l’on emprunte le fils gauche, 1 le fils droit. Ainsi une feuille `a laquelle on peut acc´eder
en empruntant d’abord le fils gauche de la racine, puis le fils droit, puis le fils droit de ce fils droit se
codera par la suite binaire 011. A titre d’exemple, voici un arbre obtenu pour un alphabet de 4 symboles,
A={a, b, c, d}et les codages binaires correspondant.
d : 111
a
b
cd
a : 0
b : 10
c : 110
L’inerˆet du codage de Huffman est de minimiser la longueur moyenne ¯
ldu codage binaire par symbole
(parmi l’ensemble de tous les codages binaires dont on peut inverser le codage, c’est `a dire retrou-
ver la s´equence de symboles d’origine x0. . . xn1`a partir de la concat´enation des mots binaires yi,yi
repr´esentant le codage du symbole xi), c’est `a dire
¯
ldef
=X
a∈A
f(a)l(a)
o`u l(a) est la longueur binaire du codage du symbole a.
L’arbre binaire utilis´e pour le codage de Huffman est obtenu par la proc´edure suivante d´ecrite dans
l’algorithme 1. L’arbre binaire de l’exemple pr´ec´edent aurait ´et´e ainsi obtenu si les fr´equences avaient
´et´e les suivantes : f(a)=0.5, f(b)=0.25, f(c) = 0.15, f(d)=0.1.
Question 1 D´ecrire bri`evement une impl´ementation efficace de cet algorithme. Quelle est sa com-
plexit´e ?
3.2 L’algorithme de Huffman adaptatif
Un des inconenients majeurs de l’algorithme de compression de Huffman est de n´ecessiter d’ inclure
dans le fichier d´ecompress´e une description de l’arbre binaire utilis´e pour le codage ou de la table de
codage associ´ee. En effet, `a la d´ecompression, on ne connait pas a priori les fr´equences des symboles du
texte `a compresser (alors qu’`a la compression, mˆeme sans mod`ele pr´ealable pour le texte ces fr´equences
peuvent ˆetre calcul´ees `a partir du texte lui-mˆeme). On n’est donc pas capable de reconstituer l’arbre
2
Algorithme 1 Huffman (non adaptatif)
INPUT: {(a, f(a) : a∈ A}
OUTPUT: l’arbre binaire Tutilis´e pour le codage de Huffman
E← ∅
for ain Ado
Construire un arbre t(a) r´eduit `a une racine portant deux informations, le symbole aet la fr´equence
f(a).
EE∪ {t(a)}
while |E|>1do
extraire (et supprimer) de Eles deux arbres t1et t2dont les racines portent la fr´equence la plus
petite
Construire un arbre tayant une racine de fr´equence f1+f2o`u fiest la f´equence port´ee par la racine
de ti.
Rajouter t`a E
return l’unique arbre dans E
binaire sous-jacent `a partir de la seule concat´enation des codages binaires yides symboles xidu texte `a
compresser. Dans ce cas, il serait donc impossible de reconstituer la suite de symboles d’origine. Il existe
un moyen de contourner ce probl`eme au moyen de l’algorithme de Huffman adaptatif. Voyons d’abord
comment effectuer le codage.
Huffman adaptatif – Codage. Supposons que nous ayons d´eja lu tcaract`eres dans le texte,
correspondant `a Ksymboles distincts. Soit {a0, . . . , aK1}ces symboles. soit fkla fr´equence d’apparition
de akdans la s´equence `a compresser x0. . . xt1. Nous consid´erons ´egalement un symbole fourre-
tout aKauquel on attribue une fr´equence nulle : fK= 0.
Nous calculons l’arbre de Huffman Ttassoci´e `a l’ensemble {(ai, fi),0iK}.
le t+ 1-`eme symbole est lu et est cod´ee
par son mot de code s’il existe,
par le K+ 1-`eme mot de code suivi du code ascii ou unicode du symbole sinon.
Huffman adaptatif – D´ecodage. L’arbre initial est constitu´e d’une unique feuille, celle du symbole
fourre-tout. Jusqu’`a ´epuisement, on parcourt l’arbre en lisant les bits du texte cod´e (’0’ `a gauche, ’1’ `a
droite) jusqu’`a arriver `a une feuille
s’il n’est pas associ´e au symbole fourre-tout
on imprime le symbole correspondant,
on met `a jour l’arbre,
sinon, il s’agit du symbole fourre-tout
on lit les 8 bits suivants pour obtenir le code ascii d’une lettre que l’on imprime
on ajoute une feuille dans l’arbre,
on met `a jour l’arbre.
L’arbre de Huffman est donc amener `a changer `a chaque instant. N´eanmoins, les fr´equences ne
changent que tr`es peu apr`es un certain temps entre deux instants cons´ecutifs. On s’attend donc `a ce que
Ttet Tt+1 soient tr`es proches l’un de l’autre.
Question 2 Proposer un moyen efficace de mettre `a jour l’arbre de Huffman Ttpour obtenir Tt+1.
Quelle est la complexit´e de votre algorithme ? Impl´ementer l’algorithme de compression et d´ecompression
associ´e et mesurez le taux de compression sur diff´erentes types de fichier.
4 La transformation de Burrows-Wheeler
La transformation de Burrows-Wheeler n’est pas un algorithme de compression. Son int´erˆet est de
r´ealiser une transformation sur la suite x0. . . xn1`a compresser qui va permettre d’am´eliorer le taux
de compression de l’algorithme de Huffman qui est utilis´e ult´erieurement. En substance elle associe au
texte une certaine permutation z1. . . znde ce dernier et un indice compris entre 0 et n1. Ainsi, le
3
texte apr`es transformation est mˆeme l´eg`erement plus long que le texte initial. En revanche, il est sous
une forme qui va permettre d’exploiter de mani`ere significative des r´ep´etitions de motif qui se produisent
dans ce dernier. Des r´ep´etitions de motif dans ce dernier conduisent en effet `a des r´ep´etitions de symboles
identiques dans la s´equence z1. . . zn. Une tr`es bonne introduction `a cette transformation est donn´ee dans
l’article http://www.dogma.net/markn/articles/bwt/bwt.htm.
Question 3 Lire cet article et impl´ementer la transformation de Burrows-Wheeler ainsi que la trans-
formation inverse de mani`ere na¨ıve.
Question 4 Quelle est la complexit´e de votre impl´ementation dans le pire des cas si l’on compte une
comparaison entre octets de mani`ere unitaire ?
Question 5 Lire maintenant l’article de Burrows et Wheeler [1] (et notamment la section 4) qui se
trouve sur http://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf. On consultera ´egalement
l’article de McCreight de construction d’un arbre suffixe .
Question 6 Expliquer comment fonctionne l’algorithme Q de la section 4 dans l’article de Burrows-
Wheeler. Quelle est sa complexit´e dans le pire des cas ? Impl´ementer l’algorithme Q ainsi que l’algorithme
`a base d’arbres suffixes de McCreight [2]. Comparer vos impl´ementations sur diff´erents exemples de texte.
Question 7 Proposer ´eventuellement des am´eliorations `a l’algorithme Q.
5 La transformation “Move to front”
Question 8 Impl´ementer l’algorithme de compression de texte consistant `a effectuer dans un premier
temps la transformation de Burrows-Wheeler puis `a appliquer l’algorithme de Huffman adaptatif. Essayez
cet algorithme sur plusieurs types de fichier texte. Am´eliorez-vous le taux de compression du texte par
rapport `a la m´ethode consistant `a utiliser uniquement l’algorithme de Huffman adaptatif ? Proposer une
explication de ce ph´enom`ene.
Comme cela a ´et´e bri`evement expliqu´e dans la section 4 (et expliqu´e plus en d´etail dans l’article
[1]), la transformation de Burrows-Wheeler conduit naturellement `a une permutation z1. . . zndu texte
initial comportant des plages de symboles identiques. Un des moyens d’exploiter cette structure est
de transformer la suite d’octets z1. . . znen une suite d’entiers positifs u1. . . unpar la transformation
“move-to-front”. Le principe en est extrˆemement simple. La transformation “Move-to-front” consiste
tout simplement `a effectuer la transformation suivante A titre d’illustration, si le tableau Yest constitu´e
Algorithme 2 Move-to-Front
INPUT: z0. . . zn1
OUTPUT: u0. . . un1Ytableau o`u l’on plac´e tous les caract`eres de l’alphabet du texte dans un
ordre pr´ed´efini.
for i= 0 to n1do
uinombre de caract`eres pr´ec´edant le caract`ere zidans le tableau Y
placer le caract`ere zien tˆete du tableau Yen d´ecalant les autres caract`eres du tableau vers la droite
par [0a0,0, b0,0c0,0r0] et que la suite zest donn´ee par la chaˆıne de caract`eres ”caraab”, la suite uproduite
est ´egale `a 2,1,3,1,0,3. Si la suite z0. . . zn1contient de nombreuses rafales de symboles identiques, on
s’attend notamment `a ce que le 0 apparaisse tr`es souvent dans la s´equence produite.
Question 9 Impl´ementer la transformation “move-to-front”, ainsi que la transformation inverse.
Question 10 Mesurer le taux de compression sur diff´erents types de fichier obtenus en effectuant
d’abord la transformation de Burrows-Wheeler, puis la transformation Move-to-front et enfin l’algorithme
de Huffman.
4
6 Coder de larges plages de z´eros
La transformation “move-to-front” appliqu´ee `a la sortie de l’algorithme de Burrows-Wheeler conduit
fr´equemment `a de longues plages de z´ero.
Question 11 Proposer une m´ethode pour coder des plages de z´ero qui permettrait d’am´eliorer le taux
de compression obtenue dans la question pr´ec´edente en appliquant maintenant la s´equence de transfor-
mations suivantes au fichier `a compresser : transformation de Burrows-Wheeler, puis transformation
Move-to-front, codage des plages de z´ero et enfin algorithme de Huffman.
R´ef´erences
[1] M. Burrows, D. Wheeler, “A block sorting lossless data compres-
sion algorithm”, Technical Report 124, Digital Equipment Corporation,
http://www.hpl.hp.com/techreports/Compaq-DEC/SRC-RR-124.pdf.
[2] E.M. McCreight, “A space economical suffix tree construction algorithm”, Journal of the ACM, Vol.
32, No. 2, Avril 1976, p. 262-272.
5
1 / 5 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 !