哈夫曼编码——CSP-J1真题讲解

news2024/9/24 15:16:46

假设有一组字符{a,b,c,d,e,f},对应的频率分别为5%、9%、12%、13%、16%、45%。请问以下哪个选项是字符a,b,c,d,e,f分别对应的一组哈夫曼编码?(   )

A. 1111,1110,101,100,110,0

B. 1010,1001,1000,011,010,00

C. 000,001,010,011,10,11

D. 1010,1011,110,111,00,01

【答案】

A

【解析】

哈夫曼编码(Huffman Coding)是为实现数据压缩而设计出来的一种编码方法,它的压缩办法其实很简单:字符出现的频率越高,其编码长度越短。

这个不难理解。假设我们要写一部小说,里面有个人物叫“混元一气上方太乙金仙美猴王齐天大圣斗战胜佛孙悟空”,出场十万八千次,还有一个叫“乌巢卵二金刚独角青牛大鬼王”的小妖怪,只出场一次。如果将前者的名字简化为“大圣”、“悟空”、“WK”、“monkey”、M、1(代表金箍棒),我们就能大幅减少书的厚度;而后者的名字再怎么缩短也起不到啥作用。

可惜的是,我们单凭这个规律无法锁定答案,因为4个选项全都满足。

假设你只知道这个规律,现在让你盲猜一波,你会选择哪个答案?

我想你也多半会选A。为什么?最后一个字符f出现的频率足足有45%,几近半壁江山,分量自然是其他字符不可同日而语。什么能代表它的分量呢?编码长度。因此它的编码长度应该要比别的字符都要小。干就干到极致,只有一位数才是最短的。这样一番推理我们就成功蒙对了答案。

毛估估一下5个字符的频率分步,基本上可以分成3个级别:

①个位级:5%、9%。

②十余级:12%、13%、16%。

③半壁江山级:45%。

对照答案A,正分别对应2个4位编码,3个的3位编码,1个1位编码,这特性还不够明显吗?

这正是哈夫曼编码追求的目标:什么级别的频率对应什么级别的编码。

这套分级编码体系是怎么打造出来的呢?

方法就是根据频率大小把所有字符拼成一颗树,这颗树的特别之处是从树梢开始向树根拼(从下向上拼),总是将两个还没拼的最小的节点拼成一个较大的节点,拼成的树叫“哈夫曼树”。

因为只是比较大小,所以为了方便,可以字符频率都扩大一百倍,得到a:5、b:9、c:12、d:13、e:16、f:45。

下面开始编码:

1.拼树

记住拼树的要点:每次都从没拼过的节点中找频率最小的两个拼。

(1)一开始所有节点都没拼过,最小的节点为a、b,拼成新节点f1,频率是a、b的和14。

(2)现在没拼过的节点从小到大为:c:12、d:13、f1:14、e:16、f:45,最小的节点为c、d,拼成新节点f2,频率25。

(3)现在没拼过的节点从小到大为:f1:14、e:16、f2:25、f:45,最小的节点为f1、e,拼成新节点f3,频率30。

(4)现在没拼过的节点从小到大为:f2:25、f3:30、f:45,最小的节点为f2、f3,拼成新节点f4,频率55。

现在你可能发现一个规律,就是每次拼接时都将频率较小的节点放在左边,频率较大的节点放在右边。这不是强制规定,但是习惯上都这么做。

(4)现在没拼过的节点从小到大为:f:45、f155,拼成新节点f5,频率100。

(5)只剩下一个没拼过的节点了,想拼也拼不成了,拼树大功告成。

哈夫曼树说到底就是一颗“排辈”树,你可以将5个字符看成是5个人,字符的频率看成是人的年龄,哈夫曼树就是给这5个人按年龄排辈份。

2.编码

一般约定每个左分支编码为“0”​,右分支编码为“1”​。编码如下:

编码规则:从根节点到叶子节点路径上的字符组成的字符串为该叶子节点的哈夫曼编码。

按上图求出a,b,c,d,e,f的哈夫曼编码为:

1100,1101,100,101,111,0

费了半天劲,得出的结果咋和题中所给选项都不一样呢?

这是因为哈夫曼编码并不唯一。在整个拼树过程中,咱们一直遵守两个规则:

