408 真题做题本·数据结构部分
第 1 章 绪论
1.1 绪论
- 【2011】设 是描述问题规模的非负整数,下面程序片段的时间复杂度是( )。
x = 2;
while (x < n / 2)
x = 2 * x;
A.
B.
C.
D.
答案: A
解析: 设循环执行了 次。初始时 ,每执行一次循环, 扩大为原来的 倍,因此执行 次后
循环结束时应有 ,所以
循环体内只有常数次基本操作,故程序的时间复杂度为 。
- 【2012】求整数 阶乘的算法如下,其时间复杂度是( )。
int fact(int n) {
if (n <= 1) return 1;
return n * fact(n - 1);
}
A.
B.
C.
D.
答案: B
解析: 当 时,函数每次递归都将参数减 ,直至参数变为 。递归调用序列为
共进行 级左右的调用。每一层除递归调用外只进行常数次判断和乘法,因此递推式可写为
解得 ,故选 B。该算法的递归栈空间复杂度也为 ,但本题只问时间复杂度。
- 【2013】已知两个长度分别为 和 的升序链表,若将它们合并为一个长度为 的降序链表,则最坏情况下的时间复杂度是( )。
A.
B.
C.
D.
答案: D
解析: 合并时可同时扫描两个升序链表,每次取当前较小的结点,并采用头插法插入新链表。由于取出的元素按升序排列,而头插后顺序恰好反转,因此最终得到降序链表。
在最坏情况下,两个链表中的所有结点都需要被访问和链接一次,时间复杂度为
又因为
所以 。四个选项中应选 D。
- 【2014】下列程序段的时间复杂度是( )。
count = 0;
for (k = 1; k <= n; k *= 2)
for (j = 1; j <= n; j++)
count++;
A.
B.
C.
D.
答案: C
解析: 外层循环中 依次取
当 时停止,因此外层循环执行次数为 。
每次外层循环中,内层循环均执行 次,所以总基本操作次数为
故时间复杂度为 。
- 【2017】下列函数的时间复杂度是( )。
int func(int n) {
int i = 0, sum = 0;
while (sum < n) sum += ++i;
return i;
}
A.
B.
C.
D.
答案: B
解析: 循环第 次执行后,变量 的值为
循环终止时,,即
由此可得 。循环体每次只执行常数次操作,所以函数的时间复杂度为
- 【2019】设 是描述问题规模的非负整数,下列程序段的时间复杂度是( )。
x = 0;
while (n >= (x + 1) * (x + 1))
x = x + 1;
A.
B.
C.
D.
答案: B
解析: 循环条件等价于
变量 从 开始,每次增加 。循环执行次数约为 ,因此基本操作次数与 同阶,即
故时间复杂度为 。
- 【2022】下列程序段的时间复杂度是( )。
int sum = 0;
for (int i = 1; i < n; i *= 2)
for (int j = 0; j < i; j++)
sum++;
A.
B.
C.
D.
答案: B
解析: 外层循环中, 依次取 ,其中 。第 次外层循环中,内层循环执行 次,因此总执行次数为等比数列之和
由 可知,该和为 。因此程序的时间复杂度为 ,而不是把“外层 ”与“最大内层 ”直接相乘得到 。
- 【2023】下列对顺序存储的有序表(长度为 )实现给定操作的算法中,平均时间复杂度为 的是( )。
A. 查找包含指定值元素的算法
B. 插入包含指定值元素的算法
C. 删除第 个元素的算法
D. 获取第 个元素的算法
答案: D
解析: 顺序表中的元素存放在一段连续的存储空间中。若首元素地址为 ,每个元素占用 个存储单元,则第 个元素的地址为
因此,只要给出合法下标 ,便可通过地址计算直接访问第 个元素,时间复杂度为 。
其余选项中:有序顺序表按值查找即使采用折半查找也需 ;插入元素通常需要移动后续元素,平均为 ;删除第 个元素也通常需要前移其后的元素,平均为 。故选 D。