算法设计与分析(1)
- 格式:doc
- 大小:80.00 KB
- 文档页数:5
算法设计与分析知到章节测试答案智慧树2023年最新天津大学第一章测试1.下列关于效率的说法正确的是()。
参考答案:提高程序效率的根本途径在于选择良好的设计方法,数据结构与算法;效率主要指处理机时间和存储器容量两个方面;效率是一个性能要求,其目标应该在需求分析时给出2.算法的时间复杂度取决于()。
参考答案:问题的规模;待处理数据的初态3.计算机算法指的是()。
参考答案:解决问题的有限运算序列4.归并排序法的时间复杂度和空间复杂度分别是()。
参考答案:O(nlog2n);O(n)5.将长度分别为m,n的两个单链表合并为一个单链表的时间复杂度为O(m+n)。
()参考答案:错6.用渐进表示法分析算法复杂度的增长趋势。
()参考答案:对7.算法分析的两个主要方面是时间复杂度和空间复杂度的分析。
()参考答案:对8.某算法所需时间由以下方程表示,求出该算法时间复杂度()。
参考答案:O(nlog2n)9.下列代码的时间复杂度是()。
参考答案:O(log2N)10.下列算法为在数组A[0,...,n-1]中找出最大值和最小值的元素,其平均比较次数为()。
参考答案:3n/2-3/2第二章测试1.可用Master方法求解的递归方程的形式为()。
参考答案:T(n)=aT(n/b)+f(n) , a≥1, b>1, 为整数, f(n)>0.2.参考答案:对3.假定,, 递归方程的解是. ( )参考答案:对4.假设数组A包含n个不同的元素,需要从数组A中找出n/2个元素,要求所找的n/2个元素的中点元素也是数组A的中点元素。
针对该问题的任何算法需要的时间复杂度的下限必为。
( )参考答案:错5.使用Master方法求解递归方程的解为().参考答案:6.考虑包含n个二维坐标点的集合S,其中n为偶数,且所有坐标点中的均不相同。
一条竖直的直线若能把S集合分成左右两部分坐标点个数相同的子集合,则称直线L为集合S的一条分界线。
若给定集合S,则可在时间内找到这条分界线L。
算法设计与分析习题答案算法设计与分析是计算机科学中一个重要的领域,它涉及到算法的创建、优化以及评估。
以下是一些典型的算法设计与分析习题及其答案。
习题1:二分查找算法问题描述:给定一个已排序的整数数组,编写一个函数来查找一个目标值是否存在于数组中。
答案:二分查找算法的基本思想是将数组分成两半,比较中间元素与目标值的大小,如果目标值等于中间元素,则查找成功;如果目标值小于中间元素,则在左半部分继续查找;如果目标值大于中间元素,则在右半部分继续查找。
这个过程会不断重复,直到找到目标值或搜索范围为空。
```pythondef binary_search(arr, target):low, high = 0, len(arr) - 1while low <= high:mid = (low + high) // 2if arr[mid] == target:return Trueelif arr[mid] < target:low = mid + 1else:high = mid - 1return False```习题2:归并排序算法问题描述:给定一个无序数组,使用归并排序算法对其进行排序。
答案:归并排序是一种分治算法,它将数组分成两半,分别对这两半进行排序,然后将排序好的两半合并成一个有序数组。
```pythondef merge_sort(arr):if len(arr) > 1:mid = len(arr) // 2left_half = arr[:mid]right_half = arr[mid:]merge_sort(left_half)merge_sort(right_half)i = j = k = 0while i < len(left_half) and j < len(right_half): if left_half[i] < right_half[j]:arr[k] = left_half[i]i += 1else:arr[k] = right_half[j]j += 1k += 1while i < len(left_half):arr[k] = left_half[i]i += 1k += 1while j < len(right_half):arr[k] = right_half[j]j += 1k += 1arr = [38, 27, 43, 3, 9, 82, 10]merge_sort(arr)print("Sorted array is:", arr)```习题3:动态规划求解最长公共子序列问题问题描述:给定两个序列,找到它们的最长公共子序列。
《算法设计与分析》历年期末试题整理(含答案)(1)用计算机求解问题的步骤:1、问题分析2、数学模型建立3、算法设计与选择4、算法指标5、算法分析6、算法实现7、程序调试8、结果整理文档编制(2)算法定义:算法是指在解决问题时,按照某种机械步骤一定可以得到问题结果的处理过程(3)算法的三要素1、操作2、控制结构3、数据结构算法具有以下5 个属性:有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。
确定性:算法中每一条指令必须有确切的含义。
不存在二义性。
只有一个入口和一个出口可行性:一个算法是可行的就是算法描述的操作是可以通过已经实现的基本运算执行有限次来实现的。
输入:一个算法有零个或多个输入,这些输入取自于某个特定对象的集合。
输出:一个算法有一个或多个输出,这些输出同输入有着某些特定关系的量。
算法设计的质量指标:正确性:算法应满足具体问题的需求;可读性:算法应该好读,以有利于读者对程序的理解;健壮性:算法应具有容错处理,当输入为非法数据时,算法应对其作出反应,而不是产生莫名其妙的输出结果。
效率与存储量需求:效率指的是算法执行的时间;存储量需求指算法执行过程中所需要的最大存储空间。
一般这两者与问题的规模有关。
经常采用的算法主要有迭代法、分而治之法、贪婪法、动态规划法、回溯法、分支限界法迭代法也称“辗转法”,是一种不断用变量的旧值递推出新值的解决问题的方法。
利用迭代算法解决问题,需要做好以下三个方面的工作:一、确定迭代模型。
在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。
二、建立迭代关系式。
所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。
迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。
三、对迭代过程进行控制。
在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。
不能让迭代过程无休止地重复执行下去。
算法设计与分析(第2版)-王红梅-胡明-习题答案习题11. 图论诞生于七桥问题。
出生于瑞士的伟大数学家欧拉(Leonhard Euler ,1707—1783)提出并解决了该问题。
七桥问题是这样描述的:一个人是否能在一次步行中穿越哥尼斯堡(现在叫加里宁格勒,在波罗的海南岸)城中全部的七座桥后回到起点,且每座桥只经过一次,图 1.7是这条河以及河上的两个岛和七座桥的草图。
请将该问题的数据模型抽象出来,并判断此问题是否有解。
七桥问题属于一笔画问题。
输入:一个起点输出:相同的点1, 一次步行2, 经过七座桥,且每次只经历过一次3, 回到起点该问题无解:能一笔画的图形只有两类:一类是所有的点都是偶点。
另一类是只有二个奇点的图形。
2.在欧几里德提出的欧几里德算法中(即最初的欧几里德算法)用的不是除法而是减法。
请用伪代码描述这个版本的欧几里德算法1.r=m-n2.循环直到r=02.1 m=n图1.7 七桥问题2.2 n=r2.3 r=m-n3 输出m3.设计算法求数组中相差最小的两个元素(称为最接近数)的差。
要求分别给出伪代码和C++描述。
//采用分治法//对数组先进行快速排序//在依次比较相邻的差#include <iostream>using namespace std;int partions(int b[],int low,int high){int prvotkey=b[low];b[0]=b[low];while (low<high){while (low<high&&b[high]>=prvotkey)--high;b[low]=b[high];while (low<high&&b[low]<=prvotkey)++low;b[high]=b[low];}b[low]=b[0];return low;}void qsort(int l[],int low,int high){int prvotloc;if(low<high){prvotloc=partions(l,low,high); //将第一次排序的结果作为枢轴qsort(l,low,prvotloc-1); //递归调用排序由low 到prvotloc-1qsort(l,prvotloc+1,high); //递归调用排序由 prvotloc+1到 high}}void quicksort(int l[],int n){qsort(l,1,n); //第一个作为枢轴,从第一个排到第n个}int main(){int a[11]={0,2,32,43,23,45,36,57,14,27,39};int value=0;//将最小差的值赋值给valuefor (int b=1;b<11;b++)cout<<a[b]<<' ';cout<<endl;quicksort(a,11);for(int i=0;i!=9;++i){if( (a[i+1]-a[i])<=(a[i+2]-a[i+1]) )value=a[i+1]-a[i];elsevalue=a[i+2]-a[i+1];}cout<<value<<endl;return 0;}4.设数组a[n]中的元素均不相等,设计算法找出a[n]中一个既不是最大也不是最小的元素,并说明最坏情况下的比较次数。
常用算法设计方法要使计算机能完成人们预定的工作,首先必须为如何完成预定的工作设计一个算法,然后再根据算法编写程序。
计算机程序要对问题的每个对象和处理规则给出正确详尽的描述,其中程序的数据结构和变量用来描述问题的对象,程序结构、函数和语句用来描述问题的算法。
算法数据结构是程序的两个重要方面。
算法是问题求解过程的精确描述,一个算法由有限条可完全机械地执行的、有确定结果的指令组成。
指令正确地描述了要完成的任务和它们被执行的顺序。
计算机按算法指令所描述的顺序执行算法的指令能在有限的步骤内终止,或终止于给出问题的解,或终止于指出问题对此输入数据无解。
通常求解一个问题可能会有多种算法可供选择,选择的主要标准是算法的正确性和可靠性,简单性和易理解性。
其次是算法所需要的存储空间少和执行更快等。
算法设计是一件非常困难的工作,经常采用的算法设计技术主要有迭代法、穷举搜索法、递推法、贪婪法、回溯法、分治法、动态规划法等等。
另外,为了更简洁的形式设计和藐视算法,在算法设计时又常常采用递归技术,用递归描述算法。
一、迭代法迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。
设方程为f(x)=0,用某种数学方法导出等价的形式x=g(x),然后按以下步骤执行:(1)选一个方程的近似根,赋给变量x0;(2)将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量x0;(3)当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤(2)的计算。
若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就认为是方程的根。
上述算法用C程序的形式表示为:【算法】迭代法求方程的根{ x0=初始近似根;do {x1=x0;x0=g(x1);/*按特定的方程计算新的近似根*/} while ( fabs(x0-x1)>Epsilon);printf(“方程的近似根是%f\n”,x0);}迭代算法也常用于求方程组的根,令X=(x0,x1,…,x n-1)设方程组为:x i=g i(X) (I=0,1,…,n-1)则求方程组根的迭代算法可描述如下:【算法】迭代法求方程组的根{ for (i=0;i<n;i++)x[i]=初始近似根;do {for (i=0;i<n;i++)y[i]=x[i];for (i=0;i<n;i++)x[i]=gi(X);for (delta=0.0,i=0;i<n;i++)if (fabs(y[i]-x[i])>delta) delta=fabs(y[i]-x[i]);} while (delta>Epsilon);for (i=0;i<n;i++)printf(“变量x[%d]的近似根是%f”,I,x[i]);printf(“\n”);}具体使用迭代法求根时应注意以下两种可能发生的情况:(1)如果方程无解,算法求出的近似根序列就不会收敛,迭代过程会变成死循环,因此在使用迭代算法前应先考察方程是否有解,并在程序中对迭代的次数给予限制;(2)方程虽然有解,但迭代公式选择不当,或迭代的初始近似根选择不合理,也会导致迭代失败。
湖南中医药大学 2009—2010 学年第一学期
《算法设计与分析》期末考试试卷
班级姓名学号
一、选择题(10题*2分=20分)
1.我们常用算法的最坏时间来估计算法的时间复杂性,下面()不是这样做的原因:
A、在实际问题中,算法的运行时间常常达到这个上界。
B、平均运行时间难以计算。
C、假设每一个输入具有相同的概率有时没有意义。
D、平均运行时间与最坏运行时间有相同的数量级。
2.合并排序算法是利用()实现的算法。
A、分治策略
B、动态规划法
C、贪心法
D、回溯法
3.下列是动态规划算法基本要素的是()。
A、最优子结构
B、构造最优解
C、算出最优解
D、定义最优解
4.下列算法中通常以自顶向下的方式求解最优解的是()。
A、分治法
B、动态规划法
C、贪心法
D、回溯法
5.广度优先是()的一搜索方式。
A、分支界限法
B、动态规划法
C、贪心法
D、回溯法
6.设q(n,m)是将正整数n划分成最大加数不大于m的若干不同正整数之和的划分数,则q(n,m)为()。
A、
1 (n=1 || m=1)
q(n, n) (n < m)
q(n,m)= 1 + q(n, n-1) (n = m)
q(n, m-2) + q(n-m,m)(n > m > 1)
B、
1 (n=1 || m=1)
q(n, n) (n < m)
q(n,m)= 1 + q(n, n-1) (n = m)
q(n, m-1) + q(n-m,m)(n > m > 1)
C、
1 (n=1 || m=1)
q(n, n) (n < m)
q(n,m)= 1 + q(n, n-1) (n = m)
q(n, m-1) + q(n-m,m-1)(n > m > 1)
D、
0 (n > 1 && m = 1)
1 (n=1)
q(n,m)= q(n, n) (n < m)
1 + q(n, n-1) (n = m)
q(n, m-1) + q(n-m,m-1)(n > m > 1)
7.计算机算法指的是解决问题的步骤序列,它必须具备()这三个主要特性。
A、可行性、正确性、可读性
B、可行性、确定性、有穷性
C、确定性、有穷性、稳定性
D、易读性、健壮性、安全性
8.当一个确定性算法在最坏情况下的计算复杂性与其在平均情况下的计算复杂性有较大差别时,可以使用()来消除或减少问题的好坏实例间的这种差别。
A、数值概率算法
B、舍伍德算法
C、蒙特卡罗算法
D、拉斯维加斯算法
9.对于0-1背包问题和背包问题的解法,下面答案解释正确的是()。
A 、0-1背包问题和背包问题都可以用贪心算法求解
B 、0-1背包问题可以用贪心算法求解,但背包问题则不能用贪心算法求解。
C 、0-1背包问题问题不能用贪心算法求解,但可以用动态规划和回溯法求解,而背包问题可以用贪心算法求解。
D 、因为0-1背包问题不具有最优子结构性质,所以不能用贪心算法求解。
10. 在分支限界算法中,根据从活结点表中选择下一扩展点的不同方式可以有几种常用的分类,以下描述最准确的是( )。
A 、 采用FIFO 队列的队列式分支限界法。
B 、 采用最小堆的优先队列式分支限界法。
C 、 采用最大堆的优先队列式分支限界法。
D 、 以上都常用,针对具体问题可以选择其中某种更为合适的方式。
二、 填空题(10题×2分=20分)
1. 算法运行所需要的计算机资源的量,称为算法复杂性,主要包括 和 。
2. f(n)=O(g(n))表示当且仅当存在正的常数C 和N 0,使得对于所有的n , 有f(n) 。
3. 对于函数()T N ,如果存在
()T
N ,使得当N →∞时有
(()())/()0
T N T N T N -→
,就说
()T
N 是()T N 当N →∞时的 。
4. 多项式
10
()m
m A n a n a n a =+++ 的上界为 。
5. 直接或间接地调用自身的算法称为 ,用函数自身给出定义的函数称为 。
6. 动态规划算法的子问题重叠性质是指:每次产生的子问题并不是 ,有些子问题会被 。
7.贪心算法的两个基本要素是和。
8.按照活结点表的组织方式的不同,分支限界法包括和两种形式。
9.回溯法中的解空间树结构通常有两种,分别是、。
10.用分支限界法解旅行售货员问题时,对空间树搜索结束的标志是。
三、判断题(10题×2分=20分)
1.如果g(N)=O(f(N)),则O(f)+O(g)=O(f)。
()
2.所有的递归函数都能找到对应的非递归定义。
()
3.动态规划算法中,通常不同子问题的个数随问题规模呈指数级增长。
()
4.备忘录方法求解时采用与递归定义一致的自上而下的方式。
()
5.用贪心算法解0-1背包问题时,总能得到整体最优解。
()
6.利用贪心算法求解问题时,往往需要事先把问题集合按照一定原则进行排序,而活动安排问题即按活动结束时间的非减序进行排列的。
()
7.使用回溯法搜索问题的解空间树时,按照深度优先方式进行搜索,其间不受其他条件限制。
()
8.动态规划算法与分治法类似,其基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解,二者采用的都是自底向上的计算方式()
9.每个优化问题都是由目标函数和约束条件组成。
()
10.解空间树中,只有展开了所有子结点的结点才称为死结点。
()
四、简答题(4题×5分=20分)
1.按渐进阶从低到高的顺序排列以下表达式:n!,4n2,logn,3n,20n,2,n2/3。
2.已知矩阵A1,A2,A3,A4,A5,A6的维数分别是:5×10,10×3,3×12,12×5,5×50,50×6,求矩阵连乘A1×A2×A3×A4×A5×A6的最佳求积顺序。
3.写出贪心算法的基本设计思想。
4.分析说明分治法与动态规划法的联系与区别。
五、算法分析与设计题(2题*10分=20分)
1.对于下图使用Dijkstra算法求由顶点a到其他各个顶点的最短路径。
并给出求各个顶点对之间的最短路径的算法思想。
(12分)
2.对于如下图所示的旅行售货员问题,使用优先队列式分支限界法进行求解,试构造出描述其搜索过程的状态空间树,并说明活结点表的变化情况。