2024年CSP-J第一轮暑假冲刺训练营(5):哈夫曼、编码

一、题型

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 途径

  1. 使各个符号互相独立
  2. 使编码中各个符号数量相等

2.3 分类

信源码
唯一可译码
每段编码都只对应唯一一个符号或字符
非唯一可译码
每段编码不一定对应唯一一个符号或字符

3. 哈夫曼编码

3.1 性质

  1. 哈夫曼编码是一种无损编码;
  2. 哈夫曼编码是边长码;
  3. 哈夫曼编码基于频率排序实现;
  4. 哈夫曼编码是最优前缀码;
  5. 哈夫曼编码不是唯一码。

3.2 原理

让出现频率高的信息编码长度短,让出现频率低的信息编码长度长,从而达到哈夫曼编码整体最短。因此哈夫曼编码使用的是贪心算法的思想。

3.3 方式

  1. 统计待编码的字符出现的频率,并排列。
  2. 反复取出两个频率最低的节点,将它们合并为一个新节点,频率为两个节点频率之和,将新节点重新排列。
  3. 重复步骤,直到只剩下一个节点,即构建完成的哈夫曼树。
  4. 通过遍历哈夫曼树,从根节点到每个叶子节点的路径上的左子树赋值为 0 0 0,右子树赋值为 1 1 1,得到每个字符的哈夫曼编码。
  5. 使用哈夫曼编码将原始数据进行编码和解码。

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 解码

步骤10110
111110
211010
311010
411011

三、哈夫曼树

1. 须知概念

路径长度:从根结点到某个结点的边数。
树的路径长度:树中所有结点到根结点的路径长度之和。
结点的带权路径长度:结点的权值 × \times × 这个结点的路径长度。
树的带权路径长度:所有叶结点的带权路径长度之和。

2. 性质

  1. 哈夫曼树的带权路径长度是最小的;
  2. 哈夫曼树每个结点的度都是 2 2 2
  3. 拥有 n n n 个叶子结点的哈夫曼树,总结点数为 2 n − 1 2n-1 2n1
  4. 一个合法的哈夫曼树左右子树互换仍然是合法的哈夫曼树;
  5. 同一组权值 w 1 , w 2 , … , w n {w_1, w_2, \ldots, w_n} w1,w2,,wn,存在不同构造的哈夫曼树。

3. 考题

  • 给定权值集合,求哈夫曼树的带权路径长度之和
    方法: 按照计算哈夫曼编码的方法列出一个哈夫曼树,对所有的叶结点乘它们的路径并相加。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值