Entrée . Alphabet Nous donnons un exemple du résultat du codage de Huffman pour un code à cinq caractères et des poids donnés. Nous ne vérifierons pas s'il minimise L pour tous les codes, mais nous calculerons L et le comparerons à l' entropie de Shannon H de l'ensemble de poids donné ; le résultat est quasi optimal. Pour tout code biunique , c'est-à-dire décodable de manière unique , la somme des probabilités associées à chaque symbole est toujours inférieure ou égale à un. Dans cet exemple, cette somme est strictement égale à un ; par conséquent, le code est dit complet . Si ce n'est pas le cas, on peut toujours obtenir un code équivalent en ajoutant des symboles supplémentaires (associés à des probabilités nulles), afin de le rendre complet tout en conservant sa biunicité . Selon la définition de Shannon (1948) , le contenu informationnel h (en bits) de chaque symbole a<sub> i</sub> ayant une probabilité non nulle est L' entropie H (en bits) est la somme pondérée, sur tous les symboles avec une probabilité non nulle , du contenu informationnel de chaque symbole : (Remarque : Un symbole de probabilité nulle contribue à l'entropie de manière nulle, car En vertu du théorème de codage source de Shannon , l'entropie mesure la longueur minimale d'un mot de code théoriquement possible pour un alphabet donné, pondéré de la longueur du mot. Dans cet exemple, la longueur moyenne pondérée d'un mot de code est de 2,25 bits par symbole, soit légèrement supérieure à l'entropie calculée de 2,205 bits par symbole. Ce code est donc non seulement optimal (aucun autre code réalisable n'est plus performant), mais il est également très proche de la limite théorique établie par Shannon. En général, un code de Huffman n'est pas nécessairement unique. Ainsi, l'ensemble des codes de Huffman pour une distribution de probabilité donnée est un sous-ensemble non vide des codes minimisant Cette technique fonctionne en créant un arbre binaire de nœuds. Ceux-ci peuvent être stockés dans un tableau régulier , dont la taille dépend du nombre de symboles. Le processus commence avec les nœuds feuilles contenant les probabilités du symbole qu'ils représentent. Ensuite, il sélectionne les deux nœuds ayant la plus faible probabilité et crée un nouveau nœud interne dont ces deux nœuds sont les enfants. Le poids de ce nouveau nœud est égal à la somme des poids de ses enfants. On applique ensuite le processus à nouveau, sur le nouveau nœud interne et sur les nœuds restants (c'est-à-dire en excluant les deux nœuds feuilles), et on répète ce processus jusqu'à ce qu'il ne reste qu'un seul nœud, qui est la racine de l'arbre de Huffman. L'algorithme de construction le plus simple utilise une file de priorité où le nœud ayant la plus faible probabilité se voit attribuer la priorité la plus élevée : Étant donné que les structures de données de file de priorité efficaces nécessitent un temps O(log n ) par insertion, et qu'un arbre avec n feuilles a 2 n −1 nœuds, cet algorithme fonctionne en O( n log n ), où n est le nombre de symboles. Si les symboles sont triés par probabilité, il existe une méthode linéaire (O( n )) pour créer un arbre de Huffman à l'aide de deux files d' attente : la première contient les poids initiaux (ainsi que des pointeurs vers les feuilles associées), et les poids combinés (ainsi que des pointeurs vers les arbres) sont placés à la fin de la seconde file d'attente. Ceci garantit que le poids le plus faible est toujours placé en tête de l'une des deux files d'attente : Une fois l'arbre de Huffman généré, on le parcourt pour générer un dictionnaire qui associe les symboles à des codes binaires comme suit : L'encodage final de chaque symbole est alors lu par une concaténation des étiquettes sur les arêtes le long du chemin allant du nœud racine au symbole. Dans de nombreux cas, la complexité temporelle n'est pas très importante dans le choix de l'algorithme, car n représente ici le nombre de symboles dans l'alphabet, qui est généralement un nombre très petit (comparé à la longueur du message à encoder) ; tandis que l'analyse de la complexité concerne le comportement lorsque n devient très grand. Il est généralement avantageux de minimiser la variance de la longueur des mots de code. Par exemple, un tampon de communication recevant des données codées par Huffman peut nécessiter une taille plus importante pour gérer des symboles particulièrement longs si l'arbre est fortement déséquilibré. Pour minimiser la variance, il suffit de départager les files d'attente en choisissant l'élément de la première file. Cette modification préserve l'optimalité mathématique du codage de Huffman tout en minimisant la variance et la longueur du code du caractère le plus long. De manière générale, la décompression consiste simplement à traduire le flux de codes de préfixe en valeurs d'octets individuelles, généralement en parcourant l'arbre de Huffman nœud par nœud à mesure que chaque bit est lu dans le flux d'entrée (atteindre une feuille met fin à la recherche de cette valeur d'octet). Cependant, avant cela, l'arbre de Huffman doit être reconstruit. Dans le cas le plus simple, où les fréquences des caractères sont relativement prévisibles, l'arbre peut être préconstruit (et même ajusté statistiquement à chaque cycle de compression) et ainsi réutilisé, au prix d'une légère perte d'efficacité de compression. Sinon, les informations nécessaires à la reconstruction de l'arbre doivent être transmises a priori. Une approche naïve consisterait à ajouter le nombre d'occurrences de chaque caractère au début du flux de compression. Malheureusement, la surcharge dans ce cas pourrait atteindre plusieurs kilo-octets, ce qui rend cette méthode peu utile en pratique. Si les données sont compressées à l'aide d'un codage canonique , le modèle de compression peut être reconstruit avec précision. Il existe de nombreuses variantes du codage de Huffman , dont certaines utilisent un algorithme de type Huffman, et d'autres qui déterminent les codes préfixes optimaux (en imposant, par exemple, différentes restrictions sur la sortie). Il convient de noter que, dans ce dernier cas, la méthode n'est pas nécessairement de type Huffman, et n'a même pas besoin d'être polynomiale . L' algorithme de Huffman n -aire utilise un alphabet de taille n , généralement {0, 1, ..., n-1}, pour encoder les messages et construire un arbre n -aire. Cette approche a été envisagée par Huffman dans son article original. Le même algorithme s'applique qu'en binaire ( Notez que pour n > 2, tous les ensembles de mots sources ne peuvent pas former correctement un arbre n -aire complet pour le codage de Huffman. Dans ces cas, il peut être nécessaire d'ajouter des symboles de substitution supplémentaires de probabilité nulle. En effet, la structure de l'arbre doit relier de manière répétée n branches en une seule, ce que l'on appelle une combinaison « n à 1 ». Pour le codage binaire, il s'agit d'une combinaison « 2 à 1 », qui fonctionne quel que soit le nombre de symboles. Pour le codage n -aire, un arbre complet n'est possible que si le nombre total de symboles (réels + symboles de substitution) est égal à 1 lorsqu'il est divisé par (n-1). Une variante appelée codage de Huffman adaptatif consiste à calculer dynamiquement les probabilités en fonction des fréquences réelles récentes dans la séquence des symboles sources, et à modifier la structure de l'arbre de codage pour correspondre aux estimations de probabilité mises à jour. Elle est rarement utilisée en pratique, car le coût de la mise à jour de l'arbre la rend plus lente que le codage arithmétique adaptatif optimisé , qui est plus flexible et offre une meilleure compression. Le plus souvent, les poids utilisés dans les implémentations du codage de Huffman représentent des probabilités numériques, mais l'algorithme présenté ci-dessus ne l'exige pas ; il requiert seulement que les poids forment un monoïde commutatif totalement ordonné , c'est-à-dire une manière de les ordonner et de les additionner. L' algorithme de Huffman permet d'utiliser tout type de poids (coûts, fréquences, paires de poids, poids non numériques) et l'une des nombreuses méthodes de combinaison (et pas seulement l'addition). De tels algorithmes peuvent résoudre d'autres problèmes de minimisation, comme la minimisation de… Le codage de Huffman à longueur limitée est une variante où l'objectif reste d'obtenir une longueur de chemin pondéré minimale, mais avec une contrainte supplémentaire : la longueur de chaque mot de code doit être inférieure à une constante donnée. L' algorithme de fusion de paquets résout ce problème par une approche gloutonne simple , très similaire à celle utilisée par l'algorithme de Huffman. Sa complexité temporelle est O (n²). Dans le problème de codage de Huffman standard, on suppose que chaque symbole de l'ensemble à partir duquel les mots de code sont construits a un coût de transmission identique : un mot de code de longueur N chiffres aura toujours un coût de N , quel que soit le nombre de 0, de 1, etc. parmi ces chiffres. Sous cette hypothèse, minimiser le coût total du message et minimiser le nombre total de chiffres reviennent au même. Le codage de Huffman avec coûts de lettres inégaux est une généralisation qui s'affranchit de cette hypothèse : les lettres de l'alphabet de codage peuvent avoir des longueurs non uniformes, du fait des caractéristiques du support de transmission. L'alphabet de codage du code Morse en est un exemple : un tiret est plus long à transmettre qu'un point, et son coût temporel est donc plus élevé. L'objectif reste de minimiser la longueur moyenne pondérée des mots de code, mais il ne suffit plus de minimiser uniquement le nombre de symboles utilisés par le message. Aucun algorithme connu ne résout ce problème de la même manière ni avec la même efficacité que le codage de Huffman classique, bien qu'il ait été résolu par Richard M. Karp , dont la solution a été affinée pour le cas des coûts entiers par Mordecai J. Golin Dans le problème de codage de Huffman standard, on suppose que tout mot de code peut correspondre à n'importe quel symbole d'entrée. Dans la version alphabétique, l'ordre alphabétique des entrées et des sorties doit être identique. Ainsi, par exemple, Le codage arithmétique et le codage de Huffman produisent des résultats équivalents — atteignant l'entropie — lorsque chaque symbole a une probabilité de la forme 1/ 2k . Dans d'autres cas, le codage arithmétique offre une meilleure compression que le codage de Huffman car , intuitivement , ses « mots de code » peuvent avoir des longueurs de bits non entières, contrairement aux mots de code des codes préfixes tels que les codes de Huffman qui ne peuvent avoir qu'un nombre entier de bits. Par conséquent, un mot de code de longueur k ne correspond de manière optimale qu'à un symbole de probabilité 1/ 2k , les autres probabilités n'étant pas représentées de manière optimale ; alors que la longueur du mot de code en codage arithmétique peut être ajustée pour correspondre exactement à la probabilité réelle du symbole. Cette différence est particulièrement marquée pour les petits alphabets. Les codes préfixes restent néanmoins largement utilisés en raison de leur simplicité, de leur rapidité et de l'absence de brevets . Ils servent souvent de couche d'extraction à d'autres méthodes de compression. Deflate ( l'algorithme de PKZIP ) et les codecs multimédias tels que JPEG et MP3 possèdent un modèle d'extraction et une quantification suivis de l'utilisation de codes préfixes ; on les appelle souvent « codes de Huffman », même si la plupart des applications utilisent des codes de longueur variable prédéfinis plutôt que des codes conçus à l'aide de l'algorithme de Huffman.
description informelle
Description formalisée
Exemple
Entrée ( A , W ) Symbole ( ) un b c d e Somme Poids ( ) 0,10 0,15 0,30 0,16 0,29 = 1 Sortie C Mots de code ( ) 010011110010Longueur du mot de code (en bits) ( ) 3 3 2 2 2 Contribution à la longueur du chemin pondéré ( ) 0,30 0,45 0,60 0,32 0,58 L ( C ) = 2,25 Optimalité Budget de probabilité ( ) 1/8 1/8 1/4 1/4 1/4 = 1,00 Contenu informationnel (en bits) ( ) ≈ 3,32 2,74 1,74 2,64 1,79 Contribution à l'entropie ( ) 0,332 0,411 0,521 0,423 0,518 H ( A ) = 2,205 0}w_{i}h(a_{i})=\sum _{w_{i}>0}w_{i}\log _{2}{1 \over w_{i}}=-\sum _{w_{i}>0}w_{i}\log _{2}w_{i}.
technique de base
Compression

![]()
Décompression
Variations
Codage de Huffman n -aire
Codage de Huffman adaptatif
Algorithme de modèle de Huffman
Codage de Huffman à longueur limitée/codage de Huffman à variance minimale
Codage de Huffman avec des coûts de lettres inégaux
Arbres binaires alphabétiques optimaux (codage Hu-Tucker)
Le code Huffman canonique
Applications
Codage de Huffman
Construction d'un arbre de Huffman description informelle Donné Un ensemble de symboles S {\displaystyle S} et pour chaque symbole x ∈ S {\displaystyle x\in S} , la fréquence f ...