我在Gameboy Advance的游戏中进行反向工程,我注意到原始的开发人员编写了一个代码,该代码具有两个系统调用,以使用Huffman和lz77(按此顺序)解压缩关卡。
但是为什么要使用霍夫曼+ lzZ7?这种方法有什么优势?
答案 0 :(得分:2)
开发人员可能会使用DEFLATE(或类似的算法),只是为了能够重用经过测试和调试的软件,而不是从头开始编写新的东西(并花费知道的时间进行测试和修复所有古怪的边缘情况。
但是为什么DEFLATE,Zstandard,LZHAM,LZHUF,LZH等同时使用Huffman和LZ77?
由于这2种算法检测并删除了许多数据文件(视频游戏级别,英语和其他自然语言文本等)共有的2种不同类型的冗余,因此可以将它们组合使用以获得比任何一种更好的网络压缩一个人。 (不幸的是,大多数数据压缩算法无法像这样组合)。
在英语中,最常见的2个字母是(通常)“ e”,然后是“ t”。 那么最常见的一对是什么?您可能会猜到“ ee”,“ et”或“ te”-不,它是“ th”。
LZ77擅长检测和压缩这些常见的单词和音节,而这些单词和音节的发生频率远远超过仅从字母频率中您可能会猜到的程度。
面向字母的霍夫曼擅长仅使用字母频率来检测和压缩文件,但无法检测连续字母(常见单词和音节)之间的相关性。
LZ77将原始文件压缩为原义字母和“复制项目”的中间序列。 然后霍夫曼进一步压缩该中间序列。 如果我们跳过LZ77步骤并只是霍夫曼压缩了原始文件,这些“复制项目”通常已经比原始子字符串短得多。 而且,霍夫曼压缩中间序列中的文字字母与压缩原始文件中的相同字母一样好。
因此,与仅使用任一算法相比,此两步过程已创建了较小的文件。 另外,通常还对复制项进行霍夫曼压缩,以节省更多存储空间。
通常,大多数数据压缩软件由这两部分组成。 首先,他们通过“ transformation”或“ multiple transformations”(也称为“解相关器”)运行原始数据,通常将其高度调整为要压缩的特定类型数据中的特定类型冗余(JPEG的DCT转换, MPEG的运动补偿等)或调整到人类感知的限制(MP3的听觉掩蔽等)。 接下来,他们通过单个“ entropy coder”(算术编码,霍夫曼编码或非对称数字系统编码)运行中间数据,每种数据几乎相同。