流行的DEFLATE算法在Lempel-Ziv的顶部使用霍夫曼编码。
通常,如果我们有一个随机的数据源(= 1位熵/位),那么包括霍夫曼在内的任何编码都不可能平均地对其进行压缩。如果Lempel-Ziv是“完美的”(随着长度的增长,它对于大多数类型的信号源都接近无穷大),那么用霍夫曼进行后期编码将无济于事。当然,Lempel-Ziv 并不完美,至少长度有限,因此仍然存在一些冗余。
霍夫曼编码部分地消除了这种剩余的冗余,从而改善了压缩。
我的问题是:为什么通过Huffman编码而不是LZ成功消除了剩余的冗余?霍夫曼与LZ的哪些属性使这种情况发生?再次运行LZ(即第二次使用LZ编码LZ压缩数据)是否会实现类似的效果?如果没有,为什么不呢?同样,首先使用Huffman进行压缩,然后使用LZ进行压缩,如果不能,为什么?
更新: 很明显,即使在LZ之后,也会保留一些冗余。有几个人指出了这一点。尚不清楚的是:为什么霍夫曼要比LZ更好地解决剩余冗余问题?与原始的源冗余(LZ比Huffman更好)相比,它有什么独特之处?