我正在创建自己的DEFLATE压缩器,它几乎每次都胜过ZLIB库。
在DEFLATE格式(LZ77)中,数据流要么包含Byte文字,要么包含Back-reference,我们应该从先前解码的字节中复制字节序列。压缩器通常执行LZ77(找到后引用 - 尽可能多)然后构建一个霍夫曼树并压缩该字节/引用流。
可能存在一种极端情况:3个相同字节的引用,长度由15位编码,距离为15 + 13位,而编码字节在我们的霍夫曼树中仅为1位。差异是43比3比特。使用引用使输出比直接编码字节大14倍。
我的问题如下:我有一个10,097,918 B的文本文件。 ZLIB在其LZ77中通过参考覆盖了9,089,334 B,而我的压缩机覆盖了9,305,056 B.所以我想我可以说我的LZ77更好。
但ZLIB提供了1,329,309个B文件,而我的程序提供了1,381,153个B文件(两者都构建了一个最佳的霍夫曼树)。因此,更好的LZ77会导致更糟糕的霍夫曼编码。有关哈夫曼友好型LZ77的研究吗?
答案 0 :(得分:1)
这是一个难题,因为在做出是否采用文字或反向引用的所有决定之后,您只知道与这些决策相关的比特成本。但是,您可以迭代并使用之前运行中的成本,在重新编码时做出这些决定几次,直到您对结果感到满意为止。
除了使用最短路径方法而不是贪婪决策之外,这是Zopfli在保持DEFLATE格式的同时获得更好压缩比的方法之一。