Java数据结构--哈夫曼树

一、哈夫曼树概述

路径:若在树中存在一个结点序列k1,k2, …, kj,使得ki是ki+1的双亲(1 ≤ i ≤ j),则此结点序列称为k1到kj的路径。
路径的长度:从k1到kj所经过的分支树称为这两点之间的路径长度,它等于路径上的结点数减1。
结点的权:在许多应用中,常常将树中的某个结点赋上一个具有某种意义的数值,这个和某个结点相关的数值称为该结点的权或权值。
结点的带权路径长度:值从树根到该结点之间的路径长度与结点的权值得乘积。
树的带权路径长度:值树中所有叶子结点的带权路径长度之和,通常记为WPL=
。其中n表示叶子结点的个数,Wi 表示叶子结点Ki的权值,Li 表示根结点到Ki的路径长度。
哈夫曼树:又称最优二叉树,它是 n 个带权的叶子结点构成的所有二叉树中带权路径长度WPL最下的二叉树。

二、哈夫曼树的构造算法

假设有n个权值,则构造出的哈夫曼树有n个叶子结点。n个权值分别设为w1,w2,…,wn,则哈夫曼树的构造算法为:
1)将w1,w2,…,wn看成是有n棵树的深林(每棵树仅有一个结点);
2)在森林中选出两个根结点的权值最小的树,作为一棵树的左、右子树,且树的根结点权值为左、右子树根结点权值之和;
3)从森林中删除选取的两棵树,并将新树加入森林;
4)重复(2)、(3)步,直到森林中剩一棵树为止,该树即为所求得的哈夫曼树。

示例:假定用于通信的电文由8个字符A、B、C、D、F、G、H组成,各个字母在电文中出现的概率为5%、25%、4%、7%、9%、12%、30%、8%,用这8个字母构造哈夫曼编码。
这8个字母对应的权值分别为5,25,4,7, 9,12, 30, 8,并且n=8。
根据哈夫曼的构造算法,具体构造如图2.1所示。
在这里插入图片描述

三、哈夫曼编码

在数据通信中,需要将传送的文字转化成二进制的字符串,用0,1码的不同排序来表示字符。最简单的二进制编码方式时等长编码,第2节示例中通信的电文用固定3位二进制。可分别用000、001、010、011、100、101、110、111对“A、B、C、D、E、F、G、H”进行编码发送,当对方接收报文时再按照三位一分进行译码,显然编码的长度取决于报文中不同字符的个数。若报文中可能出现26个不同的字符,则固定编码长度为5。然而,传送报文时总是希望总长度尽可能短。在实际应用中,各个字符的出现频度或使用次数是不相同的,如A、B、C的使用频率远远高于X、Y、Z,自然会想到设计编码时,让使用频率高的用短码,使用频率低的用长码,以优化整个报文编码。
为使不等长编码为前缀编码(即要求一个字符的编码不能是另一个字符编码的前缀),可用字符集中的每个字符做为叶子结点生成一棵编码二叉树(即哈夫曼树),为了获得传送报文的最短长度,可将每个字符的出现频率作为字符结点权值赋予该结点上,显然字符使用频率越小权值越小,权值越小叶子就越越靠下,于是频率小编码长,频率高编码短,这样就保证了此树的最下带权路经长度在效果上就是传送报文的最短长度。因此,求传送报文的最短长度问题传化为求由字符集中所有字符作为叶子结点,由字符出现频率作为其权值所生产的哈夫曼树的问题。利用哈夫曼树来设计二进制的前缀编码,即满足前缀编码的条件,又保证报文编码总长最短。
利用图2.1第8步得到的哈夫曼树来设计哈夫曼编码,规定左分支用
0表示右分支用1表示,如图3.1所示

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书香水墨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值