Compression 为什么要把哈夫曼和lz77结合起来?

Compression 为什么要把哈夫曼和lz77结合起来?,compression,huffman-code,gba,lz77,Compression,Huffman Code,Gba,Lz77,我正在Gameboy Advance的游戏中进行逆向工程,我注意到最初的开发人员编写了一个代码,其中包含两个系统调用,使用Huffman和lz77(按此顺序)解压一个级别 但是为什么要使用哈夫曼+lzZ7呢?这种方法的优点是什么?使用可用的库 开发人员使用DEFLATE(或一些类似的算法)可能只是为了能够重用经过测试和调试的软件,而不是从头开始编写新的东西(谁知道测试和修复所有奇怪的边缘情况需要多长时间) 为什么哈夫曼和LZ77都有? 但是为什么DEFLATE、Zstandard、LZHAM、L

我正在Gameboy Advance的游戏中进行逆向工程,我注意到最初的开发人员编写了一个代码,其中包含两个系统调用,使用Huffman和lz77(按此顺序)解压一个级别

但是为什么要使用哈夫曼+lzZ7呢?这种方法的优点是什么?

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

为什么哈夫曼和LZ77都有? 但是为什么DEFLATE、Zstandard、LZHAM、LZHUF、LZH等同时使用哈夫曼和LZ77呢

因为这两种算法检测并消除了许多数据文件(视频游戏级别、英语和其他自然语言文本等)共有的两种不同类型的冗余,并且它们可以结合使用,以获得比单独使用任何一种算法更好的网络压缩。 (不幸的是,大多数数据压缩算法不能这样组合)

细节 在英语中,最常见的两个字母是(通常是)“e”和“t”。 那么最常见的一对是什么呢?你可能猜“ee”、“et”或“te”——不,是“th”

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

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

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

因此,这两个步骤创建的文件比单独使用任何一种算法都要小。 作为奖励,通常拷贝项也会被哈夫曼压缩以节省更多的存储空间

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

LZ77(长度、距离、文字符号等)的输出通常不是均匀分布的(有些出现得更频繁,有些出现得更少)。您可以使用可变长度代码(如Huffman)来更有效地编码它们,从而获得更好的压缩。该算法同时使用Huffman和LZ77(出于Dan Mašek提到的相同原因)。开发人员是否真的在使用DEFLATE,只是为了能够重用经过测试和调试的软件,而不是从头开始编写新的东西?@DavidCary是的,这是可能的。也许开发人员只是重新使用了一个已经使用了这些算法的软件。请你在下面写一个答复,以便我批准?我想结束这个问题。@DanMašek请跟我来。请你在下面写一个答复,以便我批准?我想结束这个问题。