跳到主要内容

408 真题做题本·数据结构部分

第 1 章 绪论

1.1 绪论

  1. 【2011】设 是描述问题规模的非负整数,下面程序片段的时间复杂度是( )。
C
x = 2;
while (x < n / 2)
x = 2 * x;

A.
B.
C.
D.

答案: A

解析: 设循环执行了 次。初始时 ,每执行一次循环, 扩大为原来的 倍,因此执行 次后

循环结束时应有 ,所以

循环体内只有常数次基本操作,故程序的时间复杂度为

  1. 【2012】求整数 阶乘的算法如下,其时间复杂度是( )。
C
int fact(int n) {
if (n <= 1) return 1;
return n * fact(n - 1);
}

A.
B.
C.
D.

答案: B

解析: 时,函数每次递归都将参数减 ,直至参数变为 。递归调用序列为

共进行 级左右的调用。每一层除递归调用外只进行常数次判断和乘法,因此递推式可写为

解得 ,故选 B。该算法的递归栈空间复杂度也为 ,但本题只问时间复杂度。

  1. 【2013】已知两个长度分别为 的升序链表,若将它们合并为一个长度为 的降序链表,则最坏情况下的时间复杂度是( )。

A.
B.
C.
D.

答案: D

解析: 合并时可同时扫描两个升序链表,每次取当前较小的结点,并采用头插法插入新链表。由于取出的元素按升序排列,而头插后顺序恰好反转,因此最终得到降序链表。

在最坏情况下,两个链表中的所有结点都需要被访问和链接一次,时间复杂度为

又因为

所以 。四个选项中应选 D。

  1. 【2014】下列程序段的时间复杂度是( )。
C
count = 0;
for (k = 1; k <= n; k *= 2)
for (j = 1; j <= n; j++)
count++;

A.
B.
C.
D.

答案: C

解析: 外层循环中 依次取

时停止,因此外层循环执行次数为

每次外层循环中,内层循环均执行 次,所以总基本操作次数为

故时间复杂度为

  1. 【2017】下列函数的时间复杂度是( )。
C
int func(int n) {
int i = 0, sum = 0;
while (sum < n) sum += ++i;
return i;
}

A.
B.
C.
D.

答案: B

解析: 循环第 次执行后,变量 的值为

循环终止时,,即

由此可得 。循环体每次只执行常数次操作,所以函数的时间复杂度为

  1. 【2019】设 是描述问题规模的非负整数,下列程序段的时间复杂度是( )。
C
x = 0;
while (n >= (x + 1) * (x + 1))
x = x + 1;

A.
B.
C.
D.

答案: B

解析: 循环条件等价于

变量 开始,每次增加 。循环执行次数约为 ,因此基本操作次数与 同阶,即

故时间复杂度为

  1. 【2022】下列程序段的时间复杂度是( )。
C
int sum = 0;
for (int i = 1; i < n; i *= 2)
for (int j = 0; j < i; j++)
sum++;

A.
B.
C.
D.

答案: B

解析: 外层循环中, 依次取 ,其中 。第 次外层循环中,内层循环执行 次,因此总执行次数为等比数列之和

可知,该和为 。因此程序的时间复杂度为 ,而不是把“外层 ”与“最大内层 ”直接相乘得到

  1. 【2023】下列对顺序存储的有序表(长度为 )实现给定操作的算法中,平均时间复杂度为 的是( )。

A. 查找包含指定值元素的算法
B. 插入包含指定值元素的算法
C. 删除第 个元素的算法
D. 获取第 个元素的算法

答案: D

解析: 顺序表中的元素存放在一段连续的存储空间中。若首元素地址为 ,每个元素占用 个存储单元,则第 个元素的地址为

因此,只要给出合法下标 ,便可通过地址计算直接访问第 个元素,时间复杂度为

其余选项中:有序顺序表按值查找即使采用折半查找也需 ;插入元素通常需要移动后续元素,平均为 ;删除第 个元素也通常需要前移其后的元素,平均为 。故选 D。