【问题标题】:Why to combine Huffman and lz77?为什么要结合霍夫曼和lz77?
【发布时间】:2019-04-06 08:09:30
【问题描述】:

我正在对 Gameboy Advance 的游戏进行逆向工程,我注意到原始开发人员编写的代码有两个系统调用来使用 Huffman 和 lz77(按此顺序)解压缩关卡。

但为什么要使用 Huffman + lzZ7?这种方法有什么好处?

【问题讨论】:

  • LZ77 的输出(长度、距离、文字符号……)通常不是均匀分布的(有些出现的频率更高,有些则更少)。您可以使用可变长度代码(例如 Huffman)更有效地对其进行编码,从而获得更好的压缩效果。
  • DEFLATE 算法同时使用 Huffman 和 LZ77(原因与 Dan Mašek 提到的相同)。开发人员是否可能实际上使用 DEFLATE,只是为了能够重用经过测试和调试的软件,而不是从头开始编写新的东西?
  • @DavidCary 是的,这是可能的。也许开发人员只是重新使用了已经使用这些算法的软件。你能在下面写一个答案,以便我批准吗?我想结束这个问题。
  • @DanMašek 你也一样,拜托。你能在下面写一个答案,以便我批准吗?我想结束这个问题。

标签: compression huffman-code game-boy-advance lz77


【解决方案1】:

使用可用的库

开发人员可能正在使用 DEFLATE(或一些类似的算法),只是为了能够重复使用经过测试和调试的软件,而不是从头开始编写新的东西(并且花费不知道多长时间来测试和修复所有古怪的边缘情况)。

为什么要同时使用 Huffman 和 LZ77?

但为什么 DEFLATE、Zstandard、LZHAM、LZHUF、LZH 等同时使用 Huffman 和 LZ77?

因为这 2 种算法检测并删除了许多数据文件(视频游戏关卡、英语和其他自然语言文本等)共有的 2 种不同类型的冗余,并且它们可以结合起来获得比任何一种都更好的网络压缩一个人。 (很遗憾,大多数数据压缩算法都不能这样组合)。

详情

在英语中,两个最常见的字母(通常)是“e”,然后是“t”。 那么最常见的一对是什么?您可能会猜到“ee”、“et”或“te”——不,是“th”。

LZ77 擅长检测和压缩这些常见单词和音节,这些单词和音节的出现频率远远超过您仅从字母频率所猜测的频率。

面向字母的霍夫曼擅长仅使用字母频率检测和压缩文件,但无法检测连续字母(常用词和音节)之间的相关性。

LZ77 将原始文件压缩成文字字母和“复制项”的中间序列。 然后霍夫曼进一步压缩该中间序列。 通常,如果我们跳过 LZ77 步骤并简单地 Huffman 压缩原始文件,这些“复制项”已经比原始子字符串短得多。 霍夫曼在压缩中间序列中的文字字母的效果与压缩原始文件中的相同字母一样好。

因此,这个两步过程已经创建了比单独使用任一算法更小的文件。 作为奖励,副本项目通常也经过 Huffman 压缩,以节省更多存储空间。

一般来说,大多数数据压缩软件都是由这两部分组成的。 首先,他们通过“transformation”或multiple transformations(也称为“去相关器”)运行原始数据,通常高度调整到正在压缩的特定类型数据中的特定类型冗余(JPEG 的 DCT 变换、MPEG 的运动补偿等)或调整到人类感知的限制(MP3 的听觉掩蔽等)。 接下来,他们通过单个“entropy coder”(算术编码、霍夫曼编码或非对称数字系统编码)运行中间数据,这对于每种数据几乎都是相同的。

【讨论】:

    猜你喜欢
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 2010-10-17
    相关资源
    最近更新 更多