学习时间
2021-01-27
学习内容
哈夫曼树
哈夫曼树又称最优二叉树,是带权路径长度最短的树,可用来构造最优编码,用于信息传输、数据压缩等方面,是一种应用广泛的二叉树。
哈夫曼树的基本概念
- 路径:树中的一个结点到另一个结点之间的分支序列构成两个结点之间的路径
- 路径长度:路径上分支的条数称为路径长度
- 结点的权:给树中结点赋予一个数值,这个数值称为结点的权
- 带权路径长度:结点到树根间的路径长度与结点的权的乘积称为这个结点的带权路径长度
- 树的带权路径长度:树中所有叶子结点的带权路径长度的和称为树的带权路径长度,通常记作WPL
- 最优二叉树:在叶子个数和权值确定的情况下,WPL最小的二叉树称为最优二叉树,也叫哈夫曼树
根据经验:权值大的叶子距离根结点近,树的WPL小
哈夫曼树的建立
假设有n个权值,则构造出的哈夫曼树有32313133353236313431303231363533e58685e5aeb931333365646233n个叶子结点。 n个权值分别设为 k1、k2、…、kn,则哈夫曼树的构造规则为:
(1) 将k1、k2、…,kn看成是有n 棵树的森林(每棵树仅有一个结点);
(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;
(3)从森林中删除选取的两棵树,并将新树加入森林;
(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。
图示:
哈夫曼树存储结构的特点
哈夫曼树中没有度为1的结点,这类二叉树称为正则二叉树,对于n个叶子的哈夫曼树,算法中构建了一个n-1个度为2的结点,所以哈夫曼树共有2n-1个结点,可以存储在一个大小为2n-1的一维数组中
哈夫曼编码
哈夫曼静态编码
它对需要编码的数据进行两遍扫描:第一遍统计原数据中各字符出现的频率,利用得到的频率值创建哈夫曼树,并必须把树的信息保存起来,即把字符0-255(28=256)的频率值以2-4BYTES的长度顺序存储起来,(用4Bytes的长度存储频率值,频率值的表示范围为0–232-1,这已足够表示大文件中字符出现的频率了)以便解压时创建同样的哈夫曼树进行解压;第二遍则根据第一遍扫描得到的哈夫曼树进行编码,并把编码后得到的码字存储起来。
哈夫曼动态编码
动态哈夫曼编码使用一棵动态变化的哈夫曼树,对第t+1个字符的编码是根据原始数据中前t个字符得到的哈夫曼树来进行的,编码和解码使用相同的初始哈夫曼树,每处理完一个字符,编码和解码使用相同的方法修改哈夫曼树,所以没有必要为解码而保存哈夫曼树的信息。编码和解码一个字符所需的时间与该字符的编码长度成正比,所以动态哈夫曼编码可实时进行。