Cet algorithme est couramment utilisé pour la compression, mais son champ d'application ne se restreint pas à ce domaine. Il est aussi utilisé dans la vidéo et dans l'audio. En fait, on lui adjoint la plupart du temps une autre méthode de compression qui, elle, se fait avec perte.

Le principe du codage de Huffman est le suivant : plus un motif est fréquent, plus il sera codé sur un petit nombre de bits. Il offre une méthode pour obtenir la manière de coder les informations à partir de leur probabilité d'apparition.

1. Présentation :

La méthode de compression Huffman consiste à diminuer au maximum le nombre de bits utilisés pour coder un fragment d’information. Cette méthode est une méthode de compression sans perte.

Supposons que notre fichier soit extrêmement simple, et constitué d'une phrase : « Manu fait Huffman ».

Il y a 15 caractères dans ce fichier; chaque caractère étant codé par un octet de 8bits (codage ASCII). Cela signifie donc 15 octets, ou encore 120 bits.

Le fragment d’information sera un caractère. Plus le fragment sera grand, plus les possibilités seront grandes et donc la mise en œuvre complexe à exécuter. L’algorithme de Huffman se base sur la fréquence d’apparition d’un fragment pour le coder : plus un fragment est fréquent, moins on utilisera de bits pour le coder. Dans notre exemple de fichier texte, si on considère que notre fragment est la taille d’un caractère, on peut remarquer qu’ils n’ont pas tous la même fréquence d’apparition : par exemple la lettre ‘A’ est largement plus fréquente que la lettre ‘T’ par conséquent la lettre ‘A’ sera codée sur 2 bits alors que la lettre ‘T’ en prendra 4.


2. Création de la table des fréquences d’apparition des fragments :

Cette table consiste en un comptage empirique des fragments au sein des données à compresser. Reprenons l’exemple d’un texte : nous allons analyser la phrase : « Manu fait Huffman »

Pour simplifier l’exemple, nous ignorerons la casse et les espaces :

Tableau1



3. Création de l’arbre.

Nous allons maintenant construire l’arbre à partir de la liste ordonnée de nœuds. La construction est très facile : il suffit de prendre les deux nœuds les moins fréquents (I et T) et de les ajouter comme fils d’un nouveau nœud qui aura pour fréquence la somme des deux, puis continuer en ajoutant toujours les plus petits nœuds.


neud1



Il suffit de réitérer cette étape jusqu’à ne plus avoir qu’un seul nœud. Après cela, descendre vers la gauche équivaut à un 0, et descendre vers la droite à un 1.

neud2




4. Résultat

Et voici maintenant, transcrit avec notre nouveau code, la phrase de départ : 10000101110001001110111111011100010110000101

Ce qui nous fait 44 bits, au lieu de 120 au départ! Cela correspond à un taux de compression de 63 %.

Tableau des lettres codées.

Le_cod2

Le fait d'avoir généré un code en se servant d'un arbre binaire assure qu'aucun code ne peut être le préfixe d'un autre. Vous pouvez vérifier qu'à l'aide de la table de codage, il n'y a aucune ambiguïté possible pour décoder notre mot compressé!

En pratique, la table de codage étant spécifique à chaque fichier, il est indispensable de l'incorporer au fichier compressé, de manière à ce que le décryptage soit possible. Ce qui signifie que la taille du fichier compressé doit être augmentée d'autant. Dans le cas de notre fichier exemple, il faudrait incorporer AU MINIMUM 22 octets de plus pour insérer la table de codage, et le taux de compression n'est plus aussi bon.

Toutefois, pour des fichiers suffisamment larges (à partir de quelques kilooctets) le surplus de taille généré par la table de codage devient négligeable par rapport à l'ensemble du fichier. Concrètement, l'algorithme de Huffman permet d'obtenir des taux de compression typiques compris entre 30% et 60%.


5. Remarque

On définit le ratio de compression de la manière suivante :
Le_cod1

Le codage HUFFMAN