2023-2024学年上学期算法设计与分析题期末考试模拟卷

2023-2024学年上学期算法设计与分析题期末考试模拟卷

文章目录

  • 2023-2024学年上学期算法设计与分析题期末考试模拟卷
  • 单选题
  • 程序填空题
      • 输入格式:
      • 输出格式:
      • 输入样例1:
      • 输出样例1:
  • 主观题

注意:该题集非标准答案,仅供参考,如果异议,请在评论区提出或私信。

单选题

  1. ()关于分治法描述不正确的是:

    A.分治法的基本思想是将规模较大的问题划分为规模较小的子问题来求解。

    B.随机生成100个整数并存放在一个数组中,然后从中指定一个整数,则可用二分搜索算法在O(logn)的时间内找到该整数。

    C.用分治法求解大整数乘法和Strassen矩阵乘法的基本思想均是通过合理的运算变换来减少乘法的次数。

    D.合并排序和快速排序的时间复杂性均为O(nlogn)。


  1. ( )关于动态规划描述不正确的是:

    A.动态规划也是将规模较大的问题划分为规模较小的子问题来求解,但与分治法不同的是,动态规划所划分出来的子问题相互不独立。

    B.动态规划算法适用于求解最优化问题,一般采用自底向上的方式来计算。

    C.能用动态规划求解的问题就不能使用递归算法求解出来。

    D.动态规划求解的问题具有最优子结构和重叠子问题性质。


  1. ( )关于贪心算法描述正确的是:

    A.求解活动安排问题的贪心算法GreedySelector的时间复杂性为​O(n)​。

    B.哈夫曼编码是一种最优前缀码,因此对于给定的字符集,各字符编码是唯一的。

    C.对于给定的一个带权有向图G= ( V , E )​ ,则可用Dijkstra算法求解出从指定源顶点到其他顶点的最短路长度。

    D.背包问题(可散装)的贪心算法同样适用于求解0-1背包问题。


  1. ( )关于回溯法描述正确的是:

    A.回溯法即可采用深度优先搜索策略,也可采用广度优先搜索策略。

    B.回溯法求解时,可以事先不定义问题的解空间。

    C.0-1背包问题的解空间树是一颗排列树。

    D.为提高求解效率,使用回溯法时可同时用约束函数和上界函数来剪去一部分子树。


  1. ( )关于分支限界法描述不正确的是:

    A.分支限界法两种常见方法为:队列式分支限界法和优先队列式分支限界法。

    B.使用分支限界法时可用约束函数和上界函数来提高搜索效率。

    C.在分支限界法中,每个活结点有2个机会成为扩展结点。

    D.使用优先队列式分支限界法求解时需要事先明确结点的优先级定义。


  1. 下面代码段的时间复杂度是( )。

    for( i=1; i<2n; i++ )for ( j=1; j<=n; j++ )x++;
    

    A. O ( 2 n ) O(2n) O(2n)

    B. O ( n 2 ) O(n^2) O(n2)

    C. O ( 2 n 2 ) O(2n^2) O(2n2)

    D. O ( 2 n ) O(2^n) O(2n)


  1. 假如需要计算以下6个矩阵的依次连乘:

    图片.png
    求解最优乘法次数的递推计算得到如下最优分割位置矩阵s[i][j]:

    图片.png
    那么,计算A1到A4连乘的子问题,第一步计算括号要

    A.1-3分割

    B.3-1分割

    C.2-2分割

    D.0-4分割


  1. 假如装载问题的两艘轮船B1和B2的承载重量分别是C1和C2(C1>C2),那么解决装载问题可以先解决其中一艘轮船的0-1背包问题,请问选择哪一艘船更合理?

    A.选B1更合理

    B.选B2更合理

    C.选B1或B2都一样

    D.装载问题与0-1背包问题无关


  1. 下列的排序算法使用了分治思想的有()

    归并排序

    快速排序

    选择排序

    冒泡排序

    A.选择排序
    冒泡排序

    B.归并排序
    快速排序

    C.快速排序
    选择排序

    D.归并排序
    冒泡排序


  1. 若重复进行某种实验,每次实验是互相独立的,且成功的概率为 p > 0 p > 0 p>0,则我们等到首次成功实验所需要重复的次数的期望值是:

    A. p / ( 1 − p ) p /( 1 - p ) p/(1p)

    B. 1 / ( 1 − p ) 1 / (1 - p) 1/(1p)

    C. 1 / p 1/p 1/p

    D.以上全不对


