前言
树是一个比较高级的数据结构,他的应用也有很多,程杰老师的书中举了一个很典型的应用:赫夫曼编码。
在计算机和互联网技术中,文本压缩是一个非常重要的技术。它除了可以减少文档在磁盘的空间外,在网络上以压缩的形式传输数据,使得保存和传递都更加高效。
压缩而不出错,就是把我们的文本进行重新编码,以减少不必要的空间。最基本的编码方法:赫夫曼编码。
1.赫夫曼树定义及其原理
我们先看一个例子,试卷分数按百分制再给出五级分制成绩,而好的试卷应该让学生都处于中等或良好的范围内,如图:
分数 | 0~59 | 60~69 | 70~79 | 80~89 | 90~100 |
---|---|---|---|---|---|
等级 | A | B | C | D | E |
所占比例 | 5% | 15% | 40% | 30% | 10% |
下面代码实现了按百分制再给出五级分制成绩的转换:
if(a < 60)
b = “A”;
else if(a < 70)
b = “B”;
else if(a < 80)
b = “C”;
else if(a < 90)
b = “D”;
else
b = “E”;
但是由于每个等级所占百分比不同,这样算效率是有问题的:
把二叉树简化成叶子结点带权的二叉树(注意这里的权是什么)
有没有好的方法,把这颗二叉树重新分配:
这样效率就要高一点了
树a路径长度:1+1+2+2+3+3+4+4=20
树b路径长度:1+2+3+3+2+1+2+2=16
树a的WPL:51+152+403+304+104=315
树b的WPL:53+153+402+302+102=220
判断比较方式少了三分之一量
2.得出赫夫曼(最优)二叉树的方法
- 选取两个权值最小的树作为左右子树构造一颗新的二叉树,且置新的二叉树的根节点的权值为左右子树权值之和。
- 依次重复
- 图解:
按权值从大到小排成有序序列:
A5, E10, B15, D30, C40
依次选出最小的两个:
N115, B15, D30, C40
N230, D30, C40
C40, N360
T100(根结点)
不过现实复杂的多,在这棵树每个结点都需要两次比较。当然这不是我们要讨论的重点了。
3.赫夫曼编码:
为了解决远距离通信(主要是电报)的数据传输的最优化问题
假设只传输刚开始几个字母,出现的频率(权值)如表:
字母 | A | B | C | D | E | F |
---|---|---|---|---|---|---|
二进制字符 | 000 | 001 | 010 | 011 | 100 | 101 |
频率 | 27 | 8 | 15 | 15 | 30 | 5 |
下图左图为构造赫夫曼过程的权值显示,右图将左权值改为0,右权值改为1:
此时,我们对这六个字母从树根到叶子所经过的路径的0或1编码,得到下表:
字母 | A | B | C | D | E | F |
---|---|---|---|---|---|---|
编码 | 01 | 1001 | 101 | 00 | 11 | 1000 |
这种叫做前缀编码,任一字母的编码都不是另一个字符编码的前缀,很好的解决了网络传输速度的问题。这就是赫夫曼编码。
后记
以上就是树的各种储存结构,喜欢的多多支持哦~