算法设计与分析c卷及答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法设计与分析试题C及答案
一.填空题:(每题4分,共20分)
1. 实例特征是指决定问题规模的那些因素.如两个n⨯n矩阵的相乘,则 n为实例特征. 2.估算程序运行时间的方法通常有两种,分别为和
。
(操作计数方法,统计程序的执行步数)
3.递归函数的两大基本要素是和
。
(递归方程和边界条件)
4.给定如下顺序搜索算法,则最坏时间复杂性是O(n)最好时间复杂性是O(1)。 int seqSearch(Type *a, int n, Type k){
for(int i=0;i } 5.采用回溯法求解问题时,通常采用两种策略(即两种剪枝函数)避免无效的搜索,它们分别是⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽和⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽⎽。 (约束函数,限界函数) 二.简答题:(每小题6分,共18分) 1.描述由分治法产生的子问题的基本特征 往往是原问题的较小模式,这就为使用递归技术提供了方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。这自然导致递归过程的产生。 2.在什么情况下可以应用贪心方法获得问题的最优解? a)问题满足贪心选择性质。即所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。 b)问题满足最优子结构性质。即所求问题的最优解包含其子问题的最优解。 3.算法设计通常有哪些方法?(至少列出4种)并指出哪些算法具有的某个共有性质。 答:算法设计方法有分治算法,贪心算法,动态规划算法,归纳算法,回溯算法,分支限界算法等。 分治算法,贪心算法,动态规划算法等算法都具有最优子结构性质。 4.对下图中的有向图,应用Dijkstra算法计算从源顶点4到其它顶点间最短路 径的过程。 三.算法分析解答题:(每题20分,共60分) 1. 设有n 个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,并且在同一 时间内只有一个活动能使用这一资源。 每个活动i 都有一个要求使用该资源的起始时 间s i 和一个结束时间f i ,且s i < f i 。 如果选择了活动i ,则它在半开时间区间 [s i , f i ) 内占用资源。若区间[s i , f i )与区间[s j , f j )不相交,则称活动 i 与活动 j 是相容的。 a ) 给出活动 i 与活动 j 是相容的定义。 b ) 描述求解活动安排问题的贪心算法,并分析算法的时间复杂性。 a )若区间[s i , f i )与区间[s j , f j )不相交,则称活动 i 与活动 j 是相容的。 b )void GreedySelector(int n, Type s[], Type f[], bool A[]) { sort(s[],f[],n);//按照活动的结束时间的非降序排列。 A[1]=true; int j=1; for (int i=2;i<=n;i++) { if (s[i]>=f[j]) { A[i]=true; j=i; } else A[i]=false; } } S u dist[1] dist[2] dist[3] dist[5] 初始 {4} - maxint maxint 6 16 1 {4,3} 3 36 maxint 6 16 2 {4,3,5} 5 36 41 6 16 3 {4,3,5,1} 1 36 41 6 16 4 {1,2,4,3,5} 2 16 41 6 16 算法中,如果活动按照其结束时间的非降序排列,则其时间复杂性是O(n);如果没有排序,则要考虑为n个活动排序所需要的时间,则其时间复杂性是O(nlogn)。 2.简述0-1背包问题和背包问题的差别,描述求解背包问题的贪心算法。 给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 0-1背包问题:在选择装入背包的物品时,对每种物品i只有2种选择,即装入背包或不装入背包。不能将物品i装入背包多次,也不能只装入部分的物品i。 背包问题:与0-1背包问题所不同的是在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包。 这2类问题都具有最优子结构性质,极为相似,但背包问题可以用贪心算法求解,而0-1背包问题却不能用贪心算法求解。 用贪心算法解背包问题的基本:首先计算每种物品单位重量的价值Vi/Wi,然后,依贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包。若将这种物品全部装入背包后,背包内的物品总重量未超过C,则选择单位重量价值次高的物品并尽可能多地装入背包。依此策略一直地进行下去,直到背包装满为止。 void Knapsack(int n,float M,float v[],float w[],float x[]){ Sort(n,v,w); //按物品单位重量的价值降序排序。 int i; for (i=1;i<=n;i++) x[i]=0; float c=M; for (i=1;i<=n;i++) { if (w[i]>c) break; x[i]=1; c-=w[i]; } if (i<=n) x[i]=c/w[i];//部分装入物品i。 } 3.在用回溯法求解0/1背包问题时, 1)假设n=4,画出该问题的解空间树; 2)用伪代码描述用于剪枝的限界函数。 3)假设n=5,物品的重量是W={10,8,9,12,11},价值P={18,12,3,8,20},背包的容量是40。试用你给出的限界函数计算i=3时的上界。 解答: