信息学奥赛初赛天天练-39-CSP-J2021基础题-哈夫曼树、哈夫曼编码、贪心算法、满二叉树、完全二叉树、前中后缀表达式转换

PDF文档公众号回复关键字:20240629

在这里插入图片描述

2022 CSP-J 选择题

单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项)

5.对于入栈顺序为a,b,c,d,e的序列,下列( )不合法的出栈序列

A. a,b,c,d,e

B. e,d,c,b,a

C. b,a,c,d,e

D. c,d,a,e,b

8.如果一颗二叉树只有根节点,那么这棵二叉树高度为1。请问高度为5的完全二叉树有( )种不同的形态

A. 16

B. 15

C. 17

D. 32

9.表达式a* (b+c)* d的后缀表达式为( ),其中 *和 +是运算符

A. * * a + b c d

B. a b c + * d *

C. a b c + d * *

D. * a * + b c d

11.在数据压缩编码中的哈夫曼编码方法,在本质上是一种( ) 策略

A. 枚举

B. 贪心

C. 递归

D. 动态规划

15.有四个人要从A点坐一条船过河到B点,船一开始在A点。该船一次最多可坐两个人。已知这四个人中每个人独自坐船的过河时间分别为1、2、4、8,且两个人坐船的过河时间为两人独自过河时间的较大者。则最短( )时间可以让四个人都过河到B点(包括从B点把船开回A点的时间)

A. 14

B. 15

C. 16

D. 17

2 相关知识点

栈又名堆栈,是一种限定仅在表尾进行插入和删除操作的线性表,这一端称为栈顶,另一端称为栈底

栈中的数据元素遵守后进先出的原则

二叉树

每个结点至多拥有两棵子树(即二叉树中不存在度大于2的结点),并且,二叉树的子树有左右之分,其次序不能任意颠倒,例如下面是一棵二叉树

满二叉树

满二叉树又叫完美二叉树,除了叶子结点之外的每一个结点都有两个孩子,树的叶子节点均在最后一层(也就是形成了一个完美的三角形)

完全二叉树

除了最下层,其他每层都饱满,去除最后一层是一棵满二叉树,最下层的结点都集中在该层最左边的若干位置上

前缀表达式

前缀表达式,也称为波兰表达式,是一种算术表达式表示方法,其中运算符位于操作数之前.

//示例1 中缀表达式a+b对应的前缀表达式
+a bC++
//示例2 中缀表达式3+4*2对应的前缀表达式
+ 3 * 4 2 

中缀表达式

是一种常见的算术表达式表示方法,其中运算符位于操作数之间

//示例1
3 + 4 * 2
//示例2
(1 + 2) * (3 - 4)C++

后缀表达式

后缀表达式,也称为逆波兰表达式,是一种算术表达式表示方法,其中运算符位于操作数之后

//示例1 中缀表达式a+b对应的后缀表达式C++
a b+
//示例2 中缀表达式3+4*2对应的前缀表达式3 4 2 * +    

中缀表达式转后缀表达式

确定优先级,按优先级逐一处理操作符(把操作符从操作数中间移到操作数后边)
例如如下中缀表达式转为后缀表达式
1 + ( 2 + 3)* 4 ) – 5
// 按优先级对表达式数字加括号
((1 + (( 2 + 3)* 4 )) – 5 )  
//从最里面的一层括号开始运算,转换成后缀表达式
//转换方法,去除括号,数字在前,顺序不变,操作符移到最后
1. ( 2 + 3) => 2 3 +
//  ( 2 + 3)可以看作一个整体x
2. (( 2 + 3)* 4 ) => (x+4) => x 4 + => 2 3 + 4 *
//(( 2 + 3)* 4 )看作一个整体x
3. (1 + (( 2 + 3)* 4 ))=> (1+x)=>1 x + = 1 2 3 + 4 * +
// (1 + (( 2 + 3)* 4 )) 看作一个整体x
4. ((1 + (( 2 + 3)* 4 )) – 5 ) =>(x-5)=>x 5 - => 1 2 3 + 4 * + 5 -
所以转换后的后缀表达式为 1 2 3 + 4 * + 5 -

