L' article de Wikipedia a une assez bonne description du processus de codage adaptatif de Huffman utilisant l'une des implémentations notables, l'algorithme Vitter. Comme vous l'avez noté, un codeur Huffman standard a accès à la fonction de masse de probabilité de sa séquence d'entrée, qu'il utilise pour construire des codages efficaces pour les valeurs de symboles les plus probables. Dans l'exemple prototypique de compression de données basée sur un fichier, par exemple, cette distribution de probabilité peut être calculée en histogrammant la séquence d'entrée, en comptant le nombre d'occurrences de chaque valeur de symbole (les symboles peuvent être des séquences de 1 octet, par exemple). Cet histogramme est utilisé pour générer un arbre de Huffman, comme celui-ci (extrait de l'article Wikipedia):
L'arbre est organisé en diminuant le poids ou la probabilité d'occurrence dans la séquence d'entrée; les nœuds terminaux en haut représentent les symboles les plus probables, qui reçoivent donc les représentations les plus courtes dans le flux de données compressé. L'arbre est ensuite enregistré avec les données compressées et est ensuite utilisé par le décompresseur plus tard pour régénérer à nouveau la séquence d'entrée (non compressée). En tant que l'une des premières implémentations de code d'entropie, le codage Huffman standard est assez simple.
La structure du codeur adaptatif Huffman est assez similaire; il utilise une représentation arborescente similaire des statistiques de la séquence d'entrée pour sélectionner des codages efficaces pour chaque valeur de symbole d'entrée. La principale différence est que, en tant qu'implémentation en continu de l'algorithme, aucune connaissance a priori de la fonction de masse de probabilité de l'entrée n'est disponible; les statistiques de la séquence doivent être estimées à la volée. Si l'on doit utiliser le même schéma de codage Huffman, cela signifie que l'arborescence utilisée pour générer le codage de chaque symbole dans le flux compressé doit être créée et maintenue dynamiquement pendant le traitement du flux d'entrée.
L'algorithme Vitter est un moyen d'y parvenir; au fur et à mesure que chaque symbole d'entrée est traité, l'arborescence est mise à jour, conservant sa caractéristique de diminution de la probabilité d'occurrence du symbole lorsque vous descendez dans l'arborescence. L'algorithme définit un ensemble de règles sur la façon dont l'arborescence est mise à jour au fil du temps et sur la façon dont les données compressées résultantes sont codées dans le flux de sortie. À mesure que la séquence d'entrée est consommée, la structure de l'arbre devrait représenter une description de plus en plus précise de la distribution de probabilité de l'entrée. Contrairement à l'approche de codage standard de Huffman, le décompresseur n'a pas d'arbre statique à utiliser pour le décodage; il doit effectuer les mêmes fonctions de maintenance d'arbre en continu pendant le processus de décompression.
En résumé : le codeur adaptatif Huffman fonctionne de manière très similaire à l'algorithme standard; cependant, au lieu d'une mesure statique de l'ensemble des statistiques de la séquence d'entrée (l'arbre de Huffman), une estimation dynamique, cumulative (c'est-à-dire du premier symbole au symbole actuel) de la distribution de probabilité de la séquence est utilisée pour coder (et décoder) chaque symbole . Contrairement à l'approche de codage standard de Huffman, l'algorithme adaptatif de Huffman nécessite cette analyse statistique à la fois au niveau du codeur et du décodeur.