Huffman 编码

Huffman编码是一种基于字符出现概率的变长编码方法,用于数据压缩。通过构建Huffman树,确保高频字符对应短码,低频字符对应长码,从而达到最小化带权路径长度的目标。文章介绍了Huffman树的构造过程,以及在数据通信和Word2vec中的应用。
摘要由CSDN通过智能技术生成

1.Huffman编码

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

2.Huffman树

  树是一种重要的非线性数据结构,它是数据元素(结点)按照分支关系组织起来的结构。若干棵互不相交的树所构成的集合成为森林。

  • 路径路径长度

    路径: 在一棵树中,从一个结点往下可以到达的孩子或者孙子结点之间的通路。

    路径长度: 通路中的分支数目。

    若规定根结点的层号为1,则从根结点到第 L L L 层结点的路径长度为: L − 1 L-1 L1

  • 结点的权带权路径长度

    若为树中结点赋予一个具有某种含义的(非负)数值,则这个数值成为该结点的权

    带权路径长度: 从根结点到该结点之间的路径长度×该结点的权

  • 树的带权路径长度

    树的带权路径长度: 所有叶子结点的带权路径长度之和

Huffman树(最优二叉树):给定n个权值作为n个叶子结点,构造一个二叉树,它的带权路径长度最小。
在这里插入图片描述

图a中的数字表示权重,图a是常见的二叉树,图b就是图a转换过的最优二叉树。

图a中权重表示重要程度,可以看出,D是最重要的,有这样一个规则:最重要的放在最前面,由此构造了图b的哈夫曼树。

它们的带权路径长度分别为:

图a: W P L = 5 ∗ 2 + 7 ∗ 2 + 2 ∗ 2 + 13 ∗ 2 = 54 WPL = 5 * 2 + 7 * 2 + 2 * 2 +13 * 2 = 54 WPL=52+72+22+132=54

图b: W P L = 5 ∗ 3 + 2 ∗ 3 + 7 ∗ 2 + 13 ∗ 1 = 48 WPL = 5 * 3 + 2 * 3 + 7 * 2 + 13 * 1 = 48 WPL=53+23+72+131=48

可见,图b的带权路径长度较小,我们可以证明图b就是哈夫曼树

3.Huffman树的构造

给定n个权值 { w 1 , w 2 , . . . , w n } \{w_1,w_2,...,w_n\} {w1,w2,...,wn}作为二叉树的n个叶子结点,可以通过以下算法构造一棵Huffman树。

算法流程:

    1. { w 1 , w 2 , . . . , w n } \{w_1,w_2,...,w_n\} {w1,w2,...,wn}看成是有n棵树的森林(每棵树仅有一个结点)。
    1. 在森林中选出两个根结点的权值最小的树合并,作为新树的左、右子树,且新树的根结点权值为左、右子树根结点权值之和。
    1. 从森林中删除选取的两棵树,并将新树加入森林。
    1. 重复2) 、3)步,直至森林中只剩一棵树为止,该树即为所求的Huffman树。

举个栗子

例1:假设2014年世界杯期间,从新浪微博中抓取了若干条与足球相关的微博,经统计,“我”、“喜欢”、“观看”、“巴西”、“足球”、“世界杯”这个六个词出现的次数分别为15,8,6,5,3,1。请以这6个词为叶子结点,以相应的词频当权值,构造一棵Huffman树。

在这里插入图片描述

从上图可见:词频越大的词距离根结点越近。

构造过程中,通过合并新增的结点被标记为黄色。由于每两个结点都要进行一次合并,因此,若叶子结点的个数为n,则构造的Huffman树中新增的结点的个数为n-1。

约定:词频大的结点作为左孩子结点,词频小的结点作为右孩子结点。

4.Huffman编码

  在数据通信中,需要将传送的文字转换成二进制的字符串,用0,1码的不同排列来表示字符。

例如:需要传送:“AFTER DATA EAR ARE ART AREA",字符集为”A、E、R、T、F、D“,每个字母出现的次数为8,4,5,3,1,1。 现在要求编码这些字母。

要区别6个字母,最简单的二进制编码方式是等长编码,固定采用3位二进制( 2 3 = 8 > 6 2^3=8\gt6 23=8>6),可以用000、001、010、011、100、101对”A、E、R、T、F、D“编码发送,收到电文后按照三位一分进行译码即可。

编码长度取决于报文中不同字符的的个数。若报文中可能出现26个不同字符,则固定编码长度为5( 2 5 = 32 > 26 2^5=32\gt26 25=32>26),但是传送报文时希望长度越短越好。那么如何解决呢?

频率高的字符使用短码,频率低的字符使用长码

为了获取最短长度的报文,可将每个字符出现的频率作为字符结点的权值赋予在该结点上,显然字符使用频率越小权值就越小,权值越小的叶子就越靠下,这样就保证了此树的的最小带权路径长度,效果上就是报文的最短长度。

求最短报文长度 ===> 求字符集中所有字符作为叶子结点,字符频率作为权值所构建的Huffman树

Word2vec中也用到 Huffman 编码,它把训练语料中的词当成叶子结点,其在语料中出现的次数当作权值,通过构建相应的Huffman树来对每一个词进行Huffman编码。

举个栗子:

下图给出了在例1中的6个词的Huffman编码,其中约定(词频大的)左孩子结点编码为1,(词频较小)右孩子结点编码为0。“我”、“喜欢”、“观看”、“巴西”、“足球”、“世界杯”这个六个词的Huffman编码为:0,111,110,101,1001,1000。

在这里插入图片描述

约定:

  • 将权值大的结点作为左孩子结点,权值小的结点作为右孩子结点
  • 左孩子结点的编码为1,右孩子结点的编码为0

5.总结

  • Huffman树(最优二叉树):给定n个权值作为n个叶子结点,构造一个二叉树,它的带权路径长度最小。
  • 词频越大的词距离根结点越近。
  • Word2vec中也用到 Huffman 编码,它把训练语料中的词当成叶子结点,其在语料中出现的次数当作权值,通过构建相应的Huffman树来对每一个词进行Huffman编码。
  • 将权值大的结点作为左孩子结点(编码为1),权值小的结点作为右孩子结点(编码为0)

本文仅仅作为个人学习记录,不作为商业用途,谢谢理解。

参考:https://www.cnblogs.com/peghoty/p/3857839.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值