# Compression de données/Transformée de Burrows-Wheeler

* Introduction
* Types de compression
* Techniques de compression sans perte
** Codage par répétition
*** Run-length encoding
** Codage entropique
*** Codage de Huffman
*** Codage de Shannon-Fano
** Codage par dictionnaire
*** Lempel-Ziv-Welch (LZW)
** Codage par modélisation de contexte
** Transformée de Burrows-Wheeler
** Archive de fichiers
* Techniques de compression avec pertes
** Le format JPEG 2000
* Taux de compression
* Bibliographie et liens
* Introduction
* Types de compression
* Techniques de compression sans perte
** Codage par répétition
*** Run-length encoding
** Codage entropique
*** Codage de Huffman
*** Codage de Shannon-Fano
** Codage par dictionnaire
*** Lempel-Ziv-Welch (LZW)
** Codage par modélisation de contexte
** Transformée de Burrows-Wheeler
** Archive de fichiers
* Techniques de compression avec pertes
** Le format JPEG 2000
* Taux de compression
* Bibliographie et liens
[ Modifier le sommaire ]
La transformée de Burrows-Wheeler, couramment désignée par le sigle BWT (pour Burrows-Wheeler Transform) est un prétraitement utilisé en compression de données. Inventée par Michael Burrows et David Wheeler, elle a été publiée en 1994, à la suite de travaux précédents de Wheeler en 1983. Il ne s'agit pas d'un algorithme de compression, car aucune réduction de taille n'est effectuée. Il s'agit d'une méthode de réorganisation des données : la probabilité que des caractères identiques initialement éloignés les uns des autres se retrouvent côte à côte dans le résultat est accrue.
La technique est à la base de l'algorithme de compression bzip2 qui est actuellement l'un de ceux offrant un des meilleurs taux de compression. Elle est aussi très utilisée en génomique, par exemple pour les problèmes d'alignement de lectures courtes issues des nouvelles technologies de séquençage d'ADN (ou d'ARN) ou pour des problèmes de comptage de mots (détection de répétitions).

## Fonctionnement

Tout d'abord, la chaîne de caractères à coder doit être copiée dans un tableau carré en décalant la chaîne d'un caractère vers la droite à chaque nouvelle ligne. Ces lignes sont ensuite classées par ordre alphabétique. Nous savons que, grâce au décalage, chaque dernière lettre de chaque ligne précède la première lettre de la même ligne, sauf pour la ligne originale dont on notera la position. De plus, comme les lignes sont rangées par ordre alphabétique, on peut retrouver la première colonne du tableau grâce à la dernière colonne.
Prenons un exemple : supposons que la chaîne à coder soit « TEXTUEL ». On réalise tout d'abord le tableau. La première lettre est marquée ici en rouge pour améliorer la lecture du tableau.
Puis l'on classe ces chaînes par ordre alphabétique :
Le texte codé est alors constitué de la dernière colonne précédée de la position du texte original, soit : « 4UTELXTE ». La position du texte original sert au décodage.

## Utilisation en compression

La transformation de Burrows et Wheeler n'apporte aucun gain de compression. Au contraire même, car il est nécessaire de transmettre la position du texte original pour le décodage.
Cependant, on observe que la transformée de textes relativement longs comportent de nombreuses répétitions contiguës de caractères car ils contiennent un nombre élevé de fois les mêmes mots. Cela provient du fait que la transformée de Burrows et Wheeler revient à trier les caractères par ordre alphabétique, puis à chaque fois écrire le caractère qui précédait dans le texte original. Vu qu'elle est construite par rotation, la dernière colonne est composée des caractères précédant. Un exemple flagrant est la transformation de « TEXTUELTEXTUEL » qui donne : « 7UUTTEELLXXTTEE ».
À des fins de compression donc, on utilise un algorithme de type MTF sur cette transformée. Les répétitions de caractères produiront beaucoup de zéros. Un codage de Huffman sur un tel résultat permet d'obtenir un taux élevé de compression.

## Décodage

Le décodage consiste à reconstruire le tableau complet à partir de sa dernière colonne (texte codé « UTELXTE ») à partir de laquelle on reconstruit la colonne « suivante », c’est-à-dire, par rotation, la première, dont on sait qu’elle est dans l’ordre alphabétique (« EELTTUX »). On colle alors la dernière colonne juste avant cette première colonne, puis on classe dans l’ordre alphabétique les couples de lettres obtenus pour construire les deux premières colonnes. On répète ensuite cette opération jusqu’à constituer le tableau complet dans lequel on retrouve le texte original donné par son numéro de ligne :
| Initiation | Tri | Collage | Tri | Collage | Tri |
| U T E L X T E | E E L T T U X | UE TE EL LT XT TU EX | EL EX LT TE TU UE XT | UEL TEX ELT LTE XTU TUE EXT | ELT EXT LTE TEX TUE UEL XTU |
| Collage | Tri | Collage | Tri | Collage | Tri |
| UELT TEXT ELTE LTEX XTUE TUEL EXTU | ELTE EXTU LTEX TEXT TUEL UELT XTUE | UELTE TEXTU ELTEX LTEXT XTUEL TUELT EXTUE | ELTEX EXTUE LTEXT TEXTU TUELT UELTE XTUEL | UELTEX TEXTUE ELTEXT LTEXTU XTUELT TUELTE EXTUEL | ELTEXT EXTUEL LTEXTU TEXTUE TUELTE UELTEX XTUELT |
| Collage | Tri | Sélection | | | |
| UELTEXT TEXTUEL ELTEXTU LTEXTUE XTUELTE TUELTEX EXTUELT | ELTEXTU EXTUELT LTEXTUE TEXTUEL TUELTEX UELTEXT XTUELTE | 1 2 3 ← 4 5 6 7 | | | |
On retrouve bien le texte original à la ligne dont le numéro avait été transmis avec le texte codé.
Vu que la chaîne transformée est constituée des caractères qui précèdent dans l'ordre alphabétique. Une autre manière d'appréhender ce décodage consiste à trier par ordre alphabétique et prendre à chaque fois le suivant dans la chaîne transformée.
* On trie les caractères par ordre alphabétique, on obtient : « EELTTUX ».
* Prendre celui qui correspond à l'indice 4 soit un T.
* Où était ce T dans le texte transformé? à l'indice 2. C'est le premier T et non celui à l'indice 6 car c'est le premier de la chaîne triée.
* Prendre celui qui correspond à l'indice 2 soit un E.
* Où était ce E dans le texte transformé? à l'indice 7. Ce n'est pas celui en position 3 car c'est le 2ème E dans la chaîne triée c'est donc le deuxième de la chaîne transformée.
* Prendre celui qui correspond à l'indice 7 soit un X.
etc.

## Références

* Michael Burrows, D. J. Wheeler: "A block-sorting lossless data compression algorithm", 10th May 1994, Digital SRC Research Report 124.
* Ben Langmead, Cole Trapnell, Mihai Pop and Steven Salzberg. "Ultrafast and memory-efficient alignment of short DNA sequences to the human genome": Genome Biology 2009, 10:R2