Compression Huffman算法的测度压缩

Compression Huffman算法的测度压缩,compression,huffman-code,Compression,Huffman Code,我正在改进我的编程技能,并实现了哈夫曼算法。现在,我只是在考虑没有特殊角色的[a-z]。a-z的概率值已从维基百科中使用 当我运行它时,对于随机段落,我得到了大约2倍的压缩。 但是对于这个计算,我假设原始字母每个需要8位(ASCII) 但如果我想一想,代表26个项目,我只需要5位。如果我根据这个事实来计算,那么压缩因子几乎降到1.1 所以我的问题是,在实际应用中,压缩因子是如何确定的 第二个问题——如果我写的编码器/解码器使用5位来表示a-z(比如a=0、b=1等)——这也是一种有效的“压缩”算

我正在改进我的编程技能,并实现了哈夫曼算法。现在,我只是在考虑没有特殊角色的[a-z]。a-z的概率值已从维基百科中使用

当我运行它时,对于随机段落,我得到了大约2倍的压缩。 但是对于这个计算,我假设原始字母每个需要8位(ASCII)

但如果我想一想,代表26个项目,我只需要5位。如果我根据这个事实来计算,那么压缩因子几乎降到1.1

所以我的问题是,在实际应用中,压缩因子是如何确定的


第二个问题——如果我写的编码器/解码器使用5位来表示a-z(比如a=0、b=1等)——这也是一种有效的“压缩”算法吗?

26个字符不是5位,而是log(26)/log(2)=4,7位。这是最大熵,但你需要知道具体的熵。德语是40629。当您知道可以使用公式R=Hmax-H时,请看这里:)

如果对同一文本运行不受限制的哈夫曼编码压缩,则会得到相同的结果,因此我认为可以合理地说,对同一文本进行ASCII编码时,会得到2倍的压缩。我更倾向于说,您的程序正在获得预期的压缩,但目前有一个限制,即它不能处理任意输入,以及其他更简单的压缩方案,如果存在该限制,也可以通过ASCII获得压缩


为什么不扩展算法来处理任意字节值?这样就更容易进行真正的正面比较。

你基本上得到了正确的答案,那就是如果你只处理英语的字母频率,你就不会期望有太多的压缩

计算字母频率所获得的增益的正确方法是考虑26个符号相等的字母的熵与英文字母的熵。

(我希望stackoverflow允许像math.stackexchange.com那样使用TeX方程。这样我就可以在这里写出像样的方程了。哦,好吧。)

关键的公式是-p log(p),其中p是该符号的概率,并且日志以2为底,以位为单位获得答案。对每个符号计算此值,然后对所有符号求和

然后,在理想的算术编码方案中,26个符号的等概率集合将以4.70位/符号的形式进行编码。对于英语中的分布(使用来自的概率),我们得到每个符号4.18位。降幅仅为11%左右

这就是频率偏差本身能为你带来的一切。(这会给你带来更多拼字游戏分数,但我离题了。)

我们也可以在哈夫曼编码的近似空间中看同样的事情,其中每个代码都是整数位数。在这种情况下,您不会假设每个字母有五位(浪费了六个代码)。将哈夫曼编码应用于等概率的26个符号,得到6个长度为4位的码和20个长度为5位的码。这导致平均每个字母4.77位。使用英语字母频率的哈夫曼编码平均每个字母4.21位。减少12%,这与熵计算大致相同

有很多方法可以让真正的压缩机做得更好。首先,他们对文件中的内容进行编码,使用文件中内容的频率,而不是英语中的频率。这使得它独立于语言,针对实际内容进行优化,甚至不编码不存在的符号。第二,您可以将输入分解为多个部分,并为每个部分生成新代码。如果片段足够大,那么传输新代码的开销就很小,并且增益通常更大,可以在较小的块上进行优化。第三,你可以寻找更高阶的效果。与单个字母的频率不同,您可以考虑前一个字母,并根据前一个字母的出现概率来查看下一个字母的出现概率。现在您有26^2个概率(仅针对字母)需要跟踪。也可以为手头的实际数据动态生成这些数据,但是现在需要更多的数据来获得增益、更多的内存和更多的时间。您可以使用三阶、四阶等,以牺牲内存和时间来获得更高的压缩性能

还有其他方案来预处理数据,例如,通过执行游程编码、查找匹配字符串、应用块变换、标记XML、增量编码音频或图像等来进一步公开冗余,以便熵编码器利用。我提到算术编码,它可以代替哈夫曼,在不到一位的时间内对非常可能的符号进行编码,并将所有符号编码为分数位精度,以便在熵步中获得更好的性能


回到您关于什么构成压缩的问题,您可以从您喜欢的任何起点开始,例如每个字母一个8位字节,对您的输入做出断言,例如所有小写字母(接受如果断言为假,则方案失败),然后评估压缩效果。只要在比较两种不同的压缩方案时使用相同的假设。您必须小心,任何依赖于数据的内容也必须被视为压缩数据的一部分。例如,从数据块派生的自定义哈夫曼代码必须与该数据块一起发送。

即~4.7;如果你用一个整数编码,每个符号的位数等于5。雅各布:嗯,但是也有半位数的压缩,等等。给出正确的信息不是更好吗?哈夫曼算法只是一种方法。在OP的问题中,他显然是在说使用一种类似ascii的编码方案,将每个小写字母映射到一个固定的位数f