一、选择题
1.算法分析中,记号 O 表示(B),记号Ω标售(A),记号Θ表示(D)
A 渐进下界 B 渐进上界 C 非紧上界 D 紧渐进界 E 非紧下界
2.以下关于渐进记号的性质是正确的有:(A)
A f(n) =Θ(g(n)),g(n) =Θ(h(n))⇒f(n) =Θ(h(n))
B f(n) =O(g(n)),g(n) =O(h(n))⇒h(n) =O(f(n))
D f(n) = O(g(n))⇔g(n) = O(f(n))
C O(f(n))+O(g(n)) = O(min{f(n),g(n)})
3. 记号 O 的定义正确的是(A)。
A O(g(n)) = { f(n) | 存在正常数 c 和 n0 使得对所有 n≥n0 有:0≤ f(n) ≤ cg(n) };
B O(g(n)) = { f(n) | 存在正常数 c 和 n0 使得对所有 n≥n0 有:0≤ cg(n) ≤ f(n) };
C O(g(n)) = { f(n) | 对于任何正常数 c>0,存在正数和 n0 >0 使得对所有 n≥n0 有:0 ≤
f(n)0,存在正数和 n0 >0 使得对所有 n≥n0 有:0 ≤cg(n)
< f(n) };
4. 记号Ω的定义正确的是(B)。
A O(g(n)) = { f(n) | 存在正常数 c 和 n0 使得对所有 n≥n0 有:0≤ f(n) ≤ cg(n) };
B O(g(n)) = { f(n) | 存在正常数 c 和 n0 使得对所有 n≥n0 有:0≤ cg(n) ≤ f(n) };
C (g(n)) = { f(n) | 对于任何正常数 c>0,存在正数和 n0 >0 使得对所有 n≥n0 有:0 ≤
f(n)0,存在正数和 n0 >0 使得对所有 n≥n0 有:0 ≤cg(n)
< f(n) };
5. T(n)表示当输入规模为 n 时的算法效率,以下算法效率最优的是( C )
A T(n)= T(n – 1)+1,T(1)=1
B T(n)= 2n2
C T(n)= T(n/2)+1,T(1)=1
D T(n)= 3nlog2n
6. 动态规划算法的基本要素为(C)
A 最优子结构性质与贪心选择性质
B 重叠子问题性质与贪心选择性质
C 最优子结构性质与重叠子问题性质
D 预排序与递归调用
7.下列不是动态规划算法基本步骤的是( A )。
A 找出最优解的性质
C 算出最优解
8.能采用贪心算法求最优解的问题,一般具有的重要性质为:(A)
A 最优子结构性质与贪心选择性质
D 定义最优解
B 构造最优解
B 动态规划法
D 回溯法
B 构造最优解
D 最优子结构性质
B 重叠子问题性质与贪心选择性质
C 最优子结构性质与重叠子问题性质
D 预排序与递归调用
9.下面是贪心算法的基本要素的是( C )。
A 重叠子问题 B 构造最优解 C 贪心选择性质 D 定义最优解
10( D )是贪心算法与动态规划算法的共同点。
A 重叠子问题
C 贪心选择性质
11.使用分治法求解不需要满足的条件是(A )。
B 子问题不能够重复
A 子问题必须是一样的
C 子问题的解可以合并
D 原问题和子问题使用相同的方法解
12.实现循环赛日程表利用的算法是( A )。
A 分治策略
C 贪心法
13.使用分治法求解不需要满足的条件是(A )。
B 子问题不能够重复
A 子问题必须是一样的
C 子问题的解可以合并
D 原问题和子问题使用相同的方法解
14.下列算法中不能解决 0/1 背包问题的是(A )
A 贪心法 B 动态规划 C 回溯法 D 分支限界法
15.以下( C )不能不能在线性时间完成排序
A 计数排序 B 基数排序 C 堆排序 D 桶排序
16.下列哪一种算法是随机化算法( D )
A 贪心算法 B 回溯法 C 动态规划算法 D 舍伍德算法
17. 下列算法中通常以自底向上的方式求解最优解的( B )。 A 分治法 B 动态规
划法 C 贪心法 D 回溯法
18. n 个人拎着水桶在一个水龙头前面排队打水,水桶有大有小,水桶必须打满水,水流恒
定。如下 ( A ) 说法不正确?A
A 让水桶大的人先打水,可以使得每个人排队时间之和最小
B 让水桶小的人先打水,可以使得每个人排队时间之和最小
C 让水桶小的人先打水,在某个确定的时间 t 内,可以让尽可能多的人打上水
D 若要在尽可能短的时间内,n 个人都打完水,按照什么顺序其实都一样
19.哈弗曼编码的贪心算法所需的计算时间为 (
A O(n2n)
D O(n)
20.下面关于 NP 问题说法正确的是( B
A NP 问题都是不可能解决的问题
B P 类问题包含在 NP 类问题中
C NP 完全问题是 P 类问题的子集
B O(nlogn)
C O(2n)
B )。
)
C O(2n)
C 4k
D 2k
C O(2n)
D O(n)
B O(nlogn)
B O(nlogn)
D NP 类问题包含在 P 类问题中
21.背包问题贪心算法所需的计算时间为( B )
A O(n2n)
D O(n)
22.背包问题的回溯算法所需的计算时间为( A )
A O(n2n)
23.采用最大效益优先搜索方式的算法是( A )
A 分支界限发 B 动态规划法 C 贪心法 D 回溯法
24. 在棋盘覆盖问题中,对于 2k×2k 的特殊棋盘(有一个特殊方块),所需的 L 型骨牌的
个数是 ( A )
A ( 4k – 1)/3 B 2k /3
25. 下列随机算法中运行时有时候成功有时候失败的是(C )
A 数值概率算法 B 舍伍德算法 C 拉斯维加斯算法 D 蒙特卡罗算法
26. 实现大整数的乘法是利用的算法( C )。
A 贪心法 B 动态规划法 C 分治策略 D 回溯法
二、填空题
1.算法的复杂性有 时间 复杂性和 空间 复杂性之分。
2.矩阵连乘问题的算法可由 动态规划 设计实现。
3.从分治法的一般设计模式可以看出,用它设计出的程序一般是 递归算法 。
4.算法是由若干条指令组成的有穷序列,且要满足输入、输出、确定性和有限性四条性质。
5.快速排序算法的性能取决于 划分的对称性 。
6.使用二分搜索算法在 n 个有序元素表中搜索一个特定元素,在最佳情况下,搜索的时间复
杂性为 O( 1 ),在最坏情况下,搜索的时间复杂性为 O( logn )。
三、解答题
1. 给定已按升序排好序的 n 个元素 a[0:n-1],现要在这 n 个元素中找出一特定元素 x,返回
其在数组中的位置,如果未找到返回-1。 写出二分搜索的算法,并分析其时间复杂度
2. 分析最有搜索二叉树和 0/1 背包的时间复杂度
3. 试用动态规划算法实现最大子矩阵和问题:求 n×m 矩阵 A 的一个子矩阵,使其各元素
之各为最大
4 已知输入向量 a=(1,3,4,-2),给出用 FFT 的蝶形操作求输出向量 y 的结果,并分析出
FFT 的计算时间复杂度。
1.采用递归算法求递归方程 F(n)=F(n-1(+F(n-2),算法描述如下(就是递归 fibonacci!)
问:算法共需要进行多少次递归调用(算法中没引用 F(i)一次称为一次递归调用)。有没有
更好的算法来计算 F(n)?若有请描述算法并分析复杂度。
2.如下算法是否产生平均分布的随即置换?为什么?
Permute-With-All(A)
n←length(A)
for i←1 to n
swap(A[i],A[RANDOM(1,n)])
注:RANDOM(1,n)随机、等可能地返回整数 k,1≤k≤n
3. 能否在给定的 s[n]中判断是否存在两个数的和为 x,并且时间复杂度是 nlgn,如果可以写
出程序的伪代码,否则给出理由。
6. 活动选择问题
(1)递归的时间复杂度分析
(2)动态规划的时间复杂度分析
(3)写出一个更优的算法,并且对其进行时间复杂度分析
7. 多项式乘法问题
描述一个高效的算法来解决复数之间的多项式乘法,多项式的系数为复数,未知数也为复数。
并且对此进行时间复杂度分析。
算法 2013 考试题
郑 55
填空:
给一系列的函数,根据渐进性,从大到小排列 n^3/2,nlgn,lgn,e^n,n!,n^2
动归的两个性质
贪心的两个性质
1)NP 问题: 2)P 问题
面试问题 雇一个人的概率: ,雇 n 个人的概率:
复杂度分为: 和 ;动归是牺牲 复杂度换取 复杂度
使用二分搜索算法在 n 个有序元素表中搜索一个特定元素,在最佳情况下,搜索的时间复杂
性为 O( 1 ),在最坏情况下,搜索的时间复杂性为 O( logn )。
选择:
1 摊还排序是()情况下的()代价
A 最优 B 最坏 C 平均 D 最好
2 动态规划的设计思想是 a
(a)自底向上 (b)自上而下 (c)从左向右 (d)从右向左
3 贪心算法的设计思想是 b
(a)自底向上 (b)自上而下 (c)从左向右 (d)从右向左
4 以下哪一个更可能描述实际一个有效的算法 d
(a)
5 蝶形操作的设计思想是 a
(a)分治法 (b)贪心算法 (c)动态规划 (d)回溯
6 以下哪一个不是 NPC 问题
(a)单源最短路径 (b)巡回售货员问题 (c)布尔可满足性问题 (d)大数分解
7 以下哪个不是几何研究中的基本操作
(b)
(c)
(d)
(b)n^2
(c)nlgn
(b)n^2
(c)nlgn
(a)+ (b)— (c)× (d)/
8 哪个问题不能用贪心算法解决
(a)活动安排 (b)哈夫曼编码 (c)分数背包 (d)0-1 背包
9 哪个问题不能用动态规划解决 c
(a)分数背包 (b)0-1 背包 (c)最长简单路径 (d)最短简单路径
10 插入排序的最好时间复杂度是 a
(a)n
(d)lgn
11 归并排序的时间复杂度是 c
(a)n
(d)lgn
12 算法分析中,记号 O 表示(B),记号Ω标售(A),记号Θ表示(D)
A 渐进下界 B 渐进上界 C 非紧上界 D 紧渐进界 E 非紧下界
13.n 个人拎着水桶在一个水龙头前面排队打水,水桶有大有小,水桶必须打满水,水流恒定。
如下 ( A ) 说法不正确?A
A 让水桶大的人先打水,可以使得每个人排队时间之和最小
B 让水桶小的人先打水,可以使得每个人排队时间之和最小
C 让水桶小的人先打水,在某个确定的时间 t 内,可以让尽可能多的人打上水
D 若要在尽可能短的时间内,n 个人都打完水,按照什么顺序其实都一样
14.哈弗曼编码的贪心算法所需的计算时间为 (
A O(n2n)
D O(n)
15.下面关于 NP 问题说法正确的是( B
A NP 问题都是不可能解决的问题
B P 类问题包含在 NP 类问题中
C NP 完全问题是 P 类问题的子集
D NP 类问题包含在 P 类问题中
大题
B O(nlogn)
C O(2n)
B )。
)
四路归并排序:分解时分成四个,合并等其他步骤与二路归并相似,请写出核心算法,并分
析时间复杂度。
1. 矩阵链乘积的递归算法
n=1
T(n)= 1
n>=2
请详细分析该算法的时间复杂度
1. 给出最优二叉搜索树的程序代码和 p,q 概率
根据概率 1)求 e,w,root,2)画出二叉树的结构 3)请说出 root[i,j]有什么意义
(见 3621 大班试卷影印版的第五题)
1. FFt 蝶形操作 见 3621 大班试卷的影印版第九题
2. 字符串自动机构造,见书
2006-2007 学年第二学期《计算机算法设计与分析》试题
院系:软件学院
专业:软件工程
年级:2004 级
一.简答题(共 10 分)
略
f(n)=3n,g(n)=2n
f(n)=log n + 5,g(n)=log n2
f(n)=log n,g(n)=
二.计算题(35 分)
1.(6 分) 对下列各组函数 f(n)和 g(n),确定 f(n)=O(g(n))或 f(n)=Ω(g(n))或 f(n)=θ(g(n))。
(1)
(2)
(3)
答:
(1)
(2)
(3)
f(n) = Ω(g(n))
f(n) = θ(g(n))
f(n) = O(g(n))
(2 分)
(2 分)
(2 分)
2.(8分)采用动态规划策略,计算 a={5,-3,7,-4,-5,9,-2,10,-3,2}的最大子段和,并给出
这个最大子段和的起始下标和终止下标。[设数组 a 中的元素下标从1开始。]要求给出过
程。
答:
b[1]=5;
b[2]=max{b[1]+a[2],a[2]}=max{2,-3}=2
b[3]=max{b[2]+a[3],a[3]}=max{9,7}=9
b[4]=max{b[3]+a[4],a[4]}=max{5,-4}=5
b[5]=max{b[4]+a[5],a[5]}=max{0,-5}=0
b[6]=max{b[5]+a[6],a[6]}=max{9,9}=9
b[7]=max{b[6]+a[7],a[7]}=max{7,-2}=7
b[8]=max{b[7]+a[8],a[8]}=max{17,10}=17
b[9]=max{b[8]+a[9],a[9]}=max{14,-3}=14
b[10]=max{b[9]+a[10],a[10]}=max{16,2}=16
(上述每两行1分,共5分)
最大子段和为 17(1 分)
(若数组下标从1开始)起始下标:6(1分),终止下标:8(1分)
(若数组下标从0开始)起始下标:5(0.5 分),终止下标:7(0.5 分)
3.(11 分)设有3件工作分配给3个人,将工作 i 分配给第 j 个人所花的费用为 Cij,现
将为每一个人都分配1件不同的工作,并使总费用达到最小。设:
要求:
(1)画出该问题的解空间树;(6分)
(2)写出该问题的剪枝策略(限界条件);(1 分)
(3)按回溯法搜索解空间树,并利用剪枝策略对应该剪掉的子树打´;(2分)
(4)最终给出该问题的最优值和最优解。(2分)
答:
(1)
1
2
2
3
3
1
3
1
1
1
2
2
2
3
3
3
2
3
1
2
1
16
16
╳
9
9
9
╳
9
╳
╳
(每个分枝 1 分,或者是每层 2 分,共 6 分)
(2)当耗费大于等于当前最优值时,剪枝。(1 分)
(3)见上图。(每 2 个╳ 1 分,共 2 分)
(4)最优值: 9 (1 分)
最优解:2,1,3
4.(8分)给定两个序列 X=
,Y=,请采用动态规划策略求出其
最长公共子序列。要求给出过程。
2
3
答:
j 0
1
yi B D
i
0 xi
0
0
0
1 A 0
2 B 0
1
1
3 C 0
4 B 0
1
0
0
1
1
1
4
C
0
0
1
2
2
5
A
0
1
1
2
2
B
0
1
2
2
3
5 A 0
1
2
2
2
3
(上述表内每一行一分,共6分)
最长公共子序列为
(2分)
5.(2 分)考虑 n=3 时的 0-1 背包问题的实例:W={15,10,10},P={50,30,30},c=20。当 x[1]=1,
x[2]=0 时,请计算 Bound(2)。
答:
Bound(3)=50+5/10 * 20 = 65
(2 分)
三、算法填空题(共 10 分,每空 2 分)
给定 n 种物品和一个背包,物品 i 的重量是 w[i], 其价值是 p[i], 背包的容量为 c。设物品已
按单位重量价值递减的次序排序。每种物品不可以装入背包多次,但可以装入部分的物品 i。
求解背包问题的贪心算法如下:
float Knapsack (float x[ ], float w[ ], float p[ ],float c, int n)
{ float maxsum=
// maxsum 表示装进包的物品价值总和
for ( int i=1;i<=n; i++) x[i]=0 // x[i]=0 表示第 i 个物品未装进包
for (
;
)
)
if(
{ x[i] =1;
;
maxsum+=
c- = w[i];
}
else break;
;}
if (c>0) {x[i]=c/w[i];
return maxsum;
}
答:(共5个空,每空 2 分,总计 10 分)
0
int i=1;i<=n;i++
w[i]<=C
p[i]
maxsum+ = p[i] * c / w[i]
四、算法设计及分析题(共 45 分)
1.(20 分)请用分治策略设计递归的二分检索算法,并分析其时间复杂性(要求给出每个
阶段所花的时间,在此基础上列出递归方程,并求出其解的渐进阶)。
答:(此题解法不唯一)