【计算机类职业资格】软件设计师-26及答案解析.doc
《【计算机类职业资格】软件设计师-26及答案解析.doc》由会员分享,可在线阅读,更多相关《【计算机类职业资格】软件设计师-26及答案解析.doc(11页珍藏版)》请在麦多课文档分享上搜索。
1、软件设计师-26 及答案解析(总分:99.96,做题时间:90 分钟)一、试题一(总题数:1,分数:25.00)阅读下列说明和 C 代码,回答下面问题。 说明 计算一个整数数组 a 的最长递增子序列长度,对其方法描述如下。 假设数组 a 的长度为 n,用数组 b 的元素 bi记录以 ai(0in)为结尾元素的最长递增子序列的长度为 max(0in)bi,其中 bi满足最优子结构,可递归定义为: (分数:24.99)(1).根据说明和 C 代码,填充 C 代码中的空。(分数:8.33)_(2).根据说明和 C 代码,算法采用了_设计策略,时间复杂度为_(用 O 符号表示)。(分数:8.33)_(
2、3).已知数组 a=3,10,5,15,6,8,据说明和 C 代码,给出数组 b 的元素值。(分数:8.33)_二、试题二(总题数:1,分数:25.00)阅读下列说明和 C 代码,回答下面问题。 说明 采用归并排序对 n 个元素进行递增排序时,首先将 n 个元素的数组分成各含 n/2 个元素的两个子数组,然后用归并排序对两个子数组进行递归排序,最后合并两个已经排序的子数组得到排序结果。 下面的 C 代码是对上述归并算法的实现,其中的常量和变量说明如下。 art:待排序数组。 p,q,r:一个子数组的位置从 p 到 q,另一个子数组的位置从 q+1 到 r。 begin,end:待排序数组的起止
3、位置。 left,right:临时存放待合并的两个子数组。 n1,n2:两个子数组的长度。 i,j,k:循环变量。 mid:临时变量。 C 代码 #inciudestdio.h #inciudestdlib.h Define MAX 65536 void merge(int art(,int p,int q,int r) int*left,*right; int n1,n2,I,j,k; n1=q-p+1; n2=r-q; If(left=(int*)malloc(n1+1)*sizeof(int)=NULL) Perror(“malloc error“); exit(1); If(right
4、=(int*)malloc(n2+1)*sizeof(int)=NULL) Perror(“malloc error“); exit(1); for(i=0;in1;i+) lefti=artp+i; lefti=MAX; for(i=0;in2;i+) righti=arrq+i+1 righti=MAX; i=0;j=0; For(k=p;(1);k+) If(leftirightj _ j+; else arrk1=lefti; i+; Void merge Sort(int art(),int begin,int end) int mid; if(_) mid=(begin+end)/
5、2; merge Sort(art,begin,mid); _; Merge(arr,begin,mid,end); (分数:24.99)(1).根据以上说明和 C 代码,填充各个空。(分数:8.33)_(2).根据题干说明和以上 C 代码,算法采用了_算法设计策略,分析时间复杂度时,列出其递归式为_, 接触渐进时间复杂度_(用 O 符号表示),空间复杂度为_(用 O 符号表示)。(分数:8.33)_(3).两个长度分别为 n1 和 n2 的已经排好序的子数组进行归并,根据上述 C 代码,则元素之间的比较次数为_。(分数:8.33)_三、试题三(总题数:1,分数:25.00)阅读下列说明和 C
6、 代码,回答下面问题。 说明 设有 m 台完全相同的机器运行 n 个独立的任务,运行任务 i 所需要的时间为 t i ,要求确定一个调度方案,使的完成所有任务所需要的时间最短。 假设任务已经按照其运行时间从大到小排序,算法基于最长运行时间作业优先的策略;按顺序先把每个任务分配到一台机器上,然后将剩余的任务一次放入最先空闲的机器。 C 代码 下面是算法的 C 语言实现。 (1)常量和变量说明 m:机器数。 n:任务数。 t:输入数组,长度为 n,其中每个元素表示任务的运行时间,下标从 0 开始。 s:二维数组,长度为 m*n,下标从 0 开始,其中元素 sij表示机器 i 运行的任务 j 的编号
7、。 d:数组,长度为 m 其中元素 di表示机器 i 的运行时间,下标从 0 开始。 count:数组,长度为 m,下标从 0 开始,其中元素 counti表示机器 i 运行的任务数。 i:循环变量。 i:循环变量。 k:临时变量。 max:完成所有任务的时间。 min:临时变量。 (2)函数 schedule void schedule() int i,j,k max=0; for(i=0; im;i+) di=0; for(j=0;jn;j+) sij=0; for(i=0;im;i+) /分配前 m 个任务 si0=i; _; counti=1; for(_;in;i+) /分配后 n-
8、m 个任务 int min=d0; k=0; for(j=1;jm;j+) /确定空闲机器 if(mindj) min=dj; k=j; /机器 k 空闲 _; countk=countk+1; dk=dk+ti; for(i=0;im;i+) /确定完成所有任务所需要的时间 if(_) max=di; (分数:24.99)(1).根据说明和 C 代码,填充 C 代码中的空。(分数:8.33)_(2).根据说明和 C 代码,该问题采用了_算法设计策略,时间复杂度为_(用 O 符号表示)(分数:8.33)_(3).考虑实例 m=3(编号 02),n=7(编号 06),各任务的运行时间为16,14
9、,6,5,4,3,2,则在机器0、1 和 2 上运行的任务分别为_、_和_(给出任务编号)。从任务开始运行到完成所需要的时间为_。(分数:8.33)_四、试题四(总题数:1,分数:25.00)阅读以下说明和 C 代码,根据要求回答问题。 说明 某工程计算中要完成多个矩阵相乘(链乘)的计算任务。 两个矩阵相乘要求第一个矩阵的列数等于第二个矩阵的行数,计算量主要由进行乘法运算的次数决定。采用标准的矩阵相乘算法,计算 A mn *B np ,需要 m*n*p 次乘法运算。 矩阵相乘满足结合律,多个矩阵相乘,不同的计算顺序会产生不同的计算量。以矩阵 A1 10100 ,A2 1005 ,A3 550
10、三个矩阵相乘为例,若按(A1*A2)*A3 计算,则需要进行 10*100*5+10*5*50=7500 次乘法运算;若按 A1*(A2*A3)计算,则需要进行 100*5*50+10*100*50=75000 次乘法运算。可见不同的计算顺序对计算量有很大的影响。 矩阵链乘问题可描述为:给定 n 个矩阵A1,A2,A n ,矩阵 4 的维数为 p i-1 p i ,其中i=1,2,n。确定一种乘法顺序,使得这 n 个矩阵相乘时进行乘法的运算次数最少。 由于可能的计算顺序数量非常庞大,对较大的 n,用蛮力法确定计算顺序是不实际的。经过对问题进行分析,发现矩阵链乘问题具有最优子结构,即若 A1*A
11、2*An 的一个最优计算顺序从第 k 个矩阵处断开,即分为 A1*A2*Ak 和 Ak+1*Ak+2*An 两个子问题,则该最优解应该包含 A1*A2*Ak 的一个最优计算顺序和 Ak+1*Ak+2*An 的一个最优计算顺序。据此构造递归式: (分数:24.99)(1).根据以上说明和 C 代码,填充 C 代码中的空。(分数:8.33)_(2).根据以上说明和 C 代码,该问题采用了_算法设计策略,时间复杂度为_(用 O 符号表示)。(分数:8.33)_(3).考虑实例 n=6,各个矩阵的维数:A1 为 5*10,A2 为 10*3,A3 为 3*12,A4 为 12*5,A5 为 5*50,
12、A6为 50*6,即维数序列为 5,10,3,12,5,50,6。则根据上述 C 代码得到的一个最优计算顺序为_(用加括号方式表示计算顺序),所需要的乘法运算次数为_。(分数:8.33)_软件设计师-26 答案解析(总分:99.96,做题时间:90 分钟)一、试题一(总题数:1,分数:25.00)阅读下列说明和 C 代码,回答下面问题。 说明 计算一个整数数组 a 的最长递增子序列长度,对其方法描述如下。 假设数组 a 的长度为 n,用数组 b 的元素 bi记录以 ai(0in)为结尾元素的最长递增子序列的长度为 max(0in)bi,其中 bi满足最优子结构,可递归定义为: (分数:24.9
13、9)(1).根据说明和 C 代码,填充 C 代码中的空。(分数:8.33)_正确答案:()解析:本题考查最长递增序列问题,是一种动态规划法,也考查时间复杂度的计算。 b0=1 j=i aj=ai bi=len+1 解析 本题考查算法设计、分析技术以及算法的 C 语言实现,是比较传统的题目,要求考生细心分析题目中所描述的内容。 根据题中说明,b 数组记录最长递增子序列的长,故应初始化 b0=1,这是第一问的答案,初始 Len=0,接下来 a 中某个元素的值大于前面某个元素,则 Len+1 放进 b,故第二问为 j=i,第四问为 bi=Len+1。(2).根据说明和 C 代码,算法采用了_设计策略
14、,时间复杂度为_(用 O 符号表示)。(分数:8.33)_正确答案:()解析:动态规划法 O(n 2 ) 解析 算法将待求解问题分解成若干个子问题,先求子问题,然后从这些子问题的解中得到原问题的解,使用的是动态规划的思想,时间复杂度计算最坏情况下的运算次数,最坏情况时 i 和 j 都从 1跑到 n,故运算 n 的平方次,算法的时间复杂度为 O(n 2 )。(3).已知数组 a=3,10,5,15,6,8,据说明和 C 代码,给出数组 b 的元素值。(分数:8.33)_正确答案:()解析:=1,2,2,3,3,4解析 初始化 b0=1,a0=3,a1=10,进入时 b1=2,a2=5 进入时有3
15、,5 的序列,故 b2=2,a3=15,进入时有 3,10,15,故子序列为 3,a4=6 时,有子序列 3,5,6,故为3,当最后一个元素 8 进入时有 3,5,6,8,故 b5=4,所以 b=1,2,2,3,3,4。二、试题二(总题数:1,分数:25.00)阅读下列说明和 C 代码,回答下面问题。 说明 采用归并排序对 n 个元素进行递增排序时,首先将 n 个元素的数组分成各含 n/2 个元素的两个子数组,然后用归并排序对两个子数组进行递归排序,最后合并两个已经排序的子数组得到排序结果。 下面的 C 代码是对上述归并算法的实现,其中的常量和变量说明如下。 art:待排序数组。 p,q,r:
16、一个子数组的位置从 p 到 q,另一个子数组的位置从 q+1 到 r。 begin,end:待排序数组的起止位置。 left,right:临时存放待合并的两个子数组。 n1,n2:两个子数组的长度。 i,j,k:循环变量。 mid:临时变量。 C 代码 #inciudestdio.h #inciudestdlib.h Define MAX 65536 void merge(int art(,int p,int q,int r) int*left,*right; int n1,n2,I,j,k; n1=q-p+1; n2=r-q; If(left=(int*)malloc(n1+1)*sizeo
17、f(int)=NULL) Perror(“malloc error“); exit(1); If(right=(int*)malloc(n2+1)*sizeof(int)=NULL) Perror(“malloc error“); exit(1); for(i=0;in1;i+) lefti=artp+i; lefti=MAX; for(i=0;in2;i+) righti=arrq+i+1 righti=MAX; i=0;j=0; For(k=p;(1);k+) If(leftirightj _ j+; else arrk1=lefti; i+; Void merge Sort(int ar
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
5000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 职业资格 软件 设计师 26 答案 解析 DOC
