es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo optimiza DEFLATE esto tanto?

Estoy tratando de entender el algoritmo deflate, y he investigado sobre los códigos de Huffman y la compresión LZ77. Estuve jugando con tamaños de compresión de diferentes cadenas y encontré algo que no pude explicar. La cadena aaa, cuando se comprime con zlib y gzip, resulta tener el mismo tamaño que aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa (36 as).

Antes de leer sobre esto, yo hubiera asumido que el compresor hace algo como almacenar 36*a en lugar de cada carácter individualmente, pero no encontré en ninguna especificación donde se mencione eso.

El uso de códigos de Huffman fijos arrojó el mismo resultado, así que supongo que el ahorro de espacio se encuentra en LZ77, pero este solo utiliza pares de distancia-longitud. ¿Cómo puede permitir que una cadena de longitud 3 se expanda 12 veces sin aumentar su tamaño?

Interrumpir la cadena de as con una o varias bs en medio aumenta drásticamente el tamaño. Si los pares de distancia-longitud son los que están haciendo el trabajo, ¿por qué no podría simplemente saltarse las bs al buscar hacia atrás? ¿O se están utilizando códigos de Huffman y entendí mal lo que implican los códigos de Huffman fijos?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en compresión, gzip, zlib, deflate y lz77, es importante entender los mecanismos subyacentes de estos algoritmos. En el caso del algoritmo Deflate, combina tanto la compresión LZ77 como la codificación de Huffman para lograr una eficiencia de compresión.

    Con respecto al ejemplo específico de comprimir la cadena “aaa” y “aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa”, es importante tener en cuenta que el algoritmo Deflate utiliza una técnica de codificación de Huffman dinámica. Esto significa que el árbol de Huffman utilizado para la compresión depende de la frecuencia de los caracteres en el flujo de entrada. En este caso, dado que el flujo de entrada contiene solo un carácter repetido, la codificación de Huffman dinámica es capaz de codificar eficientemente la entrada sin ningún sobrecosto.

    Además, la compresión LZ77 se utiliza en el algoritmo Deflate para lograr una mayor compresión. En el caso de la cadena “aaa”, la compresión LZ77 funcionaría encontrando la secuencia de caracteres más larga que ya se ha encontrado en el flujo de entrada, que en este caso es simplemente el carácter “a”, y luego codificando esta secuencia como un par longitud-distancia. Sin embargo, dado que en este caso, la longitud de la secuencia es solo 1 y no hay distancia que codificar, los datos comprimidos resultantes son simplemente el carácter único repetido “a” codificado utilizando la codificación de Huffman dinámica.

    En cuanto a la pregunta de por qué interrumpir la cadena de “a” con uno o varios “b” en el medio aumenta drásticamente el tamaño, esto se debe a que la técnica de codificación de Huffman dinámica utilizada en Deflate no puede codificar eficientemente secuencias de caracteres con diferentes frecuencias. En el caso de interrumpir la cadena de “a” con “b”, la frecuencia de los caracteres en el flujo de entrada cambia, lo que resulta en un árbol de Huffman más grande y una salida codificada más grande.

    En general, es importante entender tanto la compresión LZ77 como las técnicas de codificación de Huffman dinámica utilizadas en el algoritmo Deflate para obtener una comprensión más profunda de cómo logra eficiencia de compresión.

Comments are closed.