计算机考研408《数据结构》真题模拟——数据结构与算法基本概念
一、单项选择题
1.下列叙述能作为“算法必须具备的基本特性”之一的是( )。
A.对任意输入都能在有限步内结束(有穷性)
B.执行步骤可以随心所欲地改变
C.必须含有至少一个递归过程
D.必须使用某种特定编程语言描述
2.下列过程不能称为算法的是( )。
A.无输入时直接输出常数 1
B.对给定 nnn,若 n=0n=0n=0 输出 0,否则输出 1
C.反复随机选择数组中的两个元素交换,直到“看起来有序”为止
D.对给定整数 nnn,输出其二进制表示
3.关于“算法与程序”的关系,下列说法正确的是( )。
A.算法依赖具体语言,语言不同算法也不同
B.同一算法可用不同语言实现为不同程序
C.程序与算法完全等价
D.算法只描述数据,程序只描述操作
4.已知以下渐近复杂度从小到大的正确顺序是( )。
A.O(n)<O(logn)<O(1)<O(nlogn)O(n)<O(\log n)<O(1)<O(n\log n)O(n)<O(logn)<O(1)<O(nlogn)
B.O(1)<O(logn)<O(n)<O(nlogn)O(1)<O(\log n)<O(n)<O(n\log n)O(1)<O(logn)<O(n)<O(nlogn)
C.O(logn)<O(1)<O(n)<O(n2)O(\log n)<O(1)<O(n)<O(n^2)O(logn)<O(1)<O(n)<O(n2)
D.O(1)<O(n)<O(logn)<O(n2)O(1)<O(n)<O(\log n)<O(n^2)O(1)<O(n)<O(logn)<O(n2)
5.给定程序段:
cnt = 0;
for (i = 1; i <= n; ++i)for (j = 1; j <= n; j *= 2)++cnt;
其最坏情况时间复杂度为( )。
A.O(logn)O(\log n)O(logn) B.O(n)O(n)O(n) C.O(nlogn)O(n\log n)O(nlogn) D.O(n2)O(n^2)O(n2)
6.给定程序段:
cnt = 0;
for (i = 1; i <= n; i *= 2)for (j = i; j <= n; j += i)++cnt;
其最坏情况时间复杂度为( )。
A.O(logn)O(\log n)O(logn) B.O(n)O(n)O(n) C.O(nlogn)O(n\log n)O(nlogn) D.O(n2)O(n^2)O(n2)
7.对长度为 nnn 的有序数组进行递归二分查找,其最坏时间复杂度与辅助空间复杂度分别为( )。
A.O(logn)O(\log n)O(logn),O(1)O(1)O(1)
B.O(n)O(n)O(n),O(1)O(1)O(1)
C.O(logn)O(\log n)O(logn),O(logn)O(\log n)O(logn)
D.O(n)O(n)O(n),O(logn)O(\log n)O(logn)
8.对无序数组进行顺序查找,下列说法正确的是( )。
A.最好、最坏、平均情形的时间复杂度都为 O(n)O(n)O(n)
B.最好为 O(1)O(1)O(1),最坏为 O(n)O(n)O(n),平均约为 O(n)O(n)O(n)
C.最好为 O(n)O(n)O(n),最坏为 O(1)O(1)O(1),平均为 O(logn)O(\log n)O(logn)
D.最好为 O(1)O(1)O(1),最坏为 O(logn)O(\log n)O(logn),平均为 O(logn)O(\log n)O(logn)
9.使用哈希表将查找从 O(logn)O(\log n)O(logn) 降到期望 O(1)O(1)O(1) 的主要代价是( )。
A.牺牲算法的确定性
B.增加辅助空间的使用
C.降低输入规模
D.必须改用递归实现
10.将规模较大的问题分解为若干规模较小但结构相同的子问题,分别求解后再合并结果的设计思想是( )。
A.穷举法 B.递归法 C.分治法 D.贪心法
二、综合应用题
01.(概念与度量的基础练习)
(1)下列两个过程是否都可称为算法?请分别指出是否满足或缺少“五大特性”中的哪一项,并给出一句话理由。
A.对数组 AAA 随机选择下标 iii,若 A[i]=kA[i]=kA[i]=k 则返回 iii,否则重复该步骤。
B.输入 nnn(n≥0n\ge 0n≥0),若 n=0n=0n=0 返回 1,否则返回 n×fact(n−1)n\times \mathrm{fact}(n-1)n×fact(n−1)。
(2)分析下列程序段的最坏情况时间复杂度与辅助空间复杂度(用 O(⋅)O(\cdot)O(⋅) 表示):
int f(int n){int s = 0;for (int i = 1; i <= n; ++i)for (int j = 1; j <= i; ++j)++s;return s;
}
要求:给出结论并用 1~2 句话说明推导依据(如“嵌套求和 ∑i=1ni\sum_{i=1}^{n} i∑i=1ni”等)。
单项选择题(答案与解析)
1.解析:A。
算法必须具备有穷性、确定性、可行性、输入性、输出性五特性。“对任意输入都能在有限步内结束”对应有穷性;B 违背确定性;C 并非必须递归;D 不要求特定语言。
2.解析:C。
“随机交换直到看起来有序”为止既不保证有穷性,又缺少确定性;A、B、D 都能在有限步内给出确定输出。
3.解析:B。
算法是解决问题的思想与步骤,可用不同语言实现为不同程序而保持逻辑一致;A、C、D 对算法与程序的关系理解错误。
4.解析:B。
常见复杂度从小到大: O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<⋯ \;O(1)<O(\log n)<O(n)<O(n\log n)<O(n^2)<\cdots\;O(1)<O(logn)<O(n)<O(nlogn)<O(n2)<⋯。因此选 B。
5.解析:C。
外层循环 nnn 次;内层每次从 111 乘二到 ≤n\le n≤n,次数为 ⌊log2n⌋+1\lfloor\log_2 n\rfloor+1⌊log2n⌋+1,总操作约为 n⋅lognn\cdot\log nn⋅logn,故为 O(nlogn)O(n\log n)O(nlogn)。
6.解析:B。
外层 i=1,2,4,…≤ni=1,2,4,\ldots\le ni=1,2,4,…≤n;对给定 iii 内层次数 ⌊n/i⌋\lfloor n/i\rfloor⌊n/i⌋。总工作量
∑k=0⌊log2n⌋⌊n2k⌋≤2n, \sum_{k=0}^{\lfloor\log_2 n\rfloor}\Big\lfloor\frac{n}{2^k}\Big\rfloor \le 2n, k=0∑⌊log2n⌋⌊2kn⌋≤2n,
故为 O(n)O(n)O(n)。
7.解析:C。
递归二分查找最坏时间 O(logn)O(\log n)O(logn);递归深度为 ⌈log2n⌉\lceil\log_2 n\rceil⌈log2n⌉,需要相应栈空间,空间为 O(logn)O(\log n)O(logn)。迭代版可降为 O(1)O(1)O(1) 空间,但题干指定“递归”。
8.解析:B。
顺序查找最好命中首元素为 O(1)O(1)O(1),最坏未命中或在尾部为 O(n)O(n)O(n),平均比较次数约 (n+1)/2(n+1)/2(n+1)/2,量级为 O(n)O(n)O(n)。
9.解析:B。
用哈希表把查找期望降到 O(1)O(1)O(1) 的代价是增加辅助空间(表与桶等),体现时间—空间权衡。A、C、D 与本质无关。
10.解析:C。
“分解→递归求解→合并”的套路即分治法。穷举法是枚举所有可能;递归法是实现形式,不一定有“分治”的分解与合并;贪心法与题意不符。
综合应用题(答案与解析)
01.(概念与度量的基础练习)
(1)判定是否为算法:
A.不是算法。缺少有穷性(可能无限重复,无法保证终止)与确定性(随机选择导致对同一输入结果不唯一)。
B.是算法。满足五特性:有输入 nnn,有输出 fact(n)\mathrm{fact}(n)fact(n);每步明确且确定;有递归出口 n=0n=0n=0 保证有穷性;操作(乘、减一、比较)均可行。
(2)复杂度分析:
代码总计执行自增语句的次数为
∑i=1n∑j=1i1=∑i=1ni=n(n+1)2=Θ(n2), \sum_{i=1}^{n}\sum_{j=1}^{i}1=\sum_{i=1}^{n} i=\frac{n(n+1)}{2}=\Theta(n^2), i=1∑nj=1∑i1=i=1∑ni=2n(n+1)=Θ(n2),
故最坏时间复杂度为 O(n2)O(n^2)O(n2)。仅使用常数个局部变量(s,i,js,i,js,i,j),无与 nnn 相关的额外结构,辅助空间复杂度为 O(1)O(1)O(1)。