【问题标题】:DEFLATE: is back-reference really better?DEFLATE:反向引用真的更好吗?
【发布时间】:2018-10-29 18:04:44
【问题描述】:

我正在制作自己的 DEFLATE 压缩器,它几乎每次都击败了 ZLIB 库。

在 DEFLATE 格式 (LZ77) 中,数据流要么包含一个字节文字,要么包含一个反向引用,即我们应该从先前解码的字节中复制一个字节序列。压缩器通常执行 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 的文件(两者都构建了一个最优的 Huffman 树)。因此,更好的 LZ77 会导致更差的霍夫曼编码。有没有关于 Huffman-friendly LZ77 的研究?

【问题讨论】:

    标签: compression zlib deflate lz77


    【解决方案1】:

    这是一个难题,因为您只知道与这些决定相关的比特成本做出所有决定是采用文字还是反向引用之后。但是您可以迭代并使用上一次运行的成本来做出这些决定,同时重新编码多次,直到您对结果满意为止。

    这是 Zopfli 为在保持 DEFLATE 格式的同时获得更好的压缩比所做的事情之一,此外还使用最短路径方法而不是贪婪决策。

    【讨论】:

    • 你也很了解 ZLIB 吗?我有一个文件,在 ZLIB 压缩后比压缩后要小。但是我的压缩通过反向引用覆盖了更多字节(例如,我的 3 字节引用比 ZLIB 多 2 倍)。所以我想知道他们是怎么做到的。我不擅长阅读 C 代码。
    • @IvanKuckir 也许你没有实现惰性匹配?过于贪婪地进行匹配会阻止找到更长的匹配。它可以解释有更多的小匹配
    • 我确实有延迟匹配前面的 2 个位置(即如果下一个位置有更长的匹配,我只是在这里写一个字节)。它减少了文件大小,但也减少了引用所覆盖的字节数......太奇怪了
    • 确保您使用的是距当前位置最短距离的反向引用...以帮助最大限度地减少额外位的数量,因为匹配距离很远。
    猜你喜欢
    • 2010-10-07
    • 2010-10-22
    • 1970-01-01
    • 2012-08-03
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 2021-09-30
    相关资源
    最近更新 更多