最佳压缩是将整个文件视为单个令牌,并使用零长度霍夫曼代码对其进行压缩.这为您提供了无限的压缩比.不幸的是,霍夫曼代码的描述会非常大.
这是正确的,但它并不像听起来那么惊人.
必须传输两个数据来解码霍夫曼编码的字节流.编码流(当然)是必需的,但是字典也可以让你正确地构建你的霍夫曼树来执行解码.
使用较大的令牌对数据进行编码将始终产生较小的编码流.不幸的是,除非你的数据具有一些非常具体和特殊的特征,否则更大的标记也会导致你的字典大小出乎意料地增加.退化情况(由Mark Byers的回答引用)将导致整个未压缩数据流是单个令牌,并且编码流是单个位,导致绝对没有压缩.
因此,霍夫曼编码(几乎所有的东西)都是权衡的练习.在编码文件的效率和字典的大小之间取得平衡可能是棘手的.我从未根据数据特征进行实际分析,以找出各种理想的令牌大小可能是什么,但我认为字节往往被使用,因为它是一个简单的分开点,通常会导致一些真正的压缩.我知道在大学时我曾经做过一次有四个字节标记的练习,但我不能说老实说它比一个字节标记更好.
当然,它也可以作弊,而不是动态地构建字典以获得真正贪婪的压缩,您可以使用预先构建的树并使用它进行压缩.然后,您将避免传输字典,但解码器也必须使用相同的字典来解码数据.