哈夫曼树和哈夫曼编码

 当树中的节点被赋予一个表示某种意义的数值,咱们称之为该节点的权。从树的根节点到任意节点的路径长度(通过的边数)与该节点上权值的乘积称为该节点的带权路径长度。树中全部叶节点的带权路径长度之和称为该树的带权路径长度(WPL)。当带权路径长度最小的二叉树被称为哈夫曼树,也成为最优二叉树。优化

     以下图所示,有三课二叉树,每一个树都有四个叶子节点a,b,c,d,分别取带权7,5,2,4。他们的带权路径长度分别为编码

(a) WPL = 7x2+5x2+2x2+4x2=36spa

(b) WPL = 2X1+4X2+7X3+5X3 = 46设计

(c) WPL = 7x1+5x2+2x3+4x3 = 35blog

image

节点若是像c中的方式分布的话,WPL能取最小值(可证实),咱们称为哈夫曼树。字符串

哈夫曼树构造


哈夫曼树在构造时每次从备选节点中挑出两个权值最小的节点进行构造,每次构造完成后会生成新的节点,将构造的节点从备选节点中删除并将新产生的节点加入到备选节点中。新产生的节点权值为参与构造的两个节点权值之和。举例以下:get

image

  • 备选节点为a,b,c,d,权值分别为7,5,2,4
  • 选出c和d进行构造(权值最小),生成新节点为e(权值为6),备选节点变为7,5,6
  • 选出b和e进行构造,生成新节点f(权值为11),备选节点为7,11
  • 将最后的7和11节点进行构造,最后生成如图所示的哈夫曼树

哈夫曼树应用


     在处理字符串序列时,若是对每一个字符串采用相同的二进制位来表示,则称这种编码方式为定长编码。若容许对不一样的字符采用不等长的二进制位进行表示,那么这种方式称为可变长编码。可变长编码其特色是对使用频率高的字符采用短编码,而对使用频率低的字符则采用长编码的方式。这样咱们就能够减小数据的存储空间,从而起到压缩数据的效果。而经过哈夫曼树造成的哈夫曼编码是一种的有效的数据压缩编码。it

     若是没有一个编码是另外一个编码的前缀,则称这样的编码为前缀编码。如0,101和100是前缀编码。由前缀码造成的序列能够被惟一的组成一个字符串序列。如00101100能够被惟一的分析为0,0,101和100。class

示例:二叉树

咱们对一个字符串进行统计发现a-f出现的频率分别为a:45,b:13,c:12,d:16,e:9,f:5,咱们对该字符串进行采用哈夫曼编码进行存储。

image

WPL = 1x45+3x(13+12+16)+4x(5+9)=224

这样算下来使用224二进制位就能够将该字符串存储起来,由于哈夫曼码是前缀码,因此能够惟一的还原出原来的字符序列。若是咱们每一个字符使用3位进行存储(至少3位),那么须要300bit才能将该字符串存储下。

 

在数据通讯中,须要将传送的文字转换成二进制的字符串,用0,1码的不一样排列来表示字符。例如,需传送的报文为“AFTER DATA EAR ARE ART AREA”,
这里用到的字符集为“A,E,R,T,F,D”,各字母出现的次数为{8,4,5,3,1,1}。现要求为这些字母设计编码。要区别6个字母,最简单的二进制编码方式是等长编码,
固定采用3位二进制,可分别用000、00一、0十、0十一、100、101对“A,E,R,T,F,D”进行编码发送,当对方接收报文时再按照三位一分进行译码。
显然编码的长度取决报文中不一样字符的个数。若报文中可能出现26个不一样字符,则固定编码长度为5。然而,传送报文时老是但愿总长度尽量短。
在实际应用中,各个字符的出现频度或使用次数是不相同的,如A、B、C的使用频率远远高于X、Y、Z,天然会想到设计编码时,让使用频率高的用短码,使用频率低的用长码,以优化整个报文编码。
相关文章
相关标签/搜索