计算机算法试题含答案
算法设计与分析试卷
一、填空题(20分,每空2分)
1、算法的性质包括输入、输出、___、有限性。
2、动态规划算法的基本思想就将待求问题_____、先求解子问题,然后从这些子问题的解得到原问题的解。
3、设计动态规划算法的4个步骤:
(1)找出____,并刻画其结构特征。
(2)_______。
(3)_______。
(4)根据计算最优值得到的信息,_______。
4、流水作业调度问题的johnson算法:
(1)令N1=___,N2={i|ai>=bj};
(2)将N1中作业依ai的___。
π,使得作业、对于流水作业高度问题,必存在一个最优调度5π(i)和π(i+1)满足Johnson不等式_____。
6、最优二叉搜索树即是___的二叉搜索树。
二、综合题(50分)
1、当(a1,a2,a3,a4,a5,a6)=(-2,11,-4,13,-5,-2)时,最大子段和为∑ak(2<=k<=4)____(5分)
2、由流水作业调度问题的最优子结构性质可知,T(N,0)=______(5分)
3、最大子段和问题的简单算法(10分)
int maxsum(int n,int *a,int & bestj)
{
intsum=0;
for (int i=1;i<=n;i++)
for (int j=i;j<=n;j++)
int thissum=0;
for(int k=i;k<=j;k++)_____;
if(thissum>sum){
sum=thissum;
______;
bestj=j;}
}
return sum;
}
4、设计最优二叉搜索树问题的动态规划算法OptimalBinarysearchTree (15分)
Void OptimalBinarysearchTree(int a,int n,int * * m, int * * w)
{
for(int i=0;i<=n;i++) {w[i+1][i]=a[i]; m[i+1][i]=____;}
for(int r=0;r for(int i=1;i<=n-r;i++){ int j=i+r; w[i][j]=w[i][j-1]+a[j]+b[j]; m[i][j]=______; s[i][j]=i; for(int k=i+1;k<=j;k++){ int t=m[i][k-1]+m[k+1][j]; if(_____) {m[i][j]=t; s[i][j]=k;} } m[i][j]=t; s[i][j]=k;} } 5、设n=4, (a1,a2,a3,a4)=(3,4,8,10), (b1,b2,b3,b4)=(6,2,9,15) 用两种方法求4个作业的最优调度方案并计算其最优值(15分) 三、简答题(30分) 1、将所给定序列a[1:n]分为长度相等的两段a[1:n/2]和a[n/2+1:n],分别求出这两段的最大子段和,则a[1:n]的最大子段和有哪三种情形(10分) 答: 2、由0——1背包问题的最优子结构性质,可以对m(i,j)建立怎样的递归式(10分) 3、0——1背包求最优值的步骤分为哪几步(10分) 参考答案: 填空题:确定性分解成若干个子问题最优解的性质递归地定义最优值以自底向上的方式计算出最优值 构造最优解{i|ai 综合题:20 min{ai+T(N-{i},bi)}(1= thissum+=a[k] besti=i 0 m[i+1][j] t 法一:min(ai,bj)<=min(aj,bi) 因为min(a1,b2)<=min(a2,b1) 所以1→2 (先1后2) 由min(a1,b3)<=min(a3,b1) 得1→3 (先1后3) 同理可得:最后为1→3→4→2 法二:johnson算法思想 N1={1,3,4} N2={2} N11={1,3,4} N12={2} 所以N11→N12 得:1→3→4→2 简答题:1 、(1)a[1:n]的最大子段和与a[1:n/2]的最大子段和相同。. (2)a[1:n]的最大子段和与的最大子段a[n/2+1:n]和相同。 (3)a[1:n]的最大子段和为∑ak(i= 1<=i<=n/2,n/2+1<=J<=n。 2、(1)m(i,j)=max{m(i+1,j),m(i+1,j-wi)+ui} (j>=wi) 或则m(i,j)= m(i+1,j) (0<=j (2)m(n,j)=un j>=wn 或则 m(n,j)=0 0<=j 3、(1)、p[n+1]={(0,0)} (2)、由p[i+1]→q[i+1], q[i+1]=p[i+1]⊕(wi,vi) (3)、Mij=p[i+1]∪q[i+1] Pi=Mij——其中的受控点=p[i+1]∪q[i+1]——其中的受控(4)、重复(2)-(3)直到求出P[1] 1.在一个算法中调用另一个算法时,系统需在运行被调用算法之前完成哪些工作同时从被调用算法返回调用算法需完成哪些工作 答:在一个算法中调用另一算法时,系统需在运行被调用算法之前先完成三件事: (1)将所有实参指针、返回地址等信息传递给被调用算法; (2)为被调用算法的局部变量分配存储区; (3)将控制转移到被调用算法的入口。 在从被调用算法返回调用算法时需完成三件事: (1)保存被调用算法的计算结果; (2)释放分配给被调用算法的数据区; (3)依照被调用算法保存的返回地址将控制转移到调用算法。 动态规划算法求解问题的步骤2. 答:动态规划法适用于解最优化问题。通常可以按以下4个步骤设计: (1)找出最优解的性质,并刻画其结构特征; (2)递归地定义最优值; (3)以自底向上的方式计算最优值; (4)根据计算最优值时得到的信息构造最优解。 3.线性规划法中单纯形算法的基本步骤 答:步骤一选入基变量。 步骤二选离基变量。 步骤三做转轴变换。 步骤四转步骤一。 4.分治法的基本思想和原理是什么 答:分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解这些子问题,然后将各子问题的解合并得到原问题的解。 5.利用回溯法解决问题包含哪些步骤 答:利用回溯法解题常包含以下3步骤: (1)针对所给问题,定义问题的解空间; (2)确定易于搜索的解空间结构; (3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。 五分析题(36分) 1.求下列函数的渐进表达式: 22n3n ; 10log33n; 21+1+10n; n/n; logn/10+2分析与解答: 22); +10n=O(n3n 2nn); /10+2=O(2n21+1/n=O(1); 3=O(logn); logn n=O(n)10log3 的区别。O(2)和O(1).讨论2. 分析与解答: 根据符号O的定义易知O(1)=O(2)。用O(1)或O(2)表示同一个函数时,差别仅在于其中的常数因子。 3.按渐近阶排列表达式 2n2/3。又n!,2,n按照渐近阶从低到高的顺序排列以下表达式:4nlogn,,3应该排在,20n哪一位 分析与解答: 2/32n,n!,n3。4n,20n,,按渐近阶从低到高,函数排列顺序如下:2,logn4.算法效率 n。在某台计算机上实现并完成该算法时计算时间为T(n)=3*2(1)假设某算法在输入规模为n的时间为t秒。现有另一台计算机,其运行速度为第一台的64倍,那么在这台新机器上用同一算法在t秒内能解输入规模为多大的问题 2,其余条件不变,则在新机器上用t秒时间能解输(2)若上述算法的计算时间改进为T(n)=n入规模为多大的问题 (3)若上述算法的计算时间进一步改进为T(n)=8,其余条件不变,那么在新机器上用t秒时间能解输入规模为多大的问题 分析解答: 2n1/64,解=3*2t秒内能解输入规模为n1的问题。因此有:t=3*2(1)设新机器用同一算法在得你n1=n+6。22n1=8n(2)n1。=64n (3)由于T(n)=常数,因此算法可解任意规模的问题。 5.阶乘函数 阶乘函数可递归地定义为: n??01n!??nnn?)!(0?1? int factorial(int n) { if(n==0) return 1; return n* factorial(n-1); } 数列Fibonacci.6. 无穷数列1,1,2,3,5,8,13,21,34,55,……,称为Fibonacci数列。它可以递归地定义为: n??10?Fnn?11)?(??FnFnn?1?1)?2(()?? 请对这个无穷数列设计一个算法,并进行描述(自然语言描述和VC++描述). 第n个Fibonacci数可递归地计算如下: int fibonacci(int n) { if (n <= 1) return 1; returnfibonacci(n-1)+fibonacci(n-2); } 7.循环赛日程表 k个运动员要进行兵乓球循环赛。现在要设计一个满足以下要求的比赛日程表:n=2设有(1)每个选手必须与其他n-1个选手各赛一次; (2)每个选手一天只能赛一次; (3)循环赛一共进行n-1天。 请设计一个算法解决以上问题,并进行描述(自然语言和C++语言) 按分治策略,将所有的选手分为两半,n个选手的比赛日程表就可以通过为n/2个选手设计的比赛日程表来决定。递归地用对选手进行分割,直到只剩下2个选手时,比赛日程表的制定就变得