哈夫曼树

哈夫曼树

1 哈夫曼树的基本概念
首先给出定义哈夫曼树所要用到的几个基本概念。
(1)路径(Path):从树中的一个结点到另一个结点之间的分支构成这两个结
点间的路径。
(2)路径长度(Path Length):路径上的分支数。
(3)树的路径长度(Path Length of Tree):从树的根结点到每个结点的路径
长度之和。在结点数目相同的二叉树中,完全二叉树的路径长度最短。
(4)结点的权(Weight of Node):在一些应用中,赋予树中结点的一个有实
际意义的数。
(5)结点的带权路径长度(Weight Path Length of Node):从该结点到树的根结点的路径长度与该结点的权的乘积。
(6)树的带权路径长度(WPL):树中所有叶子结点的带权路径长度之和。
那么,什么是哈夫曼树呢?
哈夫曼树(Huffman Tree),又叫最优二叉树,指的是对于一组具有确定权值
的叶子结点的具有最小带权路径长度的二叉树。
在下图所示的的四棵二叉树,都有 4 个叶子结点,其权值分别为 1、2、3、4,它们的带权路径长度分别为:
(a)WPL=1×2+2×2+3×2+4×2=20
(b)WPL=1×1+2×2+3×3+4×3=28
©WPL=1×3+2×3+3×2+4×1=19
(d)WPL=2×1+1×2+3×3+4×3=29
其中,图 ©所示的二叉树的带权路径长度最小,这棵树就是哈夫曼树。
可以验证,哈夫曼树的带权路径长度最小。
在这里插入图片描述
那么,如何构造一棵哈夫曼树呢?哈夫曼最早给出了一个带有一般规律的算
法,俗称哈夫曼算法。现叙述如下:
(1)根据给定的n个权值{w1,w2,…,wn},构造n棵只有根结点的二叉树集合
F={T1,T2,…,Tn};
(2)从集合 F 中选取两棵根结点的权最小的二叉树作为左右子树,构造一
棵新的二叉树,且置新的二叉树的根结点的权值为其左、右子树根结点权值之和。
(3)在集合 F 中删除这两棵树,并把新得到的二叉树加入到集合 F 中;
(4)重复上述步骤,直到集合中只有一棵二叉树为止,这棵二叉树就是哈
夫曼树。
下图是给出了前面提到的叶子结点权值集合 W={1,2,3,4}的哈夫曼树的构
造过程。
由二叉树的性质 4 和哈夫曼树的特点可知,一棵有 n 个叶子结点构造的哈夫
曼树共有 2n-1 个结点。
在这里插入图片描述
2 哈夫曼树类的实现
由哈夫曼树的构造算法可知,用一个数组存放原来的 n 个叶子结点和构造过
程中临时生成的结点,数组的大小为 2n-1。所以,哈夫曼树类 HuffmanTree 中有两个成员字段:data 数组用于存放结点,leafNum 表示哈夫曼树叶子结的数目。结点有四个域,一个域 weight,用于存放该结点的权值;一个域 lChild,用于存放该结点的左孩子结点在数组中的序号;一个域 rChild,用于存放该结点的右孩子结点在数组中的序号;一个域 parent,用于判定该结点是否已加入哈夫曼树中。哈夫曼树结点的结构为:
在这里插入图片描述
所以,结点类 Node 有 4 个成员字段,weight 表示该结点的权值,lChild 和
rChild 分别表示左、右孩子结点在数组中的序号,parent 表示该结点是否已加入哈夫曼树中,如果 parent 的值为-1,表示该结点未加入到哈夫曼树中。当该结点已加入到哈夫曼树中时,parent 的值为其双亲结点在数组中的序号。
3 哈夫曼编码
在数据通信中,通常需要把要传送的文字转换为由二进制字符 0 和 1 组成的
二进制串,这个过程被称之为编码(Encoding)。例如,假设要传送的电文为
DCBBADD,电文中只有 A、B、C、D 四种字符,若这四个字符采用表(a)
所示的编码方案,则电文的代码为 11100101001111,代码总长度为 14。若采用表(b) 所示的编码方案,则电文的代码为 0110101011100,代码总长度为 13。
在这里插入图片描述
哈夫曼树可用于构造总长度最短的编码方案。具体构造方法如下:
设需要编码的字符集为{d1,d2,…,dn},各个字符在电文中出现的次数或频率
集合为{w1,w2,…,wn}。以d1,d2,…,dn作为叶子结点,以w1,w2,…,wn作为相应叶子结点的权值来构造一棵哈夫曼树。规定哈夫曼树中的左分支代表 0,右分支代表 1,则从根结点到叶子结点所经过的路径分支组成的0和1的序列便为该结点对应字符的编码就是哈夫曼编码(Huffman Encoding)。
下图就是电文 DCBBADD 的哈夫曼树,其编码就是表(b)。
在建立不等长编码中,必须使任何一个字符的编码都不是另一个编码的前
缀,这样才能保证译码的唯一性。例如,若字符 A 的编码是 00,字符 B 的编码是 001,那么字符 A 的编码就成了字符 B 的编码的后缀。这样,对于代码
001001,在译码时就无法判定是将前两位码 00 译成字符 A 还是将前三位码 00译成 B。这样的编码被称之为具有二义性的编码,二义性编码是不唯一的。而在哈夫曼树中,每个字符结点都是叶子结点,它们不可能在根结点到其它字符结点的路径上,所以一个字符的哈夫曼编码不可能是另一个字符的哈夫曼编码的前缀,从而保证了译码的非二义性。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值