①要拼的两个节点,频率较小的放左边,频率较大放右边。

②每个左分支编码为“0”​,右分支编码为“1”。

不过这两个规则并不是强制性的,所以哈夫曼编码不唯一。咱们只要把几个1和0互换一下(下图红色字体部分),就可以得到和选项A一样的哈夫曼编码。

虽然编码不一样,但每个字符的编码长度确是一定的,即长度依次为:4、4、3、3、3、1,根据这个特点也可以快速确定答案为A。

【题目来源】

2023 CCF非专业级别软件能力认证第一轮 (CSP-J1) 入门级C++语言试题 第10题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2138499.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

视频工具EasyDarwin生成RTMP给WVP拉流列表

效果 运行 登录 http://127.0.0.1:10086/ admin/admin 创建RTMP服务

离线数仓ODS层准备

离线数仓ODS层设计-Operational Data Store ODS层设计要点ODS层-日志表-json表SERDEhive导入json表(hive表和json表 字段不一致 解决方案) 复杂数据类型日志表-建表语句 ODS层设计要点 (1)ODS层的表结构设计依托于从业务系统同步…

Qt 菜单栏、工具栏、状态栏、标签、铆接部件(浮动窗口) 设置窗口核心部件(文本编辑控件)的基本使用

效果 代码 #include "mainwindow.h" #include "ui_mainwindow.h" #include<QToolBar> #include<QDebug> #include<QPushButton> #include<QStatusBar> #include<QLabel> #include<QDockWidget> #include<QTextEdi…

第1步win10宿主机与虚拟机通过NAT共享上网互通

VM的CentOS采用NAT共用宿主机网卡宿主机器无法连接到虚拟CentOS 要实现宿主机与虚拟机通信&#xff0c;原理就是给宿主机的网卡配置一个与虚拟机网关相同网段的IP地址&#xff0c;实现可以互通。 1、查看虚拟机的IP地址 2、编辑虚拟机的虚拟网络的NAT和DHCP的配置&#xff0c;…

springboot3.X版本集成mybatis遇到的问题

由于我本地springboot为3.x版本&#xff0c;如下图所示&#xff0c;最新版本 当我参照如下搜索的内容去集成mybatis的时候&#xff0c;会出现各种各样的报错 最根本的原因是搜出来的配置是参照springboot2.X版本&#xff0c;当我们使用springboot3.x版本之后&#xff0c;需要配…

【C++】STL--string(上)

前言 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0c;而且底层空间需要用户自己管理&#xff0c;稍不留…

8个前端库-小且美

前提&#xff1a;前端有很多小而美的库&#xff0c;接入成本很低又能满足日常开发需求&#xff0c;同时无论是 npm 方式引入还是直接复制到本地使用都可以。 1.radash radash相比与 lodash&#xff0c;更加面向现代&#xff0c;提供更多新功能&#xff08;tryit&#xff0c;…

前端层面----监控与埋点

前言&#xff1a; 站在产品的视角&#xff0c;经常会问如下几个问题&#xff1a; 产品有没有用户使用 用户用得怎么样 系统会不会经常出现异常 如何更好地满足用户需求服务用户 当站在技术视角时&#xff0c;经常会问如下几个问题&#xff1a; 系统出现异常的频率如何 异常…

MyBatis中多对一关系的三种处理方法

目录 MyBatis中多对一关系的三种处理方法 1.通过级联属性赋值 1&#xff09;mapper 2&#xff09;mapper.xml 3&#xff09;测试代码 4&#xff09;测试结果 2.通过标签 1&#xff09;mapper 2&#xff09;mapper.xml 3&#xff09;测试代码 4&#xff09;测试结果 3.分步查询 …

【技术调研】三维(4)-ThreeJs阴影投射、光线投射及案例

阴影投射 阴影是灯光经过物体后产生的&#xff0c;几个关键的设置&#xff1a; 灯光属性设置&#xff1a;.castShadow : Boolean 。此属性设置为 true 灯光将投射阴影。注意&#xff1a;这样做的代价比较高&#xff0c;需要通过调整让阴影看起来正确。 查看 DirectionalLight…

STM32(十四):USART串口数据包