哈夫曼树

1 选剩下的两棵根权值最小的树合并成一棵新树

2 新树的根权值等于两棵合并前树的根权值和

3 重复1和2

哈夫曼编码

哈夫曼树的左右孩子进行编码称为哈夫曼编码,通常左边为0,右边为1

只对叶子节点进行编码/解码,编码唯一

哈夫曼编码是前缀编码,任何一个字符的编码都不是另一个字符编码的前缀(只有叶子节点编码)

哈夫曼编码左边为0,右边为1是通常规定,也可以左边为1右边为0,但确定后编码是唯一的

如果下图为字母a,b,c,d,e的编码,字母旁边对应数字为其出现的频率

贪心算法

所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择 。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的 局部最优解

哈夫曼编码总是把出现频率少的编码相对较长,从而保证全局总的编码最短

哈夫曼编码使用的是贪心算法进行编码

3 思路分析

5.对于入栈顺序为a,b,c,d,e的序列,下列( D )不合法的出栈序列

A. a,b,c,d,e

B. e,d,c,b,a

C. b,a,c,d,e

D. c,d,a,e,b

分析

根据入栈出栈性质模拟,栈为后进先出

A a 进 a 出 b 进 b 出 c 进 c 出 d 进 d 出 e 进 e 出 出栈顺序合法
B a 进 b 进 c 进 d 进 e 进 e 出 d 出 c 出 b 出 a 出 出栈顺序合法
C a 进 b 进 b 出 a 出 c 进 c 出 d 进 d 出 e 进 e 出 出栈顺序合法
D a 进 b 进 c 进 c 出 d 进 d 出 此时b在栈顶,a无法出栈 
所以选 D

8.如果一颗二叉树只有根节点,那么这棵二叉树高度为1。请问高度为5的完全二叉树有( A )种不同的形态

A. 16

B. 15

C. 17

D. 32

分析

完全二叉树,除最后一层,其他层都是满的
高度为5有4层是满的,后面1层节点是前面节点的2倍(1个父节点都有2个子节点)
前4层是满的,形态不会变化,只有第5层形态可能变化,第5层节点只要保证从左到右排即可
具体如下
满二叉树
高度为1  1个节点  2^1-1=1
高度为2  1+2 个节点 2^2-1=3
高度为3  1+2+4个节点 2^3-1=7
高度为4  1+2+4+8 个节点2^4-1=15
高度为5  1+2+4+8+16 个节点 2^5-1=31
由于是完全二叉树,说明第5层必有节点,第5层的节点最多可以31-15=16个
当第5层节点为16个时,此时是5层的满二叉树,是特殊的完全二叉树
因此有16种不同的形态

9.表达式a* (b+c)* d的后缀表达式为( B ),其中 *和 +是运算符

A. * * a + b c d

B. a b c + * d *

C. a b c + d * *

D. * a * + b c d

分析

确定优先级,按优先级逐一处理操作符(把操作符从操作数中间移到操作数后边)
a * (b+c)* d  -- ((a * (b+c))* d)((a * (b+c))* d)    
1 (b+c) => b c+ 
//  (b+c)  可以看作一个整体x
(a * (b+c)) => (a * x) => a x * => a b c + *
//(a * (b+c)) 可以看作一个整体x((a * (b+c))* d)  => (x * d) => x d * => a b c + * d * 

11.在数据压缩编码中的哈夫曼编码方法,在本质上是一种( B ) 策略

A. 枚举

B. 贪心

C. 递归

D. 动态规划

分析

哈夫曼编码总是把出现频率少的编码相对较长,从而保证全局总的编码最短

哈夫曼编码使用的是贪心算法进行编码

