Es bien sabido que existe un algoritmo óptimo para el peor de los casos para calcular el código Huffman en el tiempo . Esto se mejora de dos maneras ortogonales:
Los códigos libres de prefijos óptimos se pueden calcular más rápido si el conjunto de frecuencias distintas es pequeño (por ejemplo, de tamaño ): clasifique las frecuencias utilizando [Munro y Spira, 1976] para aprovechar el pequeño valor de σ y calcule el Huffman árbol en tiempo lineal a partir de las frecuencias ordenadas. Esto produce una solución en O ( n lg σ )
Existe un algoritmo para calcular códigos equivalentes donde k es el número de longitudes de palabras de código distintas [Belal y Elmasry].
¿Hay alguna forma de combinar esas técnicas para mejorar la mejor complejidad actual de ?
EL RESULTADO DE DE STACS 2006 PARECE SER INCORRECTO , Elmasry publicó en ARXIV en 2010 (http://arxiv.org/abs/cs/0509015) una versión que anuncia - operaciones en entradas no ordenadas y - O ( 9 k log 2 k - 1 n ) operaciones en entrada ordenada
Veo una analogía con la complejidad de calcular el casco convexo plano, donde los algoritmos en (basados en la clasificación, como el algoritmo O ( n lg n ) para el código de Huffman) y en O ( n h ) (envoltura de regalos ) fueron reemplazados por el algoritmo de Kirkpatrick y Seidel en O ( n lg h ) (más tarde demostró ser óptimo con la complejidad de la forma O ( n H ( n 1 , ... , n k ). En el caso de los códigos Prefix Free, O ( n lg n ) versus O ( n k ) sugiere la posibilidad de un algoritmo con complejidad O ( n lg k ) , o incluso O ( n H ( n 1 , ... , n k ) donde n i es el número de palabras de código de longitud i , usando la analogía de un borde del casco convexo que cubre n iapunta a una longitud de código que cubre símbolos.
Un simple ejemplo muestra que la clasificación de los (redondeado) valores logarítmicos de las frecuencias (en tiempo lineal en el modelo de palabra RAM) no da un código libre óptima prefijo en tiempo lineal:
- Para , f 1 = 1 / 2 - ε y f 2 = f 3 = 1 / 4 + ε
- por lo que la clasificación de registros no cambia el orden
- Sin embargo, dos de los tres códigos cuestan bits más que lo óptimo.
Otra pregunta interesante sería reducir la complejidad cuando es grande, es decir, todos los códigos tienen longitudes distintas:
- por ejemplo, cuando las frecuencias son todas de valor de registro distinto. En este caso, uno puede ordenar las frecuencias en tiempo lineal en la palabra θ ( lg n ) RAM, y calcular el código de Huffman en tiempo lineal (porque ordenar sus valores de registro es suficiente para ordenar los valores), lo que resulta en un tiempo lineal general, mucho mejor que el n 2 del algoritmo de Belal y Elmasry.
fuente