HEX数据包 0xFF包头&#xff0c;0xFE包尾。 如果数据和包头包尾重复&#xff0c;可能会引起误判。 解决办法&#xff1a; 1. 限制载荷数据的范围 2. 如果无法避免载荷数据和包头包尾重复&#xff0c;就使用尽量使用固定长度数据包。 包头 ‘\r\n 包尾 在载荷数据中间可以出现…

代码23. 合并 K 个升序链表

模拟面试的时候没做出来&#xff0c;心碎了。 题目链接 . - 力扣&#xff08;LeetCode&#xff09; 自己的思考 无思考&#xff0c;直接看答案吧。 正确答案 其实写还是自己写的&#xff0c;看了下题解的思路。 第一种 思路简单&#xff0c;两两合并&#xff0c;注意事项已…

李飞飞任CEO,空间智能公司World Labs亮相,全明星阵容曝光

人工智能的下个大方向已经出现&#xff0c;标志性学者决定下场创业。 本周五&#xff0c;一个重磅消息引爆了 AI 圈&#xff1a;斯坦福大学计算机科学家李飞飞正式宣布创办 AI 初创公司 ——World Labs&#xff0c;旨在向人工智能系统传授有关物理现实的深入知识。 李飞飞说道&…

【检索快,IEEE独立出版】2024年第四届电子信息工程与计算机科学国际会议(EIECS 2024)

大会简介&#xff1a; 2024年第四届电子信息工程与计算机科学国际会议&#xff08;EIECS 2024&#xff09;将于2024年9月27日至29日在中国延吉举行。会议由长春理工大学主办&#xff0c;延边大学、长春理工大学电子信息工程学院、长春理工大学计算机科学技术学院、长春理工大学…

数据结构——栈和队列(栈的顺序存储结构和链式存储结构)

栈的定义 栈是一种重要的线性结构&#xff0c;可以这样讲&#xff0c;栈是前面讲过的线性表的一种具体形式。就像我们刚才的例子&#xff0c;栈这种后进先出的数据结构应用是非常广泛的。在生活中&#xff0c;例如我们的浏览器&#xff0c;每次点击一次“后退”都是退回到最近…

数据库密钥管理的密钥生成

数据库密钥管理是指对数据库中使用的加密密钥进行的一系列安全操作&#xff0c;以确保数据的机密性、完整性和可用性。这一管理过程通常包括密钥的生成、存储、分发、使用和销毁等环节。以下是关于数据库密钥管理的详细解析&#xff1a; 一、密钥的生成 目的&#xff1a;生成用…

谷歌图像生成AI-imagen 3新手入门指南!

1Google 最近推出了 Imagen 3&#xff0c;这是目前为止其最先进的文本生成图像模型。它基于之前的版本进行了改进&#xff0c;提供了更加精确的图像生成&#xff0c;减少了图像中的瑕疵&#xff0c;能够生成逼真、栩栩如生的图像。相比于早期版本&#xff0c;Imagen 3 可以处理…

Linux:重定向以及管道

重定向&#xff08;重新定向命令的输出&#xff09; 将前面命令的输出&#xff0c;作为内容&#xff0c;写入到后面的文件 管道 管道&#xff08;操作符号 | &#xff09; 作用&#xff1a;将前面命令的输出&#xff0c;传递给后面命令&#xff0c;作为后面命令的参数…

通信工程学习:什么是SNI业务节点接口

SNI&#xff1a;业务节点接口 SNI业务节点接口&#xff0c;全称Service Node Interface&#xff0c;是接入网&#xff08;AN&#xff09;和一个业务节点&#xff08;SN&#xff09;之间的接口&#xff0c;位于接入网的业务侧。这一接口在通信网络中扮演着重要的角色&#xff0c…

【机器学习-四-无监督学习unsupervise learning-聚类算法简介】

无监督学习unsupervise learning 聚类聚类的过程相似度度量方法聚类的方法划分式层次聚类基于密度的聚类 上一节讲的无监督学习&#xff0c;但是很多人可能会很疑惑&#xff0c;没有目标&#xff0c;那算法是怎么学会该怎样分类的呢&#xff1f;今天就简介一下其中的聚类算法。…