计算机算法试题(含答案)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机算法试题(含答案)
算法设计与分析试卷
一、填空题(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<n;r++)< p="">
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<="" p="">
依bi的非增序排序min{bπ(i),aπ(i+1)}≥
min{bπ(i+1),aπ(i)}
最小平均查找长度
综合题:20 min{ai+T(N-{i},bi)}(1=<i<=n) 0="" besti="i" m[i+1][j]="" p="" t<m[i][j]<="" thissum+="a[k]">
法一: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=<k<=j),且1<=i<=n
2+1<="J<=n。

</p" 2,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=wn 或则
m(n,j)=0 0<=j<wn< p="">
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.求下列函数的渐进表达式:
3n2+10n; n2/10+2n; 21+1/n; logn3; 10log3n
分析与解答:
3n2+10n=O(n2);
n2/10+2n=O(2n);
21+1/n=O(1);
logn3=O(logn);
10log3n=O(n)
2.讨论O(1)和O(2)的区别。

分析与解答:
根据符号O的定义易知O(1)=O(2)。

用O(1)或O(2)表示同一个函数时,差别仅在于其中的常数因子。

3.按渐近阶排列表达式
按照渐近阶从低到高的顺序排列以下表达式:4n 2,logn ,3n ,20n ,2,n 2/3。

又n!应该排在哪一位
分析与解答:
按渐近阶从低到高,函数排列顺序如下:2,logn ,n 2/3,20n ,4n 2,3n ,n !。

4.算法效率
(1)假设某算法在输入规模为n 时计算时间为T(n)=3*2n 。

在某台计算机上实现并完成该算法的时间为t 秒。

现有另一台计算机,其运行速度为第一台的64倍,那么在这台新机器上用同一算法在t 秒内能解输入规模为多大的问题
(2)若上述算法的计算时间改进为T(n)=n 2,其余条件不变,则在新机器上用t 秒时间能解输入规模为多大的问题
(3)若上述算法的计算时间进一步改进为T(n)=8,其余条件不变,那么在新机器上用t 秒时间能解输入规模为多大的问题
分析解答:
(1)设新机器用同一算法在t 秒内能解输入规模为n1的问题。

因此有:t=3*22=3*2n1/64,解得你n1=n+6。

(2)n12=64n 2n1=8n 。

(3)由于T(n)=常数,因此算法可解任意规模的问题。

5.阶乘函数
阶乘函数可递归地定义为:
int factorial(int n)
{
0)!1(1!>=-=n n n n n
if(n==0) return 1;
return n* factorial(n-1);
}
6.Fibonacci 数列
无穷数列1,1,2,3,5,8,13,21,34,55,……,称为Fibonacci 数列。

它可以递归地定义为:
请对这个无穷数列设计一个算法,并进行描述(自然语言描述和VC++描述).
第n 个Fibonacci 数可递归地计算如下:
int fibonacci (int n)
{
if (n <= 1) return 1;
returnfibonacci (n-1)+fibonacci (n-2);
}
7.循环赛日程表
设有n=2k
个运动员要进行兵乓球循环赛。

现在要设计一个满足以下要求的比赛日程表:
(1)每个选手必须与其他n-1个选手各赛一次;
(2)每个选手一天只能赛一次;
(3)循环赛一共进行n-1天。

请设计一个算法解决以上问题,并进行描述(自然语言和C++语言)
110)2()1(11)(>==??
-+-=n n n n F n F n F
按分治策略,将所有的选手分为两半,n个选手的比赛日程表就可以通过为n/2个选手设计的比赛日程表来决定。

递归地用对选手进行分割,直到只剩下2个选手时,比赛日程表的制定就变得很简单。

这时只要让这2个选手进行比赛就可以了。

8.有一批集装箱要装上一艘载重量为c的轮船。

其中集装箱i的重量为Wi。

最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。

分析回答以下两个问题:
(1)分析以上最优装载问题具有贪心选择性质
(2)用C++程序进行正确的算法描述
分析与解答:
(1)设集装箱已依其重量从小到大排序,(x1,x2,…,x n)是最有装载问题的一个最优解。

又设k=min{i|x i=1}。

易知,如果给定的最有装载问题有解,则1≤k≤n。

②当k=1时,(x1,x2,…,x n)是满足贪心选择性质的最优解。

②当k>1时,取y1=1;y k=0;y i=x i,1<i≤n,i≠k,则< p="">
因此,()是所给最有装载问题的可行解。

另一方面,由知,()是满足贪心选择性质的最优解。

所以,最优装载问题具有贪心
选择性质。

(2)最优装载问题可用贪心算法求解。

采用重量最轻者先装的贪心选择策略,可产生最优装载问题的最优解。

具体算法描述如下。

template
void Loading(int x[], Type w[], Type c, int n)
{
int *t = new int [n+1];
Sort(w, t, n);
for (int i = 1; i <= n; i++) x[i] = 0;
for (int i = 1; i <= n && w[t[i]] <= c; i++) {x[t[i]] = 1; c -= w[t[i]];}
}
</i≤n,i≠k,则<>
</wn<>
</k<=j),且1<=i<=n>
</i<=n)>
</n;r++)<>。

相关文档
最新文档