霍夫曼编码

时间:2012-07-22 15:13:34

标签: string compression huffman-code

在什么条件下,霍夫曼编码使字符串不可压缩?当所有角色以相同的频率/概率出现时?如果是这样,那怎么能证明这是真的呢?

3 个答案:

答案 0 :(得分:9)

您可以为一系列符号计算一个简单的零阶熵,它会告诉您是否有机会仅使用霍夫曼编码进行显着压缩。 (我希望stackoverflow有像math.stackexchange.com那样的TeX格式。我不能在这里编写像样的方程式。)

计算您拥有的不同符号的数量,并使用编号 1..n 的符号调用 n 。计算每个符号的概率,即每个符号出现的次数除以序列的长度,并调用 p(k)。那么使用零阶编码最好的办法是每个符号的平均位数等于: -sum(p(k)log(p(k)),k = 1..n)/ log( 2)。然后你可以将结果与 log(n)/ log(2)进行比较,如果所有概率都相等( 1 / n ),那么答案是什么不平等概率可以给你多少钱。如果您当前将符号存储为每个字节(在这种情况下 n&lt; = 256 ),您也可以将结果与 8 进行比较。< / p>

霍夫曼代码每个符号的位数等于或大于该熵。您还需要考虑如何将霍夫曼代码传达给接收器。您将需要某种描述代码的标头,这将占用更多位。算术或范围代码可能比Huffman代码更接近熵,特别是对于很长的序列。

通常,霍夫曼代码本身不会产生非常令人满意的压缩。对100M字符英文文本测试文件enwik8的快速测试给出了每符号约5位的熵,以及文本的霍夫曼编码。霍夫曼(或算术或范围)编码需要与输入数据的高阶模型结合使用。这些模型可以是简单的字符串匹配,如用于deflate或LZMA的LZ77,Burrows-Wheeler变换或部分匹配预测。 LZ77压缩器,在这种情况下为gzip,每符号少于3位。

我无法抗拒地包括一张玻尔兹曼墓碑的图片,上面刻有将熵与概率联系起来的公式,基本上就是上面的公式。

enter image description here

答案 1 :(得分:8)

简而言之,霍夫曼编码将较小的比特长度代码分配给更可能的二进制组合,将较长的代码分配给不太可能的二进制组合。如果所有这些都具有相同的可能性,您会发现没有真正的优势,因为由于更短的代码导致的压缩由于同样可能更长的代码而丢失。

答案 2 :(得分:7)

我想到了两个因素:

  • 如果你有相似的元素概率,那么很少 压缩将是可能的
  • 如果你试图压缩一个小输入(比如一个短文本),那么附加一个Huffman查找表(也就是字典 - 你需要解码压缩文件,不是吗?)的开销可以使最终尺寸甚至大于原始输入。