Il est bien connu qu'il existe un algorithme optimal dans le pire des cas pour calculer le code Huffman dans le temps . Ceci est amélioré de deux manières orthogonales:
Des codes libres de préfixe optimaux peuvent être calculés plus rapidement si l'ensemble de fréquences distinctes est petit (par exemple de taille ): triez les fréquences à l'aide de [Munro et Spira, 1976] afin de tirer parti de la petite valeur de , et calculez le Huffman arbre en temps linéaire à partir des fréquences triées. Cela donne une solution dans
Il existe un algorithme pour calculer des codes équivalents où est le nombre de longueurs de mots de code distinctes [Belal et Elmasry].
LE RÉSULTAT DES STACS 2006 SEMBLE ÊTRE MAUVAIS O ( 16 k n ) O ( 9 k log 2 k - 1 n ) , Elmasry a publié sur ARXIV en 2010 (http://arxiv.org/abs/cs/0509015) une version annonçant - des opérations sur les entrées non triées et - opérations sur une entrée triée
Je vois une analogie avec la complexité du calcul de la coque convexe planaire, où les algorithmes en (basé sur le tri, comme l' algorithme pour le code de Huffman) et en (cadeau wrapping) ont été remplacés par l'algorithme de Kirkpatrick et Seidel dans (qui s'est avéré plus tard être optimal par exemple avec la complexité de la forme ). Dans le cas des codes libres préfixés, versus suggère la possibilité d'un algorithme de complexité , voire où est le nombre de mots de code de longueurO ( n lg n ) O ( n h ) O ( n lg h ) O ( n H ( n 1 , … , n k ) O ( n lg n ) O ( n k ) O ( n lg k ) O ( n H ( n 1 ,, en utilisant l'analogie d'un bord de la coque convexe couvrant pointe vers une longueur de code couvrant symboles.
Un exemple simple montre que le tri des valeurs logarithmiques (arrondies) des fréquences (en temps linéaire dans le modèle RAM de mot ) ne donne pas un code libre de préfixe optimal en temps linéaire:
- Pour , et
- donc le tri des journaux ne change pas l'ordre
- pourtant, deux codes sur trois coûtent bits de plus qu'optimal.
Une autre question intéressante serait de réduire la complexité lorsque est grand, c'est-à-dire que tous les codes ont des longueurs distinctes:
- par exemple, lorsque les fréquences ont toutes une valeur de log distincte. Dans ce cas on peut trier les fréquences en temps linéaire dans le θ ( lgmot RAM n ) , et calculer le code Huffman en temps linéaire (car le tri de leurs valeurs logarithmiques suffit pour trier les valeurs), ce qui donne un temps linéaire global, beaucoup mieux que le n 2 de l'algorithme de Belal et Elmasry.
la source