《算法设计与分析》复习题1
一、填空:
1.算法是指解决问题的方法或过程,算法所描述的指令序列必须满足下列性质○1、○2、○3、○4、○5。
2.程序是算法用某种程序设计语言的具体实现,程序可以不满足算法的○1性质。
所以像操作系统这样的软件○2(是/不是)算法。
3.抽象数据类型是算法设计的重要概念。
严格地讲,它是算法的一个○1同定义在该模型上并作为○2的一组运算。
4.算法的复杂性是算法运行所需要的计算机资源的量。
这个量集中反映算法的效率,通常用C=F(N、I、A)表示,其中C、N、I、A所代表的含义是什么?
5.设f(N)和g(N)是定义在正数集上的正函数,当N充分大时,
f(N)=O(g(N))表示g(N)是f(N)的一个○1;
f(N)=Ω(g(N))表示g(N)是f(N)的一个○2;
f(N)=θ(g(N))表示g(N)是f(N)③。
6.直接或间接地调用自身的算法称为○1
的计算公式外,还必须提供○2初始值。
7.动态规划算法与分治法的基本思想都是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
它们的主要区别是分治法求解时,对有些子问题会○1,而动态规划法采用○2避免子问题重复计算。
8.贪心算法与动态规划算法都要求问题具有最优子结构性质,这是两类算法的一个共同点。
但是否具有最优子结构的问题,用贪心算法和动态规划算法都可以得到最优解?举例说明。
9.下面的说法错误的是________。
a.算法原地工作的含义是指不需要任何额外的辅助空间;
b.在相同的规模n下,时间复杂度为O(n)的算法在时间上总是优于时
间复杂度为O(2n)的算法。
c.所谓时间复杂度是指最坏情况下,估算算法执行时间的一个上界;
d.同一算法,实现语言的级别越高,执行效率越低。
10.回朔法的求解目标是找出解空间中满足约束条件的○1
的求解目标则是找出满足约束条件的○2或在某种意义下的最优解。
11.回朔法以○1优先的方式搜索解空间树,而分支限界法则以○2优先或以○3优先的方式搜索解空间树。
12.按从活结点表中选择下一扩展结点的不同方式,可将分支限界法分为○1分支限界法和○2分支限界法。
13.○1假设某算法在输入规模为n时的计算时间为T(n)=3×2n,在某台计算机上实现并完成该算法的时间为t秒,现另有一台计算机,其运行速度
为第一台的64倍,那么在这台新机器上用同一算法在t秒内能输入规
模多大的问题?
○2若上述算法的计算时间改进为T(n)=n2,其余条件不变,则在新机器
上用t秒时间能解输入规模多大的问题?
○3在上述算法的计算时间进一步改进为T(n)=8,其余条件不变,那么在
新机器上用t秒时间能解输入规模多大的问题?
二、
1.设n是偶数,试计算运行下列程序段后m的值,并给出该程序的时间复杂度。
int m=0
for(int i=1;i<=n;i+ +)
for(int j=2*i;j<=n;j+ +)
m=m+1;
2.计算机执行下面的语句时,语句s的执行次数为多少?
for(int i=1;i<n-1;i+ +)
for( j=n;j>=i;j- -)
s;
3.给出下列程序段中带标号的语句○1~○5执行的频度,利用O记号将以下程序段在最坏情况下的运行时间表示为n的函数。
for(int i=1;i<=n;i+ +) ○1
for(int j=1;j<=n;j+ +) ○2
{
c[i][j]=0; ○3
for(int k=1;k<=n;k+ +) ○4
c[i][j]= c[i][j]+ a[i][k]* b[k][j]; ○5
}
4.a. { if ((Q.rear+1)%Maxsize= = Q.front)
return ERROR;
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%Maxsize;
return ok;
}
该算法实现什么功能?
b. { if (S.top-S.base>= S.stacksize )
{ S.base=追加分配空间;
S.top= S.base + S.stacksize;
S.stacksize+=stackincrement;
}
*S.tope++=e;
return ok;
}
该算法实现什么功能?
c. { for(int i=0;i<S.length && i<T.length; + +i )
if (S.ch[i]!=T.ch[i] return (S.ch[i]- T.ch[i]);
return (S.length- T.length);
}
该算法实现什么功能?
5. 说明下列程序的功能:
private static int partion(int p,int r)
{int i=p, j=r+1;
Comparable x=a[p];
while(true){
while(a[++i] compareTo(x)<0;
while(a[--j] compareTo(x)>0;
if (i>=j) break;
Mymath.swap(a,i,j)
}
a[p]=a[j];
a[j]=x;
return j;
}
6.已知Fibonacci数列如下:
1,1,2,3,5,8,13,21,……
请写出其递归关系式。
三、
1.假设合并排序算法的抽象定义为:
Public static void mergeSort(Comparable a[], int left, int right)
{ }
其中使用的合并及拷贝方法分别定义为:
Public static void merge(Comparable []c, Comparable []d,int l,int m,int r) { }
Public static void copy(Comparable []c, Comparable []d, int i, int j) { }
请补充完善递归方式实现的合并排序的细节。
2.已知整数划分问题的递归式如下:
1 n=1或m=1
q(n,m)= q(n,n) n<m
1+q(n,n-1) n=m
q(n,m-1)+q(n-m,m) n>m>1
请设计计算q(n,m) 的递归算法。
四、
1.设所给0-1背包问题的子问题
(其中物品i 的重量是wi ,其价值为vi )
的最优值为m(i ,j),即m(i ,j)是背包容量为j ,可选择物品为i ,i+1,…,n 时0-1背包问题的最优值。
请建立m(i,j)的递归式。
2.已知有7个独立作业{1,2,3,4,5,6,7}由3台机器M1,M2和M3加工处理。
各作业所需的处理时间分别为{2,14,4,16,6,5,3}。
请给出利用贪心算法实现多机调度问题的步骤。
3.假设有n=3时,0-1背包问题的一个实例为:w=[16,15,15],p=[45,25,25],c=30。
请画出解空间树,利用队列式分支限界法表示活结点进出队列的过程并给出最优值。
4.请完善下面用回溯法搜索子集树和排列树的一般算法描述: 子集树:
V oid backtrack(int t) {
If (t>n) output(x) Else
For(int i=____;__________;i++) {___________;
If (constraint(t)&&bound(t)) backtrack(t+1); } } 排列树:
V oid backtrack(int t) {
∑=n
i
k k
k x v max ⎪⎩⎪⎨⎧≤≤∈≤∑=n k i x j
x w k n
i k k k },1,0{
If (t>n) output(x)
Else
For(int i=____;_________;i++)
{______________;
If (constraint(t)&&bound(t)) backtrack(t+1); ______________;
}
}。