程序填空题

  1. 0/1背包问题(回溯法)

    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #define MAXN 20                //最多物品数
    using namespace std;
    int n;                        //物品数
    int W;                        //限制重量
    int w[MAXN]={0};            //存放物品重量,不用下标0元素
    int v[MAXN]={0};            //存放物品价值,不用下标0元素
    int x[MAXN];                    //存放最终解
    int maxv;                         //存放最优解的总价值
    void dfs(int i,int tw,int tv,int rw,int op[]) //求解0/1背包问题
    {int j;if (i>n)                    //找到一个叶子结点{    if (____第一空____)     //找到一个满足条件的更优解,保存它{    maxv=tv;for (____第二空____)    //复制最优解x[j]=op[j];}}else                        //尚未找完所有物品{    if (____第三空____)          //左孩子结点剪枝:满足条件时才放入第i个物品{op[i]=1;            //选取第i个物品dfs(____第四空____);}op[i]=0;                //不选取第i个物品,回溯if (____第五空____)            //右孩子结点剪枝dfs(____第六空____);}
    }
    void dispasolution()            //输出最优解
    {    int i;for (i=1;i<=n;i++)if (x[i]==1)printf("%d ",i);printf("\n%d %d",W,maxv);
    }
    int main()
    {int i;cin>>n>>W; //输入物体个数及背包载重量 for(int i=1;i<=n;i++)//输入各物体重量及价值 cin>>w[i]>>v[i];int op[MAXN];                //存放临时解memset(op,0,sizeof(op));int rw=0;for (int i=1;i<=n;i++)rw+=w[i];dfs(1,0,0,rw,op);dispasolution();return 0;
    }
    

    输入格式:

    第一行输入背包载重量W及背包个数n,再依次输入n行,每行为背包重量wi和价值vi。

    输出格式:

    第一行输出输出装入背包内的物体编号(末尾有空格),第二行输出背包内的物体总重量和总价值。

    输入样例1:

    5 10
    2 6
    2 3
    6 5
    5 4
    4 6
    

    输出样例1:

    1 2 3 
    10 14 
    

    参考答案:

    第一空:tw==W&&tv>maxv

    第二空:j=1;j<=n;j++

    第三空:tw+w[i]<=W

    第四空:i+1,tw+w[i],tv+v[i],rw-w[i],op

    第五空:tw+rw>=W

    第六空:i+1,tw,tv,rw-w[i],op


