1:给定程序时间复杂度的递推公式:T(1)=1,T(N)=2T(N/2)+N。则对该程序时间复杂度最接近的描述是:
A.O(logN) B.O(N) C.O(NlogN) D.O(N2)
2:程序P1和P2时间复杂度的递推公式:
P1: T(1)=1, T(N)=T(N/2)+1;
P2: T(1)=1, T(N)=2T(N/2)+1;
则下列关于两程序时间复杂度的结论中最准确的是:
A.均为O(logN)
B.P1是O(logN),P2是O(N)
C.均为O(N)
D.P1是O(logN),P2是O(NlogN)
3:下面代码段的时间复杂度是()。
for ( i=0; i<n; i++ )
for ( j=0; j<m; j++ )
a[i][j]=0;
A.O(1) B.O(mn) C.O(m2) D.O(n2)
4:下面代码段的时间复杂度是()。
i=1;
while( i<=n )
i=i*3;
A.O(n) B.O(n2) ;C.O(1) D.O(log3n)
5:下面代码段的时间复杂度是()。
x=n; //n>1
y=0;
while( x≥(y+1)*(y+1) )
y++;
A.O(1) B.O(n1/2) C.O(n) D.O(log2n)
6:下面算法的时间复杂度为 ▁▁▁▁▁。
int foo(int n)
{
int i, s = 0;
for (i = 1; i * i <= n; ++i)
{
s += i;
}
return s;
}
A.O(n2) B.O(n) C.O(sqrt(n) ) D.O(log2n)
7:求整数n(n>=0)的阶乘的算法如下,其时间复杂度为( )。
long fact(long n)
{
if (n<=1) return 1;
return n*fact(n-1);
}
A.O(log2n) B.O(n2 ) C.O(n) D.O(nlog2n)
8:算法P1和P2时间复杂度的递推方程分别为:
P1:T(n) = T(n/2) + 1, T(1)=1
P2:T(n) = 2T(n/2) + 1, T(1)=1
则下列关于P1和P2两个算法时间复杂度的结论中正确的是( )。
A.均为O(logn)
B.均为O(n)
C.P1为O(logn),P2为O(n)
D.P1为O(logn),P2为O(nlogn)
9:T(n)表示当输入规模为n时的算法效率,以下算法中效率最优的是( )。
A.T(n)=T(n-1)+1,T(1)=1
B.T(n)=2n
C.T(n)=T(n/2)+1,T(1)=1
D.T(n)=3nlog2n
10:下列函数中,哪个函数具有最慢的增长速度:
A.N1.5
B.NlogN2
C.N2logN
D.N(logN)2
11:用分治法解决一个规模为N的问题。若每步将问题分成规模均为N/3的8个子问题,且治而得到解的步骤耗时O(N2logN),则整个算法的时间复杂度为__。
A.O(N2logN)
B.O(N2log2N)
C.O(N3logN)
D.O(Nlog8/log3)
12:用分治法解决一个规模为N的问题。下列哪种方法是最慢的?
A.每步将问题分成规模均为N/3的2个子问题,且治的步骤耗时O(N)
B.每步将问题分成规模均为N/3的2个子问题,且治的步骤耗时O(NlogN)
C.每步将问题分成规模均为N/2的3个子问题,且治的步骤耗时O(N)
D.每步将问题分成规模均为N/3的3个子问题,且治的步骤耗时O(NlogN)
13:用分治法解决一个规模为N的问题。若每步将问题分成规模均为N/5的4个子问题,且治而得到解的步骤耗时O(logN),则整个算法的时间复杂度为__。
A.O(Nlog4/log5)
B.O(N)
C.O(logN)
D.O(log2N)
14:用分治法解决一个输入规模为 N 的问题时,如果每步都将问题划分为 9 个规模为 N/3 的子问题,并且用 O(N2logN) 的时间治之,则下列哪项最接近总的时间复杂度?
A.O(N2log2N)
B.O(N2logN)
C.O(N2)
D.O(N3logN)
15:下列多少种排序算法用了分治法?
堆排序
插入排序
归并排序
快速排序
选择排序
希尔排序
A.2
B.3
C.4
D.5
16:分治法的设计思想是将一个难以直接解决的大问题分割成规模较小的子问题,分别解决子问题,最后将子问题的解组合起来形成原问题的解。这要求原问题和子问题( )。
A.问题规模相同,问题性质相同
B.问题规模相同,问题性质不同
C.问题规模不同,问题性质相同
D.问题规模不同,问题性质不同
17:在寻找 n 个元素中第 k 小元素问题中,如快速排序算法思想,运用分治算法对 n 个元素进行划分,如何选择划分基准?下面( ) 答案解释最合理。
A.随机选择一个元素作为划分基准
B.取子序列的第一个元素作为划分基准
C.用中位数的中位数方法寻找划分基准
D.以上皆可行。但不同方法,算法复杂度上界可能不同
18:对于下列二分查找算法,以下正确的是( )。
A.
int binarySearch(int a[], int n, int x)
{
int low=0, high=n-1;
while(low<=high)
{
int mid=(low+high)/2;
if(x==a[mid])
return mid;
if(x>a[mid])
low=mid;
else
high=mid;
}
return –1;
}
B.
int binarySearch(int a[], int n, int x)
{
int low=0, high=n-1;
while(low+1!=high)
{
int mid=(low+high)/2;
if(x>=a[mid])
low=mid;
else
high=mid;
}
if(x==a[low])
return low;
else
return –1;
}
C.
int binarySearch (int a[], int n, int x)
{
int low=0, high=n-1;
while(low {
int mid=(low+high)/2;
if(x <a[mid])
high=mid;
else
low=mid;
}
if(x==a[low])
return low;
else
return –1;
}
D.
int binarySearch(int a[], int n, int x)
{
if(n > 0 && x >= a[0])
{
int low = 0, high = n-1;
while(low < high)
{
int mid=(low+high+1)/2;
if(x < a[mid])
high=mid-1;
else
low=mid;
}
if(x==a[low])
return low;
}
return –1;
}
19:实现大整数的乘法是利用的( )算法。
A.贪心法
B.分治策略
C.回溯法
D.动态规划法
20:在寻找n个元素中第k小元素的问题中,如采用快速排序算法思想,运用分治法对n个元素进行划分,如何选择划分基准?下面____答案最合理。
A.随机选择一个元素作为划分基准
B.取子序列的第一个元素作为划分基准
C.用中位数的方法寻找划分基准
D.以上皆可行,但不同方法的算法复杂度上界可能不同
21:关于回溯法以下叙述中不正确的是( )
A.回溯法有“通用解题法”之称,它可以系统地搜索一个问题的所有解或任意解
B.回溯法是一种既带系统性又带跳跃性的搜索算法
C.回溯法需要借助队列这种结构来保存从根结点到当前扩展结点的路径
D.回溯算法在生成解空间的任一结点时先判断该结点是否可能包含问题的解,如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向祖先结点回溯
22:回溯法在问题的解空间树中,按( )策略,从根结点出发搜索解空间树。
A.广度优先
B.活结点优先
C.扩展结点优先
D.深度优先
23:回溯法的效率不依赖于下列哪些因素
A.满足显约束的值的个数
B.计算约束函数的时间
C.计算限界函数的时间
D.确定解空间的时间
24:下面哪种函数是回溯法中为避免无效搜索采取的策略
A.递归函数
B.剪枝函数
C.随机数函数
D.搜索函数
25:下列程序块哪个是回溯法中遍历排列树的算法框架程序。
A.
void backtrack (int t)
{
if (t>n) output(x);
else
for (int i=t;i<=n;i++) {
swap(x[t], x[i]);
if (legal(t)) backtrack(t+1);
swap(x[t], x[i]);
}
}
B.
void backtrack (int t)
{
if (t>n) output(x);
else
for (int i=0;i<=1;i++) {
x[t]=i;
if (legal(t)) backtrack(t+1);
}
}
C.
void backtrack (int t)
{
if (t>n) output(x);
else
for (int i=0;i<=1;i++) {
x[t]=i;
if (legal(t)) backtrack(t-1);
}
}
D.
void backtrack (int t)
{
if (t>n) output(x);
else
for (int i=t;i<=n;i++) {
swap(x[t], x[i]);
if (legal(t)) backtrack(t+1);
}
}