El popular algoritmo DEFLATE utiliza la codificación Huffman sobre Lempel-Ziv.
En general, si tenemos una fuente de datos aleatoria (= entropía de 1 bit / bit) , es probable que ninguna codificación, incluida Huffman, la comprima en promedio. Si Lempel-Ziv fuera "perfecto" (que se acerca a la mayoría de las clases de fuentes, ya que la longitud llega al infinito), la codificación de publicaciones con Huffman no ayudaría. Por supuesto, Lempel-Ziv no es perfecto, al menos con una longitud finita, por lo que queda algo de redundancia.
Es esta redundancia restante la que la codificación Huffman elimina parcialmente y, por lo tanto, mejora la compresión.
Mi pregunta es: ¿por qué esta redundancia restante se elimina con éxito mediante la codificación de Huffman y no con LZ? ¿Qué propiedades de Huffman versus LZ hacen que esto suceda? ¿Simplemente ejecutar LZ nuevamente (es decir, codificar los datos comprimidos de LZ con LZ por segunda vez) lograría algo similar? ¿Si no, porque no? Del mismo modo, primero comprimir con Huffman y luego con LZ funcionaría, y si no, ¿por qué?
ACTUALIZACIÓN: está claro que incluso después de LZ, quedará algo de redundancia. Varias personas han hecho ese punto. Lo que no está claro es: ¿por qué Huffman aborda mejor esa redundancia restante que LZ? ¿Qué tiene de especial en contraste con la fuente original de redundancia, donde LZ funciona mejor que Huffman?
fuente
La compresión de datos se trata realmente de dos cosas: modelado y codificación. Los algoritmos de la familia LZ modelan el texto como una concatenación de repeticiones exactas, que es asintóticamente óptimo para muchas fuentes aleatorias y razonablemente bueno para muchos textos reales. Sin embargo, para algunas entradas, este modelo puede ser bastante malo. Por ejemplo, no puede usar LZ para comprimir una matriz de sufijos directamente, aunque la matriz de sufijos sea tan comprimible como el texto original.
En resumen, Huffman supera a LZ al comprimir las tuplas, ya que su modelo (distribución fija frente a repeticiones exactas) es una mejor coincidencia para los datos.
fuente
Creo que la respuesta se encuentra en el tamaño del diccionario de búsqueda.
Los datos tienen un sentido de localidad (es decir, si se ha usado un dato, es probable que se vuelva a usar pronto), y el algoritmo LZ aprovecha esto en la construcción del diccionario de búsqueda. Genera un trie con una cantidad finita de nodos posibles, para mantener las búsquedas rápidas . Cuando alcanza el límite de tamaño, hace otro trie, "olvidando" el anterior. Por lo tanto, debe crear nuevamente la tabla de búsqueda para los caracteres más simples, pero si algunas palabras ya no se usan, ya no se conservan en la memoria, por lo que se puede usar una codificación más pequeña.
Por lo tanto, una salida LZ se puede reducir aún más con la codificación Huffman, ya que esta redundancia en la creación de los intentos de búsqueda se puede detectar mediante análisis estadístico.
fuente
Tal vez estoy fuera de pista aquí, pero la codificación de Huffman mira toda la entrada para construir su tabla de codificación (árbol), mientras que Lempel-Ziv codifica a medida que avanza. Esto es tanto una ventaja como una desventaja para Huffman. La desventaja es obvia, es decir, tenemos que ver toda la información antes de poder comenzar. La ventaja es que Huffman tendrá en cuenta las estadísticas que se producen en cualquier parte de la entrada, mientras que Lempel-Ziv tiene que ir acumulando progresivamente. O para decirlo de otra manera, Lempel-Ziv tiene una "dirección" que Huffman no tiene.
Pero todo esto es solo mi ingenua manera de imaginar cómo son las cosas. Necesitaríamos una prueba real aquí para ver cómo exactamente Huffman supera a Lempel-Ziv.
fuente
La respuesta corta es que LZ es un algoritmo "universal" en el sentido de que no necesita conocer la distribución exacta de la fuente (solo necesita suponer que la fuente es estacionaria y ergódica). Pero Huffman no lo es; necesita saber la distribución exacta a partir de la cual se muestrea la fuente (para hacer el árbol Huffman). Esta información adicional hace que Huffman obtenga garantías de compresión ajustadas. Sin embargo, para los algoritmos prácticos de compresión de archivos, Huffman puede ser menos favorable, ya que primero tendrá que recopilar estadísticas empíricas del archivo y luego hacer la compresión real en una segunda mitad, mientras que LZ se puede implementar en línea.
Se pueden encontrar más detalles en los textos estándar de teoría de la información, por ejemplo, Elementos de la teoría de la información de Cover y Thomas.
fuente