算法设计与分析c卷及答案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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时的上界。

解答:

相关文档
最新文档