考研数据结构之树(6.5)——树与二叉树的应用之赫夫曼树和赫夫曼编码(C表示)

与赫夫曼树的一些概念

赫夫曼树又叫作最优二叉树,它的特点是带权路径最短

首先需要说明几个关于路径的概念:

  • 1)路径:路径是指从树中一 个结点到另一个结点的分支所构成的路线。
  • 2)路径长度:路径长度是指路径上的分支数目。
  • 3)树的路径长度:树的路径长度是指从根到每个结点的路径长度之和。
  • 4)带权路径长度:结点具有权值,从该结点到根之间的路径长度乘以结点的权值,就是该结点的带权路径长度。
  • 5)树的带权路径长度(WPL):树的带权路径长度是指树种所有叶子结点的带权路径长度之和。

赫夫曼树的构造方法

给定n个权值,用这n个权值来构造赫夫曼树的算法描述如下:

  • 1)将这n个权值分别看作只有根结点的n棵二叉树,这些二叉树构成的集合记为F。
  • 2)从F中选出两棵根结点的权值最小的树(假设为a、b)作为左、右子树,构造一棵新的二叉树(假设为c),新的二叉树的根结点的权值为左、右子树根结点权值之和。
  • 3)从F中删除a、b,加入新构造的树C.
  • 4)重复进行2)、3)两步,直到F中只剩下一棵树为止,这棵树就是赫夫曼树。

图解(图中结点下面的数字代表该结点的权值):

赫夫曼树的特点

  • 1)权值越大的结点,距离根结点越近。
  • 2)树中没有度为1的结点。这类树又叫作正则(严格)二叉树。
  • 3)树的带权路径长度最短。

赫夫曼编码

赫夫曼编码是对赫夫曼树的一种应用,赫夫曼编码用在文件压缩等方面。

下面用一个例子说明赫夫曼编码是如何对文件进行压缩的。如有一串字符“S=AAABBACCCDEEA”,自己选三位长度的二进制为各个字符进行编码,设置的编码规则如下:

ABCDE
000001010011100

根据上面的表可以将S串编码为:

T(S)=000000000001001000010010010011100100000

并将其存储在计算机种,用的时候按照上表进行解码得到S串。

上面的T(S)的长度为39,想办法将这个编码串变短些,就可以使用赫夫曼编码的方法来解决。

首先统计各个字符在字符串中的出现次数,如下表:

ABCDE
5次2次3次1次2次

以字符为根节点,以对应的出现次数为权值,构造一棵赫夫曼树,如下图:

 

则对A-E的赫夫曼编码规则如下表:

ABCDE
01101011101111

则串S的编码为:H(S)=00011011001010101110111111110。

上述由赫夫曼树导出每个字符的编码,进而得到对整个字符串的编码的过程称为赫夫曼编码。

H(S)串长度为29,比T(S)串短多了,会节约空间。

赫夫曼n叉树

赫夫曼二叉树是赫夫曼n叉树的一种特例, 对于结点数目大于等于2的待处理序列,都可以构造赫夫曼二叉树,但却不一定能构造赫夫曼n叉树。当发现无法构造时,需要补上权值为0的结点让整个序列凑成可以构造赫夫曼n叉树的序列。

如序列A(1)、B(3)、 C(4)、 D(6) (括号内为 权值),就不能直接构造赫夫曼三叉树,需要补上一 个权值为0的结点。此时新结点序列为: H(0)、 A(1)、 B(3)、C(4)、 D(6),这样就可以类比赫夫曼二叉树的构造方法,每次挑选权值最小的三个结点构造一棵三叉树, 以此类推,直到所有结点都被并入树中。

图解:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值