《计算机算法设计与分析》答案
- 格式:doc
- 大小:96.00 KB
- 文档页数:5
中国科学院研究生院软件学院大连教学点
- 1 - 《计算机算法设计与分析》试卷 考试时间120分钟
2002年-2003年第二学期
学号 姓名 成绩
一、阐述题
1. 请说明算法的五个基本特性,并进行简要的分析(5分)
答:算法的五个基本特性如下:
① 确定性 算法的每一种运算必须要有确切的定义,即每一种运算应该执行何种动作必须是相当清楚的、无二义性的。
② 能行性 一个算法是能行的是指算法中有待实现的运算都是基本的运算,每种运算至少在原理上能由人用纸和笔在有限时间内完成。
③ 输入 一个算法有0个或多个输人,这些输人是在算法开始之前给出的量,它取自特定的对象集合。
④ 输出 一个算法产生一个或多个输出,这些输出是同输人有某种特定关系的量。
⑤ 有穷性 一个算法总是在执行了有穷步的运算之后能够终止,且每一步都可在有穷时间内完成。这里的有穷的概念不是纯数学的,而是在实际上是合理的,可以接受的。
凡是算法,都必须满足以上五条特性。只满足前四条特性的一组规则不能称为算法,只能叫做计算过程。
2. 若森林非空,请按照森林和树相互递归的定义,阐述森林的两种遍历的方法。(10分)
答:森林是由m(m≥0)棵互不相交的树构成的集合。对树中的每一个结点而言,其子树的集合即为森林。所以,森林和树是可以相互递归定义的。
对于一个非空的森林F=(T1,T2,…,Tm),因为至少存在一棵树,不妨假设为T1,则森林F可以分解成T1和由T2,…,Tm构成的森林。于是,可得到森林的两种遍历算法。
① 先序遍历森林
若森林非空,则可按下述规则遍历这个森林:
(1) 访问树中第一棵树的根结点;
(2) 先序遍历第一棵中根结点的所有子树构成的森林;
(3) 先序遍历除去第一棵树外剩下的树构成的森林。
② 中序遍历森林
若森林非空,则可按下述规则遍历这个森林:
(1) 中序遍历第一棵中根结点的所有子树构成的森林;
(2) 访问树中第一棵树的根结点;
(3) 中序遍历除去第一棵树外剩下的树构成的森林。
二、计算题
1. 考虑下列三个函数 (5分)
填充两个3阶距阵О(i,j),Ω(i,j)。其中,О(i,j),Ω(i,j)的定义分别如下:
Y,fi(n)=О(fj(n)) Y,fi(n)=Ω(fj(n))
О(i,j)= Ω(i,j)= 1≤i,j≤3 N,else ; N,else , 。
n , n为非负奇数
f1(n)=
n , n为正偶数 n , 0≤n≤100
f2(n)=
n , n>100 f3(n)=n 2
3 2 1.5
, , , 中国科学院研究生院软件学院大连教学点
- 2 - 请将答案填写在下面的方框中。
2. 设W=(5,7,10,12,15,18,20)和M=35,使用过程SumOfSub找出W中使得和数等于M的全部子集并画出所生成的部分状态空间树。 (5分)
答:
设状态空间树的结点形式为由s,k,r构成的三元组,其中s用以记录从根结点到当前结点的路径的加权和(解向量X(i)的取值为左分枝取‘1’,右分枝取‘0’),k表示结点的序号(也是结点的层次号),r表示剩余权值的和。由于给定的权值序列是有序的,所以,将要使用的限界函数是
Bk(X(1),…,X(k))=true 当且仅当
K n k
∑W(i)X(i) + ∑W(i)≥ M 且 ∑W(i)X(i) + W(k+1) ≤ M
i=1 i=k+1 i=1
K-1 n
定义s =∑W(i)X(i) ; r = ∑W(i)
i=1 i=k
使用过程SumOfSub找出W中使得和数等于M的全部子集的部分状态空间树如下:
О(i,j) f1 f2 f3
f1
f2
f3 Ω(i,j) f1 f2 f3
f1
f2
f3 Y
Y
Y N
Y Y
Y N
N Y Y
N
N Y
N
Y
Y
Y
0,1,87
0,3,65
0,3,65
0,3,65 0,3,65
0,4,50
0,4,50
0,1,87 0,1,87 0,1,87 0,1,87 0,1,87 0,3,65 0,4,50 0,4,50 0,4,50 0,4,50 0,1,87 0,3,65
0,4,50
0,1,87 0,1,87 5,2,82 0,2,82
12,3,75 5,3,75 7,3,75 0,3,75 X(1) =1
0,3,65 0,3,65
0,4,50 0,4,50 中国科学院研究生院软件学院大连教学点
- 3 - 三、证明题
1. 在已知根R(i,j)(0≤i<j≤n)的情况下写一个构造最优二分检索树T的算法。
证明这样的树能在О(n)时间内构造出来。 (10分)
答:R(i,j)(0≤i<j≤n)中记录的是构造最优二分检索树Tij时满足最小成本的k值。
根据最优二分检索树的定义知道,给定的n个标识符是单调有序的(无重复)。
若Tij的根为ak,则aK的左子树上的标识符是{ai,ai+1,,ak-1},而则aK的右子树上的标识符是{ak+1,ak+2,,aj},且当i=j时,Tij是外部结点。
根据上述思路,可依据如下算法构造一棵最优二分检索树。
采用二叉链表作为存储结构,结点的定义如下:
typedef struct OBSTNode {
char data; //标识符类型,可以是字符串
struct OBSTNode *lchild, *rchild; //左右孩子结点的指针
} OBSTNode,* OBSTree
Void OBSTCreate(OBSTree P, int i,int j) {
int k; OBSTree S;
if (i〈〉j) {
k=r[i][j]; //数组R[][]是全局变量
new(S); //产生一个新的结点,让S指向该结点
S->data=a[k]; //数据A[]是全局变量
If(!P) {P=S}; //产生根结点
Else {
if(S->data < P->data) { //新产生的结点是P结点的左孩子
P->lchild=S; P = S;}
else { //新产生的结点是P结点的右孩子
P->rchild=S; P = S;}
} ;
OBSTCreate(P,i,k-1);
OBSTCreate(P,k+1,j);
}
}// OBSTCreate
main OBST0(OBSTree &T,int n) {
//数组A[]和R[][]是全局变量
if(n<1) return error;
OBSTCreate(T,0,n);
}
时间复杂度证明
T(n) = T(k) + T(n-k) + c c为常数 0≤k≤n
= …
= (n+1)*T(0) + n*c
因为T(0)=0
所以T(n)= cn
即,T(n)= ○(n)
证毕
中国科学院研究生院软件学院大连教学点
- 4 -
2.折半查找过程的判定树上,定义根结点到每个内部结点(查找成功的结点)的路径长度之和为内部路径长度,记为I;定义根结点到每个外部结点(查找不成功的结点)的路径长度之和外部路径长度,记为E。
试证明:具有n个内部结点的这样的判定树,满足E = I + 2n 。 (10分)
3. 证明该等式不成立n32n+6n23n=Ο(n32n)。 (5分)
四、算法题
1. 对于下表左部给定的算法,计算该算法的时间渐进复杂性。 (10分)
语句 s/e 频率 总步数
bool Bubble(elemTyoe a[],int n) {
//把a[0:n-1]中的最大元素冒泡至最后
bool swapped = false; //尚未发生交换
for(int i = 0; i
if(a[i]>a[i+1]) {
Swap(a[i],a[i+1]);
swapped = true; //发生了交换
};
return swapped;
}
void BubbleSort(elemTyoe a[],int n) {
//及时终止的冒泡排序算法
for(int i = n; i>1 && Bubble(a,i);i--);
}
总计
2. 下面的算法是依据分治策略设计出来的,仔细阅读该算法思路,在划线处填写适当的语句以完成整个算法。 (15分)
问题:编写出函数reverse(s)的递归程序,使字符串s反序。
算法思路:令指针i,j分别指示字符串s的头、尾字符,然后交换i,j分别指示的字符,并修改对i指针做加1操作;对j指针做减1操作,直到i≥j。
#include
void reverse(char s[])
{
void reverser(char s[],int i,int len);
reverser(s, ① ,strlen(s));
}
void reverser(char s[],int i,int len)
{
int c,j;
j = ② ;
if (i