主观题

  1. 动态规划法与分治法的异同
    简述动态规划法与分治法的异同。

    仅供参考(自己写的)

    动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划法求解的问题,经分解得到的子问题往往不是互相独立的。若用分治法解这类问题,则分解得到的子问题数目太多,以至于最后解决原问题需要耗费指数时间。然而,不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次。如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算,从而得到多项式时间算法。(来自书本P50)


  1. 简答题-对比说明分支限界法中活结点表的两种组织形式及其特点。
    对比说明分支限界法中活结点表的两种组织形式及其特点。

    仅供参考(自己写的)

    1)队列式(FIFO)分支限界法

    队列式分支限界法将活结点表组织成一个队列,并按队列的先进先出FIFO(firstin first out)原则选取下一个结点为当前扩展结点。

    2)优先队列式分支限界法

    优先队列式的分支限界法将活结点表组织成一个优先队列,并按优先队列中规定的结点优先级选取优先级最高的下一个结点成为当前扩展结点。

    (来自书本P153)


  1. 计算题
    证明: n 2 + 3 n l o g n + 10 n + 1000 = O ( n 2 ) n^2 + 3nlogn + 10n + 1000 = O(n^2) n2+3nlogn+10n+1000=O(n2)

    ∵ n 2 = O ( n 2 ) 3 n l o g n = O ( 3 n l o g n ) = O ( n l o g n ) 10 n = O ( 10 n ) = O ( n ) 1000 = O ( c ) ∴ n 2 + 3 n l o g + 10 n + 1000 = O ( n 2 ) + O ( n l o g n ) + O ( n ) + O ( c ) = O ( m a x ( n 2 , n l o g n , n , c ) ) = O ( n 2 ) \begin{equation} \begin{aligned} \because & n^2=O(n^2)\\ & 3nlogn=O(3nlogn)=O(nlogn)\\ & 10n=O(10n)=O(n)\\ & 1000=O(c)\\ \therefore & n^2+3nlog+10n+1000\\ & =O(n^2)+O(nlogn)+O(n)+O(c)\\ & =O(max(n^2,nlogn,n,c))\\ & =O(n^2) \end{aligned} \nonumber \end{equation} n2=O(n2)3nlogn=O(3nlogn)=O(nlogn)10n=O(10n)=O(n)1000=O(c)n2+3nlog+10n+1000=O(n2)+O(nlogn)+O(n)+O(c)=O(max(n2,nlogn,n,c))=O(n2)


  1. 计算题-矩阵连乘

    利用动态规划法计算矩阵连乘积A1A2A3A4A5的最佳求积顺序(即:数乘次数最少的计算次序),各矩阵的维数分别为:

    矩阵A1A2A3A4A5
    维数5x1010x33x1212x55x50

    (要求给出计算步骤)


  1. 算法设计题-马踏棋盘
    国际象棋中马的走法相当复杂,现在给定一个8*8的国际象棋棋盘,要求马连续走动若干步,求马的最终位置。马的走法只有两种:1)跳到相邻的格子;2)跳到对角线两格相连的格子。注意,马只能向下和向右走动,且每次只能走一格。设计一种策略,要求每个方格只进入一次,走遍棋盘全部的64个方格,得到马的行走路线。(不需要写出详细代码,只需写出使用的算法策略名称、算法策略、数据准备以及程序实现流程)(15分)

    算法策略名称:回溯算法(Backtracking)

    算法策略:

    1. 初始化棋盘,所有格子标记为未访问。
    2. 选择一个起始位置(例如,左上角)。
    3. 从起始位置开始,尝试马的所有可能移动。
    4. 对于每一个移动,检查新的位置是否在棋盘内且未被访问过。
    5. 如果新的位置有效,则标记该位置为已访问,并递归地尝试从该位置进行下一步移动。
    6. 如果在尝试所有可能的移动后没有找到解,则回溯到前一步,并尝试其他移动。
    7. 当找到一条路径,即访问了所有格子时,停止搜索并返回结果。

    数据准备:

    • 8x8的二维数组,表示棋盘,每个元素初始化为未访问状态。
    • 马的当前位置(行和列)。
    • 可能的移动列表,根据马的走法生成。

    程序实现流程:

    1. 初始化棋盘和马的位置。

    2. 调用回溯函数,传入当前位置和棋盘状态。

    3. 在回溯函数中,检查是否所有格子都已被访问。

      • 如果是,则找到了解决方案,返回或记录结果。

      • 如果不是,则遍历所有可能的移动。

        • 对于每个移动,检查新的位置是否有效。
        • 如果有效,更新棋盘状态,递归调用回溯函数。
        • 如果递归调用没有找到解,则恢复棋盘状态到移动之前的状态(回溯)。
    4. 如果回溯函数返回,但没有找到解,则整个问题无解。


  1. 算法设计题-活动安排

    某体育馆有一羽毛球场出租,现在总共有10位客户申请租用此羽毛球场,每个客户所租用的开始时间和结束时间如下表所示,其中s(i)表示开始租用时间,f(i)表示结束租用时间:

    i12345678910
    s(i)03153511886
    f(i)65498713121110

    同一时刻,该羽毛球场只能租给一位客户,请设计一个租用安排方案,在这10位客户里面,使得体育馆尽可能满足多位客户的需求,并算出针对上表的10个客户申请,最多可以安排几位客户申请?

    为了解决这个问题,可以使用贪心算法中的“活动选择”策略。基本思想是:每次选择结束时间最早的活动,这样可以为后面的活动留下更多的时间。

    具体步骤如下:

    1. 首先,将10个客户的申请按照结束时间f(i)​进行升序排序。如果两个活动的结束时间相同,则选择开始时间较晚的那个(这样可能会为后面的活动留下更多的时间)。

    2. 初始化一个空的活动列表,用于存放被选中的活动。

    3. 从排序后的第一个活动开始,检查每一个活动:

      • 如果该活动的开始时间不早于当前活动列表中的最后一个活动的结束时间,则拒绝该活动。
      • 否则,将该活动加入到活动列表中。
    4. 当所有活动都被检查后,活动列表中的活动数量就是最多可以安排的客户数量。

    现在,我们来应用这个策略到给定的数据上:

    首先,按照f(i)​进行排序,得到以下顺序(这里只列出了被选中的活动,未选中的活动用“X”表示):

    i12345678910
    原i32165410987
    s(i)13053568811
    f(i)45678910111213
    选中XXXXXX

    按照上述策略,我们选择了以下活动:3, 6, 7, 9。所以最多可以安排4位客户的申请。

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

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