15.有四个人要从A点坐一条船过河到B点,船一开始在A点。该船一次最多可坐两个人。已知这四个人中每个人独自坐船的过河时间分别为1、2、4、8,且两个人坐船的过河时间为两人独自过河时间的较大者。则最短( B )时间可以让四个人都过河到B点(包括从B点把船开回A点的时间)

A. 14

B. 15

C. 16

D. 17

分析

贪心算法解决此问题,贪心策略

1从剩余的人中选择用时最小的2人过河

2 用时最小的人返回去接剩余的人

1 初始 1 2 4 8 在河的A边

2从剩余的 1 2 4 8 找用时最少的2人(1 和 2)过河到B ,用时为2

3 在B端选择用时间最少的去接,1去接,用时1

4 从剩余的 4 8 找用时最少的2人(4 和 8)过河到B ,用时为8

5 在B端选择用时间最少的去接,2去接,用时2

6 从剩余的 1 2 过河 用时为2

上述过河时间累加 2+1+8+2+2=15

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

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

相关文章

螺旋矩阵问题C代码

给定一个n行m列的二维数组,要求按顺时针螺旋顺序输出矩阵中的所有元素,n和m小于等于10 如下图是一个三行四列的螺旋矩阵 要求输出 1 2 3 4 8 12 11 10 9 5 6 7 全局变量定义 int a[11][11]; int vis[11][11]; // 访问标记数组关键代码如下 int dx[] …

MySQL高级-MVCC-基本概念(当前读、快照读)

文章目录 1、MVCC基本概念1.1、当前读1.1.1、创建表 stu1.1.2、测试 1.2、快照读 1、MVCC基本概念 全称Multi-Version Concurrency Control,多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,快照读为MySQL实现MVCC提供了一个…

OpenCV cv::Mat到 Eigen 的正确转换——cv2eigen

在进行计算机视觉项目时,我们经常需要处理相机位姿的变换。最近,我在项目中遇到了一个看似简单但实际上颇具挑战性的问题:从 OpenCV 的 cv::Mat 格式转换到 Eigen 库的格式。这个过程中遇到了一些问题,但最终找到了一个稳健的解决…

镂空的文字?分享 1 段优质 CSS 代码片段!

大家好,我是大澈! 本文约 800 字,整篇阅读约需 1 分钟。 每日分享一段优质代码片段。 今天分享一段优质 CSS 代码片段,实现 CSS 文字镂空的效果。 老规矩,先阅读代码片段并思考,再看代码解析再思考&#…

nginx本地域名配置

修改hosts文件(仅限本地测试): 在Windows上,hosts文件位于C:\Windows\System32\drivers\etc\hosts。 打开hosts文件,添加一行:127.0.0.1 xxx.com (xxx.com为自己设定的域名) 如果修…

Leetcode3190. 使所有元素都可以被 3 整除的最少操作数

