哈夫曼、编码
一、题型
CSP-J 第一轮题型设置为三种,满分:100分。
- 选择题
共 15 15 15 道, 2 2 2 分 / / /道,总计: 30 30 30 分; - 阅读程序题
共 3 3 3 道,判断题 1.5 1.5 1.5 分 / / /道,单选题 3 3 3 分 / / /道,总计: 40 40 40 分; - 完善程序题
共 2 2 2 道,单选题 3 3 3 分 / / /道,总计: 30 30 30 分。
二、编码
1. 分类
2. 信源编码
2.1 意义
信源编码是以提高通讯的有效性为目的的编码。
2.2 途径
- 使各个符号互相独立
- 使编码中各个符号数量相等
2.3 分类
3. 哈夫曼编码
3.1 性质
- 哈夫曼编码是一种无损编码;
- 哈夫曼编码是边长码;
- 哈夫曼编码基于频率排序实现;
- 哈夫曼编码是最优前缀码;
- 哈夫曼编码不是唯一码。
3.2 原理
让出现频率高的信息编码长度短,让出现频率低的信息编码长度长,从而达到哈夫曼编码整体最短。因此哈夫曼编码使用的是贪心算法的思想。
3.3 方式
- 统计待编码的字符出现的频率,并排列。
- 反复取出两个频率最低的节点,将它们合并为一个新节点,频率为两个节点频率之和,将新节点重新排列。
- 重复步骤,直到只剩下一个节点,即构建完成的哈夫曼树。
- 通过遍历哈夫曼树,从根节点到每个叶子节点的路径上的左子树赋值为 0 0 0,右子树赋值为 1 1 1,得到每个字符的哈夫曼编码。
- 使用哈夫曼编码将原始数据进行编码和解码。
3.4 不唯一性
哈夫曼编码的不唯一性的原因:
- 当某几个结点频率相同且为最小,可以选择任意两个结点
- 0 0 0 和 1 1 1 可以交换位置
- 生成的序列可以是右结点内容拼在左节点后面,也可以是左结点内容拼在右节点后面
3.5 考题
- 判断编码组合是否为合法的最优前缀编码。
方法: 对于每一个选项,找到所有长度 ≥ 2 \ge2 ≥2 的编码,观察前面的字符,若在该选项中其他编码(完整)一样,那么就是不合法的最优前缀编码。
技巧: 对于每一个选项,如果出现长度 ≥ 2 \ge2 ≥2 的编码,如果长度为 1 1 1 的编码超过 1 1 1 个,那么就是不合法的最优前缀编码。 - 给出出现频率,求某一字符的编码长度。
方法: 先根据题目给出的频率进行小 → \to → 大的排序,然后按照哈夫曼编码的方法进行操作即可。
技巧: 没有技巧,这种题目要是碰到就得狂笑十五分钟。
4. 格雷码
4.1 意义
格雷码,是一种特殊的二进制编码方式(无权码)。在格雷码中,相邻的两个数值只有一个二进制位发生变化,因此也被称为最小差异码或最小变化码;因为"首尾相连",又称循环码或反射码。
4.2 构造
如果已知一个数字
x
x
x,得到其二进制数,将其右移一位,和原数
x
x
x 进行异或。例如:
6
(
10
)
=
11
0
(
2
)
6_{(10)}=110_{(2)}
6(10)=110(2),
11
0
(
2
)
>
>
1
=
01
1
(
2
)
110_{(2)}>>1=011_{(2)}
110(2)>>1=011(2),
11
0
(
2
)
⊕
01
1
(
2
)
=
10
1
(
2
)
110_{(2)} \oplus 011_{(2)}=101_({2})
110(2)⊕011(2)=101(2)。因此
6
6
6 的格雷码为
101
101
101。
备注:
与运算:
∧
\land
∧
或运算:
∨
\lor
∨
非运算:
¬
\lnot
¬
异或运算:
⊕
\oplus
⊕
4.3 反向构造
从第二位开始,依次向右遍历,每个 0 1 0\ 1 0 1 符都和前一位进行异或,然后将结果覆盖在当前遍历的数位上。
例如: 10110 10110 10110 解码
步骤 | 1 | 0 | 1 | 1 | 0 |
---|---|---|---|---|---|
1 | 1 | 1 | 1 | 1 | 0 |
2 | 1 | 1 | 0 | 1 | 0 |
3 | 1 | 1 | 0 | 1 | 0 |
4 | 1 | 1 | 0 | 1 | 1 |
三、哈夫曼树
1. 须知概念
路径长度:从根结点到某个结点的边数。
树的路径长度:树中所有结点到根结点的路径长度之和。
结点的带权路径长度:结点的权值
×
\times
× 这个结点的路径长度。
树的带权路径长度:所有叶结点的带权路径长度之和。
2. 性质
- 哈夫曼树的带权路径长度是最小的;
- 哈夫曼树每个结点的度都是 2 2 2;
- 拥有 n n n 个叶子结点的哈夫曼树,总结点数为 2 n − 1 2n-1 2n−1;
- 一个合法的哈夫曼树左右子树互换仍然是合法的哈夫曼树;
- 同一组权值 w 1 , w 2 , … , w n {w_1, w_2, \ldots, w_n} w1,w2,…,wn,存在不同构造的哈夫曼树。
3. 考题
- 给定权值集合,求哈夫曼树的带权路径长度之和
方法: 按照计算哈夫曼编码的方法列出一个哈夫曼树,对所有的叶结点乘它们的路径并相加。