现在我们都是讲究效率的社会,什么都要求速度, 在不能出错的情况下,做任何事情都讲究越快越好。在计算机和互联网技术中,文本压缩就是一个非常重要的技术。 玩电脑的人几乎都会应用压缩和解压缩软件来处理文档。 因为它除了可以减少文档在磁盘上的空间外,还有重要的一点,就是我们可以在网络上以压缩的形式传输大量数据,使得保存和传递都更加高效。
那么压缩而不出错是如何做到的呢?简单说,就是把我们要压缩的文本进行重新编码,以减少不必要的空间。尽管现在最新技术在编码上已经很好很强大,但这一切都来自于曾经的技术积累,我们今天就来介绍一下最基本的压缩编码方法一一赫夫曼编码。
赫夫曼树
在介绍赫夫曼编码前,我们必须得介绍赫夫曼树,什么叫做赫夫曼树呢?我们先来看一个例子。
过去我们小学、中学一般考试都是用百分制来表示学科成绩的。对于老师来讲,他在对试卷评分的时候,显然不能凭感觉给优良或及格不及格等成绩,因此一般都还是按照百分制算出每个学生的成绩后,再根据统一的标准换算得出五级分制的成绩。比如下面的代码就实现了这样的转换。
if ( a < 60 ) {
b = "不及格" ;
} else if ( a < 70 ){
b = "及格" ;
} else if ( a < 80 ) {
b = "中等“ ;
} else if ( a < 90 ) {
b = "良好 " ;
} else {
b = "优秀" :
}
根据上面的代码,转换成下图,粗略看没什么问题,可是通常都认为,一张好的考卷应该是让学生成绩大部分处于中等或良好的范围,优秀和不及格都应该较少才对。而上面这样的程序,就使得所有的成绩都需要先判断是否及格,再逐级而上得到结果。输入量很大的时候,其实算法是有效率问题的。
如果在实际的学习生活中,学生的成绩在 5 个等级上的分布规律下图所示:
那么 70 分以上大约占总数 80% 的成绩都需要经过 3 次以上的判断才可以得到结果,这显然不合理。
有没有好一些的办法呢?仔细观察发现,中等成绩 (70-79 分之间)比例最高,其次是良好成绩,不及格的所占比例最少。我们把上面的二叉树重新进行分配。 改成如下图的做法试试看。