自适应霍夫曼编码如何工作?

信息处理 压缩
2022-01-05 10:23:19

霍夫曼编码是一种广泛使用的熵编码方法,用于数据压缩。它假设我们完全了解信号的统计信息。但是,有些版本的霍夫曼编码与流媒体一起使用,不可能知道有关信号统计的所有信息。这些自适应霍夫曼编码器是如何工作的?

1个回答

Wikipedia 文章很好地描述了自适应霍夫曼编码过程,它使用了一种著名的实现方式,即 Vitter 算法。正如您所指出的,标准的霍夫曼编码器可以访问其输入序列的概率质量函数,它用于为最可能的符号值构建有效的编码。例如,在基于文件的数据压缩的典型示例中,该概率分布可以通过对输入序列进行直方图计算,计算每个符号值的出现次数(例如,符号可以是 1 字节序列)。此直方图用于生成 Huffman 树,如下所示(取自 Wikipedia 文章):

霍夫曼树示例

这棵树是按输入序列中的权重或出现概率递减排列的;顶部的叶节点代表最可能的符号,因此在压缩数据流中接收最短的表示。然后将树与压缩数据一起保存,随后由解压缩器使用以再次重新生成(未压缩的)输入序列。作为早期的熵代码实现之一,标准霍夫曼编码相当简单。


自适应霍夫曼编码器的结构非常相似;它使用类似的基于树的输入序列统计表示来为每个输入符号值选择有效的编码。主要区别在于,作为算法的流式实现,没有关于输入概率质量函数的先验知识;必须动态估计序列的统计信息。如果要使用相同的霍夫曼编码方案,这意味着用于生成压缩流中每个符号的编码的树必须在处理输入流时动态构建和维护。

Vitter 算法是实现这一点的一种方法。在处理每个输入符号时,树会更新,保持其随着您向下移动树而降低符号出现概率的特性。该算法定义了一组规则,用于随着时间的推移如何更新树,以及如何在输出流中对生成的压缩数据进行编码。随着输入序列的消耗,树的结构应该越来越准确地描述输入的概率分布。与标准 Huffman 编码方法相比,解压缩器没有用于解码的静态树;它必须在解压过程中连续执行相同的树维护功能。

总结:自适应霍夫曼编码器的操作与标准算法非常相似;然而,不是对整个输入序列的统计数据(霍夫曼树)进行静态测量,而是使用序列概率分布的动态累积(即从第一个符号到当前符号)估计来编码(和解码)每个符号. 与标准霍夫曼编码方法相比,自适应霍夫曼算法需要在编码器和解码器上进行这种统计分析。