美文网首页
哈夫曼编码(Huffman编码)

哈夫曼编码(Huffman编码)

作者: Erich_Godsen | 来源:发表于2021-06-27 12:50 被阅读0次

    Huffman编码又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变[字长]编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据[字符]出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。

    实例分析

    • MP3音频压缩
      采样:每秒采用44100次,50分钟音乐产生
      T=50×60×44100≈130M个样本
      量化:每个样本量化为有限集Γ中最近的一个值
      假设量化产生四个不同的值(字符)A、B、C、D,一种编码方式
      00表示A,01表示B,02表示C,03表示D
      50分钟音乐共需要130M×2=260Mbit

    假设4个字符出现频次不同,具体如下:


    image.png
    • 考虑用可变长编码
      比如A、B、C、D编码为{0,01,11,001}
      70×1+3×2+20×2+37×3=227Mbit
      存在问题,字符串001可能有两种解码结果AB和D
      规则:一个码字不能是其它码字的前缀

    Huffman编码方案

    1. 使用完全二叉树表示无前缀编码
    2. 完全二叉树
      任何节点:0个或者2个孩子节点
      如有孩子节点,左分支0,右分支1
    3. 叶子节点表示编码结果
    4. 字符出现频次越低,用于编码的叶子节点位置越深(叶子节点的深度被称为编码代价)

    上面那个例子可以按照上面的算法逻辑进行编码,得到的总长度为
    70×1+3×3+20×3+37×2=213Mbit

    image.png

    贪心算法构造编码树

    • 从f1、f2、…、fn找到频次最低的两个字符,假设为f1和f2,作为一个父节点上的两个子节点,用f1+f2表示这个父节点的代价
    • 再在f1+f2、f3、…、fn找频次最低的两个元素,….


      image.png

    相关文章

      网友评论

          本文标题:哈夫曼编码(Huffman编码)

          本文链接:https://www.haomeiwen.com/subject/vxhxultx.html