Huffman编码

文章目录


本文主要介绍Huffman树与Huffman编码。

Huffman树

Huffman 树构造算法如下

(1)将{w1,w2,,wn}\{w_1,w_2,\ldots, w_n\}看成是有n棵树的森林(每棵树仅有一个结点)。

(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和。

(3)从森林中删除选取的两棵树,并将新树加入森林, .

(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求的Hufman树:

举例说明Huffman树的构建过程:

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

Huffman编码

从这个过程知词频越大的词离根节点越近。并且约定将词频大的节点作为左孩子节点。

Huffman编码

为了使不等长编码为前缀编码(即要求个字符的编码不能是另一个字符编码的前缀),可用字符集中的每个字符作为叶子结点生成一棵编码二叉树,为了获得传送报文的最短长度,可将每个字符的出现频率作为字符结点的权值赋予该结点上,显然字使用频率越小权值越小,权值越小叶子就越靠下,于是频率小编码长,频率高编码短,这样就保证了此树的最小带权路径长度,效果上就是传送报文的最短长度。因此,求传送报文的最短长度问题转化为求由字符集中的所有字符作为叶子结点,由字符出现频率作为其权值所产生的Hufman树的问题,利用Huffman树设计的二进制前缀编码,称为Hffiman 编码,它既能满足前缀编码的条件,又能保证报文编码总长最短。

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

如下图所示:

Huffman编码

​ “我”、 “喜欢”、“观看”、“巴西”、“足球”、“世界杯”这六个词的Huffmnan 编码分别为0, 111, 110, 101, 1001和1000。

参考文章
word2vec中的数学原理理解