第一章随堂练习
1. (533)下面哪一个不是算法的先修课程?
A.程序设计语言
B.高等数学
C.数据结构
D.操作系统
2. (540)欧几里得算法主要用来求( )。
A.最大公约数
B.最小公倍数
C.两数相乘的积
D.两数相除的余数
第一章1-9
#include <iostream>
using namespace std;
long long factorial (int n) {
if(n==0) return 1;
return n*factorial(n-1);
}
int main() {
int n;
cin >> n;
if(n<0) {
cout << "error";
} else {
cout << factorial(n);
}
return 0;
}
第二章2-8
1. (539)2-8 (4)
m=0;
for (int i=0;i<n;i++)
for (int j=2*I;j<=n;j++)
m++;
渐近时间复杂度是( )?
A.O(sqrt(n))
B.O(logn)
C.O(n)
D.O(n^2)
2. (538)2-8 (3)
x=n; y=0;
while (x>=(y+1)(y+1)) y++;
渐近时间复杂度为( )?
A.O(logn)
B.O(sqrt(n))
C.O(n)
D.O(nlogn)
3. (537)2-8 (2)
for (int i=1;i<=n;i++)
for(int j=1,j<=i;j++)
for(int k=1;k<=j;k++)
x++;
渐近时间复杂度为( )?
A.O(n)
B.O(n^2)
C.O(n^3)
D.O(n^4)
4. (536)2-8(1)
i=1; x=0;
do{
x++; i=2*i;
} while i<n;
渐近时间复杂度为( )?
A.O(logn)
B.O(n^2)
C.O(nlogn)
D.O(n)
第二章随堂练习
1. (535)以下( )不是多项式时间算法的渐近时间复杂度。
A.O(logn)
B.O(nlogn)
C.O(n!)
D.O(n^100)
2. 下面程序段的渐近时间复杂度是O( n^2 或者 n2 或者 O(n^2) 或者 O(n^2) )
for (int i=1;i<=n;i++)
for (int j=1;j<=i/2;j++)
x++;
第五章随堂练习1
1. (554)关于对半搜索算法,下列说法( )是错误的。
A.对半搜索二叉判定树中右子树的结点数和左子树的结点数相等。
B.对半搜索二叉判定树中右子树的结点数可能比左子树的结点数多1。
C.对半搜索是最优算法。
D.对半搜索的失败时间复杂度和树高相关。
2. (552)斯特拉森矩阵乘法通过减少( )来降低时间复杂度。
A.子矩阵相乘次数
B.子矩阵相加次数
C.子矩阵分解的个数
D.子矩阵的规模
3. (549)有7名同学参加游泳比赛,学号分别是5,8,11,24,33,39,45,用对半搜索查找学号33的同学的过程中,依次访问到的学号是 ( ) 。
A.11,24, 33
B.24, 33
C.11, 45, 33
D.24, 39, 33
4. (548)分治法的设计思想是将一个难以直接解决的大问题分割成规模较小的子问题,分别解决子问题,最后将子问题的解组合起来形成原问题的解。这要求原问题和子问题( )。
A.问题规模相同,问题性质相同
B.问题规模相同,问题性质不同
C.问题规模不同,问题性质相同
D.问题规模不同,问题性质不同
5.出于( 平衡子问题 )的思想,通常分治法在分解原问题时形成若干子问题,这些子问题的规模都大致相同。
第五章随堂练习2
1. (557)以下排序算法中,( )算法在最坏情况下的时间复杂度为O(nlogn)。
A.直接插入排序
B.冒泡排序
C.快速排序
D.两路合并排序
2. (556)下列问题中,( )不适合采用分治法进行求解。
A.矩阵相乘问题
B.求最大最小元
C.排序问题
D.最长公共子序列
3. (555)快速排序中,每趟分划操作结束后,原序列中的元素以主元为轴心重新排列,主元左侧子序列中所有元素都( )主元。
A.小于
B.大于
C.不大于
D.不小于
4. (553)下列排序算法中是最优算法的是( )。
A.直接插入排序
B.两路合并排序
C.快速排序
D.冒泡排序
5. (551)两路合并排序算法的空间复杂度为( )。
A.O(logn)
B.O(n)
C.O(nlogn)
D.O(n^2)
6. (550)快速排序的最坏情况时间复杂度为是( )。
A.O(n^3)
B.O(n^2)
C.O(nlogn)
D.O(n)
第五章5-8
#include <iostream>
using namespace std;
int arr[] = {1,2,5,7,9,11 };
int length = sizeof(arr)/sizeof(arr[0]);
int TSearch(int left,int right,int n) {
if(left<right) {
int index = (left+right)/3;
if(arr[index]>n) {
return TSearch(left,index-1,n);
} else if(arr[index]==n) {
return index;
} else if(arr[index]<n && arr[2*index]>n) {
return TSearch(index+1,2*index-1,n);
} else if(arr[2*index]==n) {
return 2*index;
} else if(arr[2*index]<n) {
return TSearch(2*index+1,right,n);
}
}else if(left==right){
return arr[left]==n?left:-1;
}
return -1;
}
int main() {
int n;
cin >> n;
cout << TSearch(0,length-1,n);
return 0;
}
第六章贪心法随堂测试1
1. (562)由若干权值分别为(1,2,3,3,5,6,7,9)的结点,按照贪心准则构造的3路最佳合并树的带权外路径长度为( )。
A.66
B.75
C.78
D.92
2. (560)在一般背包问题中,有载重为15的背包,4件物品的重量分别为:(w0,w1,w2,w3)=(4,5,3,6),物品装入背包的收益为:(p0,p1,p2,p3)=(20,18,15,22),设问题的解为(x0,x1,x2,x3),当解为( )时,物品装入背包可获得最大收益。
A.(1,2/5,1,1)
B.(1,1,0,6/5)
C.(1/2,4/5,1,1)
D.(1,1,1,1/2)
3. (558)设有5个有序文件分别包含(30,10,20,15,20)条记录,现通过两两合并将其合并成一个有序文件。(若每一次合并读写两个文件的全部记录一次)则整个合并过程中至少需要读写总共( )条记录。
A.95
B.215
C.220
D.225
1. 用贪心法求解最优化问题,根据最优量度标准选择的解分量是局部最优选择,若能够最终产生整体最优解,则称该问题具有( 最优子结构 )性质。
第六章贪心法随堂测试2
1. (563)Prim算法和Kruskal算法都是求图的( )的算法。
A.最短回路
B.最长路径
C.最小代价生成树
D.最小带权外路径长度
2. (561)图G=(V, E)是一个无向带权连通图,其边数相对较少,则能较高效率得到最小代价生成树的算法是( )。
A.普里姆算法
B.克鲁斯卡尔算法
C.迪杰斯特拉算法
D.弗洛伊德算法
3. (559)n个顶点的连通图至少有( )条边。
A.n-1
B.n
C.n^2
D.n(n+1)/2
1. Prim算法和Kruskal算法的理论基础是( 最小生成树 或者 MST )性质,两个算法的正确性都可以从该定理得到证明。
第七章动态规划法随堂测试1
1. (565)动态规划算法的基本要素为( )
A.最优子结构性质与贪心选择性质
B.重叠子问题性质与贪心选择性质
C.最优子结构性质与重叠子问题性质
D.预排序与递归调用
2. (564)动态规划算法通常按照( )的顺序执行以下4个步骤。
① 以自底向上方式计算最优解值
② 刻画最优解的结构特征
③ 递归定义最优解值
④ 根据计算得到的信息构造一个最优解
A.②③①④
B.①②③④
C.③②①④
D.③②④①
1. 关键路径问题中,完成工程所需的最短时间是AOE网络中从开始结点到完成结点的( 最长 )路径的长度(填“最长”或“最短”)。
第七章动态规划法随堂测试2
1. (566)备忘录方法和动态规划法的主要区别是 ( ) 。
A.备忘录方法是自顶向下求解,动态规划法是自底向上求解。
B.备忘录方法是自底向上求解,动态规划法是自顶向下求解。
C.备忘录方法需要保存子问题的解,而动态规划法不需要保存子问题的解。
D.备忘录方法不需要保存子问题的解,而动态规划法需要保存子问题的解。
2. (567)字符串adadecdfcbd和bdacdbdf的公共最长子序列长度是( )。
A.4
B.5
C.6
D.7
1. 0/1背包问题:设有4件物品重量分别为(w0,w1,w2,w3)=(10,15,6,9), 每个物品的收益为(p0,p1,p2,p3)=(2,5,8,1),背包的载重为M=32。最大收益值为( 15 )。
第八章回溯法随堂练习
1. (569)对于含有n个元素的子集树问题,当解结构是固定长度元组时,解空间的叶结点数目为( )。
A.n!
B.2^n
C.2^(n+1)-1
D.∑n!/i!
2. (568)状态空间树中,如果从根到某个解状态的路径代表一个作为可行解的元组,则称该解状态为( )。
A.解状态
B.问题状态
C.答案状态
D.最优答案结点
1. ( 状态空间树 )是描述问题解空间的树形结构。
2. 8皇后问题运用蒙特卡罗方法估计状态空间树上实际生成的结点数,如果随机选取的路径为(4,1,3,0,2,7,5),求实际生成的结点数估计值。3769
3. 用蒙特卡罗方法计算回溯法的时间效率,m0为第2层不受限制的孩子数目,m1为第3层不受限制的孩子数目,m2为第4层不受限制的孩子数目,则整个状态空间树上将实际生成的结点数估计为( 1+m0+m0m1+m0m1m2 或者 1+m0+m0m1m2+m0m1 或者 1+m0m1+m0+m0m1m2 )。
4. 使用剪枝函数的深度优先策略生成状态空间树中结点的算法称为( 回溯法 )。
5. 一般称从n个元素的集合中找出满足某些性质的子集的状态空间树为( 子集 ) 树。
第九章分枝限界法随堂练习
1. (570)根据( )可将分支限界法分为FIFO、LIFO、LC分支限界法三类。
A.状态空间树中解空间大小不同
B.求解可行解或最优解的目标不同
C.构造的剪枝函数不同
D.从活结点表中选择下一个扩展节点的次序不同
1. 分枝限界法生成状态空间树中的结点时,一旦一个活结点成为( 扩展节点 或者 扩展结点 )后,算法将依次生成它的孩子结点并加入到优先权队列中。
2. 约束函数和( 限界 )函数的目的相同,都是为了剪去不必要搜索的子树,减少问题求解所需实际生成的状态节点数,它们统称为剪枝函数。
3. 采用广度优先策略生成结点,并使用剪枝函数的算法称为( 分支限界法 或者 分枝限界法 )。
第10章NP完全问题随堂练习
1. (573)第一个被证明是NP完全问题的是( )。
A.最大集团问题
B.CNF可满足性问题
C.顶点覆盖问题
D.图着色数判定问题
2. (572)所有可在多项式时间内用确定算法求解的判定问题是( )。
A.P类问题
B.NP类问题
C.NP完全问题
D.P类语言
3. (571)NP问题是所有可在多项式时间内用( )求解的判定问题的集合。
A.确定算法
B.不确定算法
C.蒙特卡罗算法
D.启发式算法
1. 对任意问题Q1∈NP都有Q1∝Q,则称问题Q是( NP难度 或者 NP hard )的。
第13章密码算法随堂练习
1. (576)下面( )不是针对RSA算法的攻击方式
A.大整数分解
B.时间攻击
C.中间人攻击
D.数字认证
2. (575)下面哪一个关于RSA算法的说法是错误的?( )
A.RSA采用的非对称密码体制
B.RSA算法为每个用户生成一个公钥/私钥对
C.RSA算法可以用于加密
D.RSA算法不能用于数字签名
3. (574)信息安全的( )是指维护信息的一致性,使信息在生成、传输、存储和使用过程中不发生非授权的篡改。
A.机密性
B.完整性
C.抗否认性
D.可用性
1. 信息安全的目标是保护信息的机密性、完整性,并具有( 抗否认性 )和可用性。
2. 在传统密码体制中,加密和解密所用的密钥是相同的,所以称为( 对称 )密码体制。