相关文章

鸿蒙学习笔记

DevEco Studio, ArkTS, ArkUI, ArkCompiler, DevEco Testing是啥 DevEco Studio是华为开发的一款集成开发环境&#xff08;IDE&#xff09;&#xff0c;用于开发基于华为鸿蒙操作系统&#xff08;HarmonyOS&#xff09;的应用程序。它提供了丰富的开发工具和功能&#xff0c;包…

vue3 实现关于 el-table 表格组件的封装以及调用

一、示例图&#xff1a; 二、组件 <template><div class"sn-table" :class"props.colorType 1 ? : bg-scroll"><el-table :data"tableData" :row-class-name"tableRowClassName" height"500" style"…

DevOps(8)

目录 36.当发出的命令与上次使用时产生的结果不同时&#xff0c;会出现什么问题&#xff1f; 37./usr /local的内容是什么&#xff1f; 38.你如何终止正在进行的流程&#xff1f; 39.如何在命令行提示符中插入注释&#xff1f; 40.什么是命令分组以及他是如何工作的&…

云卷云舒:【实战篇】Redis迁移

1. 简介 Remote Dictionary Server(Redis)是一个由Salvatore Sanfilippo写的key-value存储系统&#xff0c;是一个开源的使用ANSIC语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 2. 迁移原理 redis-sh…

什么是 RFID 及其工作原理?

一、自动识别技术 自1999年麻省理工学院研究人员的首创开始&#xff0c;自动识别技术&#xff08;简称auto-ID&#xff09;的领域不断扩大。自动识别技术形成了多种技术路线&#xff0c;使我们能够自动、精确地捕获、识别和存储与物体、物品或个人相关的数据&#xff0c;从而减…

Selenium-java 定位元素时切换iFrame时的方法

具体方法如下图所示&#xff0c;如果iFrame中嵌套多层iFrame需要逐层定位到需要的那一层iFrame,完成操作后&#xff0c;执行该代码&#xff1a;driver.switchTo() .defaultContent() ; 是返回最顶部的frame

理解二叉树的遍历(算法村第七关白银挑战)

二叉树的前序遍历 144. 二叉树的前序遍历 - 力扣&#xff08;LeetCode&#xff09; 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3]解 LeetCode以及面试中提供的方法可能…

科普:嵌入式多核并行仿真

自信息技术革命以来&#xff0c;计算机一直被应用在各种复杂的数据处理中&#xff0c;如火箭弹道&#xff0c;高能物理和生物学数据等。随着嵌入式领域的多样化需求的不断丰富&#xff0c;多核CPU的应用也越来越广泛&#xff1a;嵌入式系统通常需要同时处理多个任务和实时数据&…

ChatGPT是什么,海鲸AI软件功能有哪些

