| En 1951, le David A. Huffman et ses camarades de classe de théorie de l'information de MIT ont été donnés le choix d'un papier de limite ou d'un examen final. Le professeur, Robert M. Fano , a assigné un papier de limite sur le problème de trouver le code binaire le plus efficace. Huffman, incapable de prouver tous les codes étaient le plus efficace, étaient sur le point d'abandonner et commencer à étudier pour la finale quand il a frappé sur l'idée d'employer un arbre binaire fréquence-assorti et a rapidement prouvé cette méthode le plus efficace. De cette manière, l'étudiant a surpassé son professeur, qui avait travaillé avec le Claude Shannon d'inventeur de la théorie de l'information de pour développer un code semblable. Huffman a évité la paille principale du codage suboptimal de Shannon-Fano de en constituant l'arbre du fond au lieu de à partir du dessus vers le bas. Définition de problème ; Donné : Un ensemble de symboles et de leurs poids (habituellement proportionnel aux probabilités). ; Trouvaille : Un code binaire préfixe-libre (un ensemble de de codewords) avec le minimum s'est attendu à la longueur de codeword de (d'une manière equivalente, un arbre avec longueur de trajet pesée par minimum ). Description formalisée Entrée . = de , qui est l'alphabet de symbole de la taille . Place , qui est l'ensemble des poids de symbole (de positif) (habituellement proportionnels aux probabilités), c. . Rendement . Coder le , qui est l'ensemble de codewords (de binaire), où le est le codeword pour le . Laissent soit la longueur de trajet pesée du code . Condition : pour n'importe quel . Échantillons Technique de base La technique fonctionne à côté de créer un arbre binaire des noeuds. Ceux-ci peuvent être stockés dans une rangée régulière , la taille dont dépend du nombre de symboles, de . Un noeud peut être un noeud de feuille ou un noeud interne . Au commencement, tous les noeuds sont des noeuds de feuille, qui contiennent le symbole lui-même de , le poids (fréquence de d'aspect) du symbole et sur option, un lien à un noeud du parent qui le rend facile de lire le code (à l'envers) à partir d'un noeud de feuille. Les noeuds internes contiennent le poids de symbole, les liens aux noeuds d'enfant du deux et le lien facultatif à un noeud du parent . En tant que convention commune, le peu « 0 » représente suivre l'enfant gauche et « 1 » mordu représente suivre l'enfant droit. Un arbre de finition a des noeuds de feuille de et des noeuds internes de . Un linéaire-temps * la méthode pour créer un arbre de Huffman est d'employer deux files d'attente le premier contenant les poids initiaux (avec des indicateurs aux feuilles associées), et poids combinés (avec des indicateurs aux arbres) étant mis dans le dos de la deuxième file d'attente. Ceci s'assure que le plus bas poids est toujours maintenu à l'avant d'une des deux files d'attente. Création de l'arbre : Commencer par autant de feuilles car il y a des symboles. Mettre tous les noeuds de feuille dans la première file d'attente (par la probabilité dans l'ordre croissant de sorte que le moindre article probable soit dans la tête de la file d'attente). Tandis qu'il y a plus d'un noeud dans les files d'attente : Retirer les deux noeuds avec le plus bas poids. Créer un nouveau noeud interne, avec les deux noeuds juste-enlevés comme enfants (l'un ou l'autre noeud peut être l'un ou l'autre enfant) et la somme de leurs poids comme nouveau poids. Mettre le nouveau noeud dans l'arrière de la deuxième file d'attente. de Le noeud restant est le noeud de racine ; l'arbre a été maintenant produit. Il est généralement salutaire de réduire au minimum le désaccord de la longueur de codeword. Par exemple, un amortisseur de communication recevant des données Huffman-codées peut devoir être plus grand pour traiter particulièrement de longs symboles si l'arbre est particulièrement non équilibré. Pour réduire au minimum le désaccord, casser simplement les cravates entre les files d'attente en choisissant l'article dans la première file d'attente. Cette modification maintiendra l'optimalité mathématique du codage de Huffman tandis que désaccord de minimisation et minimisation de la longueur du plus long code de caractère. Cette méthode de * est temps linéaire supposant que vous faites déjà assortir les noeuds de feuille par le poids initial. Sinon, le assortissant ils prendra le . Propriétés principales Les fréquences utilisées peuvent être les génériques pour le domaine d'application qui sont basées en moyenne éprouvent, ou elles peuvent être les fréquences réelles trouvées dans le texte étant comprimé. (Cette variation exige qu'une table de fréquence de ou tout autre conseil quant au codage doit être stockée avec le texte comprimé ; les réalisations utilisent de divers tours pour stocker tables efficacement.) Le codage de Huffman est optimal quand la probabilité de chaque symbole d'entrée est une puissance négative de deux. les codes Préfixe-libres tendent à avoir la légère inefficacité sur de petits alphabets, où les probabilités tombent souvent entre ces points optimaux. " ; Blocking" ; , ou augmentant la taille d'alphabet par des symboles multiples de fusion dans le " ; words" ; de fixe ou de longueur variable avant le codage de Huffman, habituellement aides, particulièrement quand des symboles adjacents sont corrélés (comme dans le cas du texte de langage naturel). Le pire cas pour le codage de Huffman peut se produire quand la probabilité d'un symbole dépasse 2-1 = 0.5, rendant la limite supérieure de l'inefficacité illimitée. Ces situations répondent souvent bien à une forme de bloquer le codage appelé de Courir-longueur de . Le codage arithmétique produit de légers gains au-dessus du codage de Huffman, mais dans la pratique ces gains ont rarement été assez grands pour compenser des redevances plus élevées de la complexité informatique du codage arithmétique et du brevet . (En date du de juillet 2006 , IBM possède des brevets sur beaucoup de méthodes de codage arithmétique dans plusieurs juridictions ; voir les brevets des USA de sur le codage arithmétique .) Variations Beaucoup de variations du codage de Huffman existent, certains dont l'utilisation a Huffman-comme l'algorithme, et d'autres dont trouver les codes optimaux de préfixe (tandis que, par exemple, mettant différentes restrictions sur le rendement). Noter que, dans le dernier cas, la méthode n'a pas besoin d'être Huffman-comme, et, en effet, ne pas avoir besoin même d'être le temps polynôme . Une liste approfondie de papiers sur le codage de Huffman sur ses variations est donnée par le " ; Coder et analyser les arbres pour la source sans perte Encoding" ;. n - codage ary de Huffman Le n de - l'algorithme ary de Huffman emploie {0, 1,…, &minus de n ; 1} alphabet pour coder le message et pour établir un n - arbre ary. Cette approche a été considérée par Huffman en son papier original. Une variation appelée le codage adaptatif de Huffman de de calcule les fréquences dynamiquement basées sur des fréquences réelles récentes dans la corde de source. Ceci est légèrement lié à la famille du LZ des algorithmes. Algorithme de calibre de Huffman Le plus souvent, les poids utilisés dans les réalisations du codage de Huffman représentent des probabilités numériques, mais l'algorithme donné ci-dessus n'exige pas ceci ; il exige seulement une manière de commander des poids et de les ajouter. L'algorithme de calibre de Huffman de permet d'employer n'importe quel genre de poids (coûts, fréquences, paires de poids, poids non numériques) et une de beaucoup de méthodes de combinaison (pas simplement addition). De tels algorithmes peuvent résoudre d'autres problèmes de minimisation, tels que le , un problème d'abord appliqué à la conception de circuit. codage Longueur-limité de Huffman le codage Longueur-limité de Huffman de est une variante où le but est de réaliser toujours une longueur de trajet pesée minimum, mais il y a une restriction additionnelle que la longueur de chaque codeword doit être moins qu'une constante indiquée. Le paquet-fusionnent l'algorithme de résout ce problème avec une approche avide du simple très semblable à cela employée par l'algorithme de Huffman's. Sa complexité de temps est le , où est la longueur maximum d'un codeword. Aucun algorithme n'est connu pour résoudre ce problème avec la même efficacité que le codage conventionnel de Huffman, Codage de Huffman avec des coûts inégaux de lettre Dans le problème de codage standard de Huffman, on le suppose que chaque symbole dans l'ensemble que les mots de code sont construits de a un coût égal à transmettre : un mot de code dont la longueur est des chiffres du N aura toujours un coût de N , n'importe comment plusieurs de ces chiffres sont 0s, combien sont 1s, etc. Quand le travail dans cette prétention, la minimisation de tout le coût du message et la minimisation de tout le nombre de chiffres sont la même chose. Le codage de Huffman de avec les coûts inégaux de lettre est la généralisation dans laquelle cette prétention n'est plus vraie assumé : les lettres de l'alphabet de codage peuvent avoir des longueurs non-uniformes, dues aux caractéristiques du milieu de transmission. Un exemple est l'alphabet de codage du code Morse , où un « tiret » prend plus longtemps pour envoyer qu'un « point », et donc le coût d'un tiret dans le temps de transmission est plus haut. Le but est de réduire au minimum toujours la longueur moyenne pesée de codeword, mais il n'est plus suffisant juste de réduire au minimum le nombre de symboles employés par le message. Aucun algorithme n'est connu pour résoudre ceci de la même manière ou avec la même efficacité que le codage conventionnel de Huffman. Arbres binaires alphabétiques optimaux (codage HU-Tucker et le code canonique de Huffman) Dans le problème de codage standard de Huffman, on le suppose que n'importe quel codeword peut correspondre à n'importe quel symbole d'entrée. Dans la version alphabétique, l'ordre alphabétique des entrées et les sorties doivent être identiques. Ainsi, par exemple, = de ne pourrait pas être assigné le , mais à la place devrait être assigné ou le ou le . Ceci est également connu comme problème de la HU-Tucker , après les auteurs du papier présentant la première solution de Linearithmic à ce problème alphabétique binaire optimal, qui a quelques similitudes à l'algorithme de Huffman, mais n'est pas une variation de cet algorithme. Ces arbres binaires alphabétiques optimaux sont employés souvent en tant qu'arbres de recherche binaire si les poids correspondant aux entrées alphabétique ordre sont dans l'ordre numérique, le code de Huffman a les mêmes longueurs que le code alphabétique optimal, qui peut être trouvé de calculer ces longueurs. Le code alphabétique en résultant parfois s'appelle le le code canonique de Huffman et est souvent le code utilisé dans la pratique, en raison de la facilité du codage/du décodage. La technique pour trouver ce code s'appelle parfois le codage de Huffman-Shannon-Fano de , puisqu'elle est optimale comme le codage de Huffman, mais alphabétique dans la probabilité de poids, comme le codage de Shannon-Fano de . Le code de Huffman-Shannon-Fano correspondant à l'exemple est , qui, ayant les mêmes longueurs de codeword que la solution originale, est également optimal. Applications Le codage arithmétique peut être regardé comme généralisation du codage de Huffman ; en effet, dans la pratique le codage arithmétique est souvent précédé par le codage de Huffman, car il est plus facile de trouver un code arithmétique pour une entrée binaire que pour une entrée nonbinary. En outre, bien que le codage arithmétique offre une meilleure exécution de compression que le codage de Huffman, le codage de Huffman est toujours dedans utilisation large en raison de sa simplicité, vitesse et manque d'encombrement par les brevets Le codage de Huffman est aujourd'hui employé souvent comme " ; back-end" ; à une autre méthode de compression. Le DÉGONFLENT (le algorithme de s de PKZIP ') et les codec de multimédia tel que JPEG et MP3 ont une quantification d'entrée de modèle et de suivie du codage de Huffman. Voir également Le a modifié le codage de Huffman - utilisé dans des télécopieurs Codage de Shannon-Fano de La compression de données Lempel-Ziv-Gallois Système binaire asymétrique Varicode .
|