数据结构之树的应用——赫夫曼编码

前言

树是一个比较高级的数据结构,他的应用也有很多,程杰老师的书中举了一个很典型的应用:赫夫曼编码。
在计算机和互联网技术中,文本压缩是一个非常重要的技术。它除了可以减少文档在磁盘的空间外,在网络上以压缩的形式传输数据,使得保存和传递都更加高效。
压缩而不出错,就是把我们的文本进行重新编码,以减少不必要的空间。最基本的编码方法:赫夫曼编码。

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:5
3+153+402+302+102=220

判断比较方式少了三分之一量

2.得出赫夫曼(最优)二叉树的方法

  1. 选取两个权值最小的树作为左右子树构造一颗新的二叉树,且置新的二叉树的根节点的权值为左右子树权值之和。
  2. 依次重复
  3. 图解:
    按权值从大到小排成有序序列:
    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

这种叫做前缀编码,任一字母的编码都不是另一个字符编码的前缀,很好的解决了网络传输速度的问题。这就是赫夫曼编码。

后记

以上就是树的各种储存结构,喜欢的多多支持哦~

发布了12 篇原创文章 · 获赞 10 · 访问量 1139

猜你喜欢

转载自blog.csdn.net/bsqetuo/article/details/98728033