Every day a Leetcode 题目来源:3190. 使所有元素都可以被 3 整除的最少操作数 解法1:遍历 遍历数组,累加最少操作数,即 min(num % 3, 3 - num % 3)。 代码: /** lc appleetcode.cn id3190 langcpp** [3190] 使所…

uniapp+vue3开发微信小程序踩坑集

本文主要记录使用uniappvue3开发微信小程序遇见的各种常见问题及注意点。(持续更新) 问题: 自定义组件为什么有些样式加不上去 给自定义组件增加class的时候,有时候不生效有时候生效,一度让我怀疑自己记忆错乱。后来…

C++枚举

C枚举 枚举的基础用法不不再赘述枚举的三点问题1、作用域问题解决思路1解决思路2 2、隐式转换成int3、枚举变量的实际类型无法明确指定 枚举的基础用法不不再赘述 枚举的三点问题 1、作用域问题 举个例子,颜色有blue代表蓝色,心情有blue代表忧郁。 以…

mysql安装配置教程

mysql安装配置教程 MySQL是一个流行的关系型数据库管理系统,用于存储和管理数据。下面是简要的MySQL安装配置教程: 步骤1:下载MySQL 访问MySQL官方网站(https://dev.mysql.com/downloads/mysql/)下载适合您操作系统…

Java冒泡排序实现及应用解析

Java冒泡排序实现及应用解析 冒泡排序是计算机科学中最基本的排序算法之一,尽管它的效率不是最高的,但由于其实现简单,它在教学和某些特定场景下仍然具有不可替代的作用。本文将从Java语言的角度,深入探讨冒泡排序的基本原理、实…

全国31省细分产品出口数据集(2002-2022年)

数据简介:整理全国31个省直辖市自治区按hs码分的22类细分产品的出口数据,只包含22类的细分,不包含更细的类目。可用来计算出口产品质量,出口产品技术复杂度等指标,数据区间为2002-2022年。 数据名称:31省细…

《昇思25天学习打卡营第11天 | 昇思MindSpore基于 MindSpore 实现 BERT 对话情绪识别》

11天本节学习到BERT全称是来自变换器的双向编码器表征量,它是Google于2018年末开发并发布的一种新型语言模型。BERT模型的主要创新点都在pre-train方法上,即用了Masked Language Model和Next Sentence Prediction两种方法分别捕捉词语和句子级别的repres…

【SGX系列教程】(五)Intel-SGX 官方示例分析(SampleCode)——RemoteAttestation

文章目录 一.RemoteAttestation原理介绍1.1 远程认证原理1.2 远程认证步骤1.3 远程认证基本流程1.4 IAS通过以下步骤验证报告的签名1.5 关键术语1.6 总结二.源码分析2.1 README2.1.1 README给出的编译流程2.2 重点代码分析2.2.0 主要代码模块交互流程分析2.2.1 isv_app文件夹2.…

python-18-零基础自学python-用类创建冰淇凌小店的口味

学习内容:《python编程:从入门到实践》第二版 知识点: 类、子类、继承、调用函数 练习内容: 练习9-6:冰激凌小店 冰激凌小店是一种特殊的餐馆。编写一个名为IceCreamStand的类,让它继承为完成练习9-1或…

YonBIP 获取项目代码配置(图文)

项目开发文件在本地环境重新部署后,开发端机器需要重新部署,在此记录一下操作过程。 1. 新建项目目录,在目录下点鼠标右键,选 Git Bash Here 2. 开始下载代码,根据代码量多少,几分钟就能下载完成。 3. 下载…

任意密码重置漏洞

文章目录 1. 任意密码重置漏洞原理2. 任意密码重置漏洞产生原因3. 任意密码重置漏洞场景3.1 验证码爆破3.2 验证凭证回传3.3 验证凭证未绑是用户3.4 跳过验证步骤3.5 凭证可预测3.6 同时向多个账户发送凭证 4. 任意密码重置经典案例4.1 中国人寿某重要系统任意账户密码重置4.2 …

【单元测试】Controller、Service、Repository 层的单元测试

Controller、Service、Repository 层的单元测试 1.Controller 层的单元测试1.1 创建一个用于测试的控制器1.2 编写测试 2.Service 层的单元测试2.1 创建一个实体类2.2 创建服务类2.3 编写测试 3.Repository 1.Controller 层的单元测试 下面通过实例演示如何在控制器中使用 Moc…

什么是死锁以及如何避免

什么是死锁? 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进…

关于配置webpack eslint插件版本问题说明

webpack相关版本说明 按照当前情况下,以及eslint-webpack-plugin的官方版本使用的是8.x版本的eslint,我们进行如下依赖安装 npm i -D eslint8 eslint-webpack-plugin "devDependencies": {"eslint": "^8.57.0","eslint-webpac…

简单了解下Java中锁的概念和原理

你好,这里是codetrend专栏“高并发编程基础”。 Java提供了很多种锁的接口和实现,通过对各种锁的使用发现理解锁的概念是很重要的。 Java的锁通过java代码实现,go语言的锁通过go实现,python语言的锁通过python实现。它们都实现的…