ChatGPT是一种基于人工智能的对话生成技术&#xff0c;它利用深度学习模型来理解和生成自然语言对话。ChatGPT的核心是一种称为生成式预训练模型(GPT)的技术&#xff0c;它能够根据输入的对话内容生成连贯、自然的回答&#xff0c;实现智能对话的目的。这种技术的出现&#xff…

【JAVA】实验二 类与对象

实验名称 实验二 类与对象 实验目的 1. 深刻理解类的封装与继承&#xff1b; 2. 熟练掌握类的定义、包与路径、对象的创建、方法的调用、类的继承、方法的重写、运行时多态、访问权限修饰符的使用等&#xff1b; 3. 熟练运用JDK提供的常用类及API。 实验内容&…

文件二维码能下载文件吗?扫码看文件效率更高

为了让文件更快的传递&#xff0c;现在将文件制作二维码图片后&#xff0c;让其他人通过扫码查看或者下载文件的方式&#xff0c;被越来越多的人应用。一般想要制作文件二维码&#xff0c;大多会使用文件二维码生成器&#xff08;文件二维码生成器_word、excel、ppt、pdf文档制…

linux下安装Nginx及其常用命令

安装Nginx 接下来在Linux服务器进行操作就可以了 安装插件 yum -y install gcc pcre-devel zlib-devel openssl openssl-devel直接使用wget进行安装(如果没有wget需要先安装wget) yum install wgetwget https://nginx.org/download/nginx-1.24.0.tar.gz解压 tar -zxvf nginx..…

代码训练day59|单调栈part02

参考&#xff1a; 代码随想录 如何高效解决接雨水问题 | labuladong 的算法笔记 503.下一个更大元素II 与下一个更大元素&#xff5c;的区别就是要把数组考虑为环形&#xff08;只有数组内最大值为-1&#xff09; 按照之前的环形为题解决经验&#xff0c;直接拼接两个数组解…

解决mock单元测试中 无法获取实体类xxx对应的表名

错误描述&#xff1a;在执行单元测试时&#xff0c;执行到new Example时抛出异常&#xff0c;提示无法获取实体类xxx对应的表名 Example example new Example(ServeSubscribeRecord.class);Example.Criteria criteria example.createCriteria();criteria.andEqualTo("se…

【Linux】Linux Page Cache页面缓存的原理

Page cache&#xff08;页面缓存&#xff09;是计算机操作系统中的一种机制&#xff0c;用于将频繁访问的数据从磁盘存储到内存中&#xff0c;以便更快地访问。当程序从磁盘请求数据时&#xff0c;操作系统会检查该数据是否已经存在于页面缓存中。如果存在&#xff0c;数据可以…

QT上位机开发(动态库dll的开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 有的时候&#xff0c;我们不想把所有的代码都放在一个exe里面&#xff0c;这个时候我们就需要引入dll动态库的概念。在windows平台上面&#xff0c…

FlagData 2.0:全面、高效的大模型训练数据治理工具集

数据是大模型训练至关重要的一环。数据规模、质量、配比&#xff0c;很大程度上决定了最后大模型的性能表现。无论是大规模的预训练数据、精益求精的SFT数据都依托于一个完整的“获取-准备-处理-分析”数据流程。然而&#xff0c;当前的开源工具通常只专注于流程中的某一环节&a…

ThreeJs通过canvas和Sprite添加标签

在3D场景中很多时候会用到给模型添加标签&#xff0c;以表示这个模型的代号&#xff0c;尤其是大量重复模型的时候&#xff0c;添加标签是为了更直观的看到场景中每个模型的数据和名称&#xff0c;比如在仓库中有很多货架&#xff0c;就会需要查看每个货架的编号&#xff0c;如…

Flink Connector 开发

Flink Streaming Connector Flink是新一代流批统一的计算引擎&#xff0c;它需要从不同的第三方存储引擎中把数据读过来&#xff0c;进行处理&#xff0c;然后再写出到另外的存储引擎中。Connector的作用就相当于一个连接器&#xff0c;连接Flink计算引擎跟外界存储系统。Flin…