范式霍夫曼编码资料

参考资料:

《数据压缩导论》3.2.2 范式霍夫曼码

https://blog.csdn.net/xiji333/article/details/111995757

https://blog.csdn.net/Goncely/article/details/616589

Q1: 什么是范式霍夫曼码?

A1: 本质上是霍夫曼码(变长码),可根据码字长度和范式约束条件直接生成霍夫曼码,能大幅降低代码的存储要求。

一组霍夫曼码需通过“符号+码字”来完整地表示,例如有256个符号(8bit),最长的码字是20bit,则需要(8 + 20)*256 = 7168(个)bits的存储空间。

而范式霍夫曼码可以用5bits表示每个霍夫曼码的长度,仅需用 5 * 256 = 1280 (个)bits的存储空间,就可得到压缩性能相同的霍夫曼码。

Q2: 如何得到范式霍夫曼码?

A2: 步骤如下:

  1. 统计每个符号出现的频率。
  2. 生成霍夫曼码(略),得到每个符号的码字长度。
  3. 将码字长度从小到大依次排列,相同的码字长度,对应符号顺序较小的排在前面。
  4. 根据范式约束条件生成范式霍夫曼码,核心规则如下:
    (1)最小编码长度的第一个编码必须从值0开始。
    (2)相同长度编码必须是连续的。
    (3)编码长度为 j 的第一个符号可以从编码长度为 j - 1 的最后一个符号所得知,即 c j c_j cj = 2 * ( c j − 1 c_{j - 1} cj1 + 1)
  5. 根据码字长度及排列顺序,将范式霍夫曼码与符号相对应。

关于核心规则的重要tips:

  1. 确保范式霍夫曼码和原霍夫曼的每个符号对应的码字长度一致。最小编码长度的第一个编码可能是”0“,”00“,”000“, …
  2. 不同码字长度的艰难跨越:val = (val + 1) << ( b i t L e n j bitLen_j bitLenj - b i t L e n j − 1 bitLen_{j - 1} bitLenj1)

你可能感兴趣的:(算法,霍夫曼树)