1. 哈夫曼树和哈夫曼编码
1.1 哈夫曼树的定义
- 结点的带权路径长度: 树的根到节点的路径长度与节点的权值的乘积。
- 树的带权路径长度: 树中所有叶结点的带权路径长度之和。
W P L = ∑ i = 1 n L i w i WPL = \sum_{i=1}^n L_i w_i WPL=i=1∑nLiwi
哈夫曼树(最优二叉树): 含有n个带权叶节点的二叉树中,带权路径长度最小的二叉树。
1.2 哈夫曼树的构造
(1)步骤
- 将n个节点分别作为n棵仅含一个节点的二叉树,构成森林F。
- 构造新节点:从森林F中选择根节点权值最小的两个树作为新节点的左右子树,新节点的权值为其左右子树根节点权值之和。
- 删除选出的两棵树,将新的到的树加入森林F。
- 重复步骤2、3,直到F中只剩下一颗树。
(2)特点
- 每个初始节点最终都成为叶节点。
- 构造过程中新建了n-1个新节点,哈夫曼树的节点总数为2n-1.
- 哈夫曼树中不存在度为1的节点。
1.3 哈夫曼编码
(1)定义
- 固定长度编码: 对每个字符用相等长度的二进制位表示。
- 可变长度编码: 允许对不同字符用不等长的二进制位表示。
- 前缀编码: 没有一个编码是另一个编码的前缀。
(2)哈夫曼编码
- 每个出现的字符都成为叶节点。
- 节点的权值为字符出现的频率。
- 左0右1.