请求评论霍夫曼压缩

Man*_*ake 1 c

我看到的文件压缩器的实现总是压缩字节数组.

但它可以压缩短裤阵列甚至是压缩.

如果霍夫曼二进制树中的每个符号表示一个字节,则当它是最佳时,我们可以在单个位中压缩最多8位.

如果霍夫曼树中的每个符号表示短路,则当它是最佳时,我们可以在单个位中压缩最多16位.

这是对的吗?

有人可以用这个额外的霍夫曼编码信息更新维基百科吗?

Mar*_*ers 7

最佳压缩是将整个文件视为单个令牌,并使用零长度霍夫曼代码对其进行压缩.这为您提供了无限的压缩比.不幸的是,霍夫曼代码的描述会非常大.

  • 那么最小的霍夫曼令牌是1位.唯一令牌的描述将是整个文件的大小.因此,您正在查看原始文件大小至少1位的编码大小.大声笑 (2认同)

Gre*_*g D 6

这是正确的,但它并不像听起来那么惊人.

必须传输两个数据来解码霍夫曼编码的字节流.编码流(当然)是必需的,但是字典也可以让你正确地构建你的霍夫曼树来执行解码.

使用较大的令牌对数据进行编码将始终产生较小的编码流.不幸的是,除非你的数据具有一些非常具体和特殊的特征,否则更大的标记也会导致你的字典大小出乎意料地增加.退化情况(由Mark Byers的回答引用)将导致整个未压缩数据流是单个令牌,并且编码流是单个位,导致绝对没有压缩.

因此,霍夫曼编码(几乎所有的东西)都是权衡的练习.在编码文件的效率和字典的大小之间取得平衡可能是棘手的.我从未根据数据特征进行实际分析,以找出各种理想的令牌大小可能是什么,但我认为字节往往被使用,因为它是一个简单的分开点,通常会导致一些真正的压缩.我知道在大学时我曾经做过一次有四个字节标记的练习,但我不能说老实说它比一个字节标记更好.

当然,它也可以作弊,而不是动态地构建字典以获得真正贪婪的压缩,您可以使用预先构建的树并使用它进行压缩.然后,您将避免传输字典,但解码器也必须使用相同的字典来解码数据.