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

2024-01-06 06:52

本文主要是介绍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

    (要求给出计算步骤)

    使用m[i][j]来表示计算从Ai到Aj的矩阵连乘积所需的最少乘法次数。
    同时,使用s[i][j]来记录达到最少乘法次数的最后一个乘法操作的位置。

    动态规划的思路是:

    1. 对于任意的i,m[i][i] = 0,因为单个矩阵的乘法次数为0。
    2. 从长度为2的子链开始(即计算A1A2, A2A3, …),然后逐步增加子链的长度,直到覆盖整个链。
    3. 对于每个子链Ai…Aj,尝试所有可能的k值(i <= k < j),将子链分为两部分Ai…Ak和Ak+1…Aj,并计算乘法次数。
    4. 选择乘法次数最小的k值,并更新m[i][j]和s[i][j]。

      计算过程如下表所示:

      m[i][j]表
    i\j12345
    101503304051655
    203603302430
    30180930
    403000
    50

    s[i][j]表

    i\j12345
    101224
    20222
    3034
    404
    50

    由表可得出,最佳求积顺序为:
    (((A1A2)(A3A4))A5)

    附计算过程:

    计算过程(以下内容在考试时不需要写):
    当 r = 2 时
    i = 1, j = 2, k = 1
    m[1][2] = 5 x 10 x 3 = 150
    s[1][2] = 1
    i = 2, j = 3, k = 1
    m[2][3] = 10 x 3 x 12 = 360
    s[2][3] = 2
    i = 3, j = 4, k = 3
    m[3][4] = 3 x 12 x 5 = 180
    s[3][4] = 3
    i = 4, j = 5, k = 4
    m[4][5] = 12 x 5 x 50 = 3000
    s[4][5] = 4
    </br>
    当 r = 3 时
    i = 1, j = 3
    k = 1时 m[1][3] = 5 x 10 x 12 + m[2][3] = 960
    k = 2时 m[1][3] = 5 x 3 x 12 + m[1][2] = 330
    当 k = 2 时 m[1][3] 最小,故
    m[1][3] = 330
    s[1][3] = 2
    i = 2, j = 4
    k = 2时 m[2][4] = 10 x 3 x 5 + m[3][4] = 330
    k = 3时 m[2][4] = 10 x 12 x 5 + m[2][3] = 960
    当 k = 2 时 m[2][4] 最小,故
    m[2][4] = 330
    s[2][4] = 2
    i = 3, j = 5
    k = 3时 m[3][5] = 3 x 12 x 50 + m[4][5] = 2100
    k = 4时 m[3][5] = 3 x 5 x 80 + m[3][4] = 930
    当 k = 4 时 m[3][5] 最小,故
    m[3][5] = 930
    s[3][5] = 4当 r = 4 时
    i = 1, j = 4
    k = 1时 m[1][4] = 5 x 10 x 5 + m[1][1] + m[2][4] = 580
    k = 2时 m[1][4] = 5 x 3 x 5 + m[1][2] + m[3][4] = 405
    k = 3时 m[1][4] = 5 x 12 x 5 + m[1][3] + m[4][4] = 630
    当 k = 2 时 m[1][4] 最小,故
    m[1][4] = 405
    s[1][4] = 2
    i = 2, j = 5
    k = 2时 m[2][5] = 10 x 3 x 50 + m[2][2] + m[3][5] = 2430
    k = 3时 m[2][5] = 10 x 12 x 50 + m[2][3] + m[4][5] = 6960
    k = 4时 m[2][5] = 10 x 5 x 50 + m[2][4] + m[5][5] = 2830
    当 k = 2 时 m[2][5] 最小,故
    m[2][5] = 2430
    s[2][5] = 2当 r = 5 时
    i = 1, j = 5
    k = 1时 m[1][5] = 5 x 10 x 50 + m[1][1] + m[2][5] = 4930
    k = 2时 m[1][5] = 5 x 3 x 50 + m[1][2] + m[3][5] = 1830
    k = 3时 m[1][5] = 5 x 12 x 50 + m[1][3] + m[4][5] = 2460
    k = 4时 m[1][5] = 5 x 5 x 50 + m[1][4] + m[5][5] = 1655
    当 k = 4 时 m[1][5] 最小,故
    m[1][5] = 1655
    s[1][5] = 4
    

    这个过程如果用算法表示是这样的:

    a[6] = {5, 10, 3, 12, 5, 50};
    for (int i = 1; i <= 5; i++) {m[i][i] = 0;s[i][i] = 0;
    }
    for (int r = 2; r <= 5; r++) {for (int i = 1; i <= 5 - r + 1; i++) {int j = i + r - 1;m[i][j] = a[i - 1] * a[i] * a[j] + m[i + 1][j];s[i][j] = i;for (int k = i + 1; k < j; k++) {int t = m[i][k] + m[k + 1][j] + a[i - 1] * a[k] * a[j];if (t < m[i][j]) {m[i][j] = t;s[i][j] = k;}}}
    }
    

  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位客户的申请。

这篇关于2023-2024学年上学期算法设计与分析题期末考试模拟卷的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/575539

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题是由安全生产模拟考试一点通提供,流动式起重机司机证模拟考试题库是根据流动式起重机司机最新版教材,流动式起重机司机大纲整理而成(含2024年流动式起重机司机证模拟考试题库及流动式起重机司机理论考试试题参考答案和部分工种参考解析),掌握本资料和学校方法,考试容易。流动式起重机司机考试技

【数据结构】——原来排序算法搞懂这些就行,轻松拿捏

前言:快速排序的实现最重要的是找基准值,下面让我们来了解如何实现找基准值 基准值的注释:在快排的过程中,每一次我们要取一个元素作为枢纽值,以这个数字来将序列划分为两部分。 在此我们采用三数取中法,也就是取左端、中间、右端三个数,然后进行排序,将中间数作为枢纽值。 快速排序实现主框架: //快速排序 void QuickSort(int* arr, int left, int rig

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<