林老师 · 客观题题库 · CSP-S 复习卷 S01 · 复杂度分析

CSP-S 复习卷 S01 · 复杂度分析

CSP-S 真题考频第 1 名(16 题 · 7/7 年全考)· 知识细节全覆盖复习
真题
复刻
试卷编号REV-S-01
题目总数56 题 · 93 分
试卷类型客观题
考生须知:
① 本卷共 4 大部分,合计 56 题 · 93 分,全部为客观题;
② 试卷右上角设有 「提交答卷」「重置考试」 按钮,提交后系统自动判分并显示答题正确情况,请确认全部作答后再行提交;
③ 试卷不显示答案,提交后方可查看每题作答与正确答案的对照;
④ 答卷进度会保留在本地缓存中,刷新或再次打开仍可继续作答;
⑤ 本卷仅供学生练习使用;请勿用于其他用途;题面有问题请联系:i64coder@163.com。

判 分 报 告

0 / 93 分
0
答 对 · 得 0
0
答 错 · 失 0
当前筛选下没有题目

简单 · 基本概念与经典复杂度

14 QUESTIONS · 1 POINT EACH
第 1 题 单选 未作答

已知算法运行时间 T(n)=O(n2)T(n) = O(n^2)。下列解释正确的是?

(1 分)
原创复习题 | 考点:大 O 记号的定义(渐进上界)
第 2 题 单选 未作答

将下列复杂度按增长速度从小到大排列,正确的是?

(1 分)
原创复习题 | 考点:常见复杂度阶的大小排序
第 3 题 单选 未作答

对存放在连续内存中的 int a[100000],执行 a[52345] = 7; 所需时间与数组大小 n 的关系是?

(1 分)
原创复习题 | 考点:常数时间操作(数组随机寻址)
第 4 题 单选 未作答

以下代码片段的时间复杂度是?

01for (int i = 0; i < n; i++) sum++;

(1 分)
原创复习题 | 考点:单层循环的复杂度
第 5 题 单选 未作答

以下代码的时间复杂度是?

01for (int i = 0; i < n; i++)
02    for (int j = 0; j < n; j++)
03        sum++;

(1 分)
原创复习题 | 考点:双重独立嵌套循环(乘法法则)
第 6 题 单选 未作答

以下代码的时间复杂度是?

01for (int i = 1; i <= n; i *= 2) sum++;

(1 分)
原创复习题 | 考点:倍增式循环(乘 2 增长)
第 7 题 单选 未作答

以下代码的时间复杂度是?

01while (n > 1) n /= 2;

(1 分)
原创复习题 | 考点:折半式循环(除 2 缩小)
第 8 题 单选 未作答

某算法先执行一个 O(n) 的预处理循环,再执行一个 O(n²) 的主循环,总时间复杂度是?

(1 分)
原创复习题 | 考点:加法法则(顺序复合取最大项)
第 9 题 单选 未作答

在含 1000 个元素的有序数组中做二分查找,最坏情况下大约需要比较多少次?

(1 分)
原创复习题 | 考点:二分查找的比较次数估算
第 10 题 单选 未作答

下列排序算法中,平均时间复杂度为 O(n²) 的是?

(1 分)
原创复习题 | 考点:O(n²) 级排序的识别
第 11 题 单选 未作答

下列排序算法中,平均时间复杂度为 O(n log n) 的是?

(1 分)
原创复习题 | 考点:O(n log n) 级排序的识别
第 12 题 单选 未作答

归并排序需要开一个与原数组等长的辅助数组,其空间复杂度是?

(1 分)
原创复习题 | 考点:归并排序的空间复杂度
第 13 题 单选 未作答

下列排序算法中,辅助存储空间为 O(1) 的是?

(1 分)
原创复习题 | 考点:原地排序(O(1) 辅助空间)的识别
第 14 题 单选 未作答

用递归计算 fact(n) = n × fact(n-1)fact(0)=1),递归深度为 n。除输入输出外,额外占用的栈空间复杂度是?

(1 分)
原创复习题 | 考点:递归调用的栈空间

中等 · 循环计数与递归式

14 QUESTIONS · 1 POINT EACH
第 15 题 单选 未作答

以下代码的时间复杂度是?

01for (int i = 0; i < n; i++)
02    for (int j = 0; j < n; j++)
03        for (int k = 0; k < n; k++)
04            sum++;

(1 分)
原创复习题 | 考点:三重独立嵌套循环
第 16 题 单选 未作答

以下代码的执行次数是?

01for (int i = 1; i <= n; i++)
02    for (int j = 1; j <= i; j++)
03        sum++;

(1 分)
原创复习题 | 考点:三角循环(内层依赖外层)
第 17 题 单选 未作答

以下代码的时间复杂度是?

01for (int i = 1; i <= n; i++)
02    for (int j = i; j <= n; j += i)
03        sum++;

(1 分)
原创复习题 | 考点:调和级数循环
第 18 题 单选 未作答

以下代码的时间复杂度是?

01for (int i = n; i >= 1; i /= 2)
02    for (int j = 0; j < n; j++)
03        sum++;

(1 分)
原创复习题 | 考点:外层折半、内层线性
第 19 题 单选 未作答

某递归算法把规模 n 的问题一分为二只保留一半继续递归(如二分查找),递归式 T(n)=T(n/2)+O(1)。它的总时间复杂度是?

(1 分)
原创复习题 | 考点:递归式 T(n)=T(n/2)+O(1)
第 20 题 单选 未作答

某分治算法把问题分成两个规模 n/2 的子问题,合并代价 O(n):T(n)=2T(n/2)+O(n)。总时间复杂度是?

(1 分)
原创复习题 | 考点:递归式 T(n)=2T(n/2)+O(n)
第 21 题 单选 未作答

递归式 T(n)=2T(n/2)+O(1)(分成两半但合并只花常数时间)的解是?

(1 分)
原创复习题 | 考点:递归式 T(n)=2T(n/2)+O(1)
第 22 题 单选 未作答

递归式 T(n)=T(n-1)+O(n)(每次只把规模减 1,且做 O(n) 的划分工作)的解是?

(1 分)
原创复习题 | 考点:递归式 T(n)=T(n-1)+O(n)
第 23 题 单选 未作答

关于快速排序的时间复杂度,下列说法正确的是?

(1 分)
原创复习题 | 考点:快排的平均与最坏复杂度
第 24 题 单选 未作答

关于排序算法的「稳定性」与时间复杂度,下列说法正确的是?

(1 分)
原创复习题 | 考点:稳定性与复杂度是独立维度(陷阱辨析)
第 25 题 单选 未作答

用前缀和方法回答 m 次区间和查询(数组长度 n)。先 O(n) 预处理前缀和数组,之后每次查询只需 O(1)。当 m 很大时,总复杂度是?

(1 分)
原创复习题 | 考点:前缀和的预处理与查询代价
第 26 题 单选 未作答

Dijkstra 最短路有朴素实现 O(n²) 和二叉堆实现 O((n+m) log n)。关于选型,下列说法正确的是?

(1 分)
原创复习题 | 考点:Dijkstra 两种实现的适用场景
第 27 题 单选 未作答

图为 n 个点 m 条边的有向图,用邻接表存储,对图做一次 BFS 遍历的时间复杂度是?

(1 分)
原创复习题 | 考点:BFS/DFS 在邻接表上的复杂度
第 28 题 单选 未作答

计算 aᵏ(k 可达 10⁹)时,采用「反复平方」的快速幂,乘法次数的量级是?

(1 分)
原创复习题 | 考点:快速幂的复杂度

困难 · 均摊分析、下界与进阶求和

12 QUESTIONS · 1 POINT EACH
第 29 题 单选 未作答

动态数组(如 C++ vector)在容量耗尽时申请两倍大小的新空间并搬迁全部元素。虽然单次 push_back 最坏要 O(n),但从空开始连续 push n 次的平均单次代价(均摊复杂度)是?

(1 分)
原创复习题 | 考点:均摊复杂度:动态数组倍增扩容
第 30 题 单选 未作答

用两个栈实现队列:入队压栈 A,出队时若栈 B 空则把 A 全部倒入 B 再弹顶。整个过程中每个元素被压入、弹出、搬运的总次数上限是?由此单次操作的均摊复杂度是?

(1 分)
原创复习题 | 考点:聚合分析:两个栈模拟队列
第 31 题 单选 未作答

「任何基于比较的排序算法,最坏情况时间复杂度的下界是 Ω(n log n)」。支撑这一结论的正确论述是?

(1 分)
原创复习题 | 考点:基于比较的排序下界 Ω(n log n)
第 32 题 单选 未作答

关于渐进记号,下列命题正确的是?

(1 分)
原创复习题 | 考点:Θ 记号与 O 的关系
第 33 题 单选 未作答

下列关于小 o 记号(f=o(g) 表示 f/g→0)的命题中,错误的是?

(1 分)
原创复习题 | 考点:小 o 记号的严格性
第 34 题 单选 未作答

递归式 T(n)=T(n/3)+T(2n/3)+cn(每次切成 1/3 与 2/3 两块,合并代价 cn)。用递归树估算,T(n) 的量级是?

(1 分)
原创复习题 | 考点:递归树法:不均衡分割 T(n)=T(n/3)+T(2n/3)+cn
第 35 题 单选 未作答

以下代码的时间复杂度是?

01int i = 1, s = 0;
02while (s < n) { s += i; i++; }

(1 分)
原创复习题 | 考点:平方根求和循环
第 36 题 单选 未作答

以下代码中 i、j 都只增不减(cond 为某条件判断):

01int j = 0;
02for (int i = 0; i < n; i++) {
03    while (j < n && !cond(i, j)) j++;
04    // ...使用 i, j
05}

(1 分)
原创复习题 | 考点:双指针的均摊分析
第 37 题 单选 未作答

忽略输出本身的代价,穷举 n 个元素的所有子集与穷举所有全排列,时间复杂度分别是?

(1 分)
原创复习题 | 考点:枚举子集与全排列的代价
第 38 题 单选 未作答

朴素递归计算斐波那契 fib(n) 的时间复杂度为指数级;加入数组把每个 fib(k) 的结果缓存起来(记忆化)之后,时间与空间复杂度变为?

(1 分)
原创复习题 | 考点:记忆化对递归复杂度的改变
第 39 题 单选 未作答

某评测机 1 秒约执行 10⁸ 次基本运算。对 n = 10⁵ 的输入,下列复杂度中大概率能在 1 秒内完成的是?

(1 分)
原创复习题 | 考点:机器速度估算:什么样的复杂度能过
第 40 题 单选 未作答

算法分析中,人们通常写 O(log n) 而不写底数,理由是?

(1 分)
原创复习题 | 考点:对数复杂度为何不写底数

附录 · 历年真题(原样罗列)

16 QUESTIONS FROM CSP CSP-S
第 41~46 题 阅读程序 (共 12 分) 未作答

完成下面的判断题和单选题。

1  #include <cstdio>
2  using namespace std;
3  int n;
4  int a[100];
5 
6  int main() {
7      scanf("%d", &n);
8      for (int i = 1; i <= n; ++i)
9          scanf("%d", &a[i]);
10      int ans = 1;
11      for (int i = 1; i <= n; ++i) {
12          if (i > 1 && a[i] < a[i - 1])
13              ans = i;
14          while (ans < n && a[i] >= a[ans + 1])
15              ++ans;
16          printf("%d\n", ans);
17      }
18      return 0;
19  }

41.

1616 行输出 ans 时,ans 的值一定大于 i。( )

(1 分)
42.

程序输出的 ans 小于等于 nn。( )

(1 分)
43.

若将第 1212 行的 < 改为 !=,程序输出的结果不会改变。( )

(1.5 分)
44.

当程序执行到第 1616 行时,若 ans-i>2,则 a[i+1]a[i]a[i+1]\le a[i]。( )

(1.5 分)
45.

若输入的 a 数组是一个严格单调递增的数列,此程序的时间复杂度是( )。

(3 分)
46.

最坏情况下,此程序的时间复杂度是( )。

(4 分)
CSP-S 2019 · 阅读程序 第16-16-21题 | 知识点 复杂度分析
第 47 题 单选 未作答

具有 nn 个顶点、ee 条边的图采用邻接表存储结构,进行深度优先遍历运算的时间复杂度为( )。

(1 分)
CSP-S 2020 · 单选 第7题 | 知识点 复杂度分析
第 48 题 单选 未作答

对一个 nn 个顶点、mm 条边的带权有向简单图用 Dijkstra 算法计算单源最短路时,如果不使用堆或其它优先队列进行优化,则其时间复杂度为( )。

(1 分)
CSP-S 2020 · 单选 第14题 | 知识点 复杂度分析
第 49~54 题 阅读程序 (共 13 分) 未作答

1  #include <iostream>
2  #include <cstdlib>
3  using namespace std;
4 
5  int n;
6  int d[10000];
7 
8  int find(int L, int R, int k) {
9      int x = rand() % (R - L + 1) + L;
10      swap(d[L], d[x]);
11      int a = L + 1, b = R;
12      while (a < b) {
13          while (a < b && d[a] < d[L])
14              ++a;
15          while (a < b && d[b] >= d[L])
16              --b;
17          swap(d[a], d[b]);
18      }
19      if (d[a] < d[L])
20          ++a;
21      if (a - L == k)
22          return d[L];
23      if (a - L < k)
24          return find(a, R, k - (a - L));
25      return find(L + 1, a - 1, k);
26  }
27 
28  int main() {
29      int k;
30      cin >> n;
31      cin >> k;
32      for (int i = 0; i < n; ++i)
33          cin >> d[i];
34      cout << find(0, n - 1, k);
35      return 0;
36  }

假设输入的 nnkkd[i] 都是不超过 1000010000 的正整数,且 kk 不超过 nn,并假设 rand() 函数产生的是均匀的随机数,完成下面的判断题和单选题。

49.

99 行的 x 的数值范围是 L+1L+1RR,即 [L+1,R][L+1,R]。( )

(1.5 分)
50.

将第 1919 行的 d[a] 改为 d[b],程序不会发生运行错误。( )

(1.5 分)
51.

当输入的 d[i] 是严格单调递增序列时,第 1717 行的 swap 平均执行次数是( )。

(2.5 分)
52.

当输入的 d[i] 是严格单调递减序列时,第 1717 行的 swap 平均执行次数是( )。

(2.5 分)
53.

若输入的 d[i]ii,此程序①平均的时间复杂度和②最坏情况下的时间复杂度分别是( )。

(2.5 分)
54.

若输入的 d[i] 都为同一个数,此程序平均的时间复杂度是( )。

(2.5 分)
CSP-S 2020 · 阅读程序 第22-22-27题 | 知识点 复杂度分析
第 55 题 单选 未作答

以比较为基本运算,对于 2n2n 个数,同时找到最大值和最小值,最坏情况下需要的最少比较次数为( )。

(1 分)
CSP-S 2021 · 单选 第5题 | 知识点 复杂度分析
第 56 题 单选 未作答

斐波那契数列的定义为:F1=1F_1=1F2=1F_2=1Fn=Fn1+Fn2F_n=F_{n-1}+F_{n-2}n3n\ge3)。现在用如下程序来计算斐波那契数列的第 nn 项,其时间复杂度为( )。

01F(n):
02    if n<=2 return 1
03    else return F(n-1) + F(n-2)

(1 分)
CSP-S 2021 · 单选 第12题 | 知识点 复杂度分析
第 57 题 单选 未作答

对于给定的 nn,分析以下代码段对应的时间复杂度,其中最为准确的时间复杂度为( )。

01int i, j, k = 0;
02for (i = 0; i < n; i++) {
03    for (j = 0; j < n; j *= 2) {
04        k = k + n / 2;
05    }
06}

(1 分)
CSP-S 2022 · 单选 第13题 | 知识点 复杂度分析
第 58 题 单选 未作答

以比较为基本运算,在 nn 个数的数组中找最大的数,在最坏情况下至少要做( )次运算。

(1 分)
CSP-S 2022 · 单选 第14题 | 知识点 复杂度分析
第 59~63 题 完善程序 (共 15 分) 未作答

(容器分水)有两个容器,容器 11 的容量为 aa 升,容器 22 的容量为 bb 升;同时允许下列三种操作:

  1. FILL(i):用水龙头将容器 iii{1,2}i\in\{1,2\})灌满水;
  2. DROP(i):将容器 ii 的水倒进下水道;
  3. POUR(i,j):将容器 ii 的水倒进容器 jj。完成此操作后,要么容器 jj 被灌满,要么容器 ii 被清空。

求只使用上述两个容器和三种操作,获得恰好 cc 升水的最少操作数和操作序列。上述 a,b,ca,b,c 均为不超过 100100 的正整数,且 cmax{a,b}c\le\max\{a,b\}

试补全程序。

1  #include <bits/stdc++.h>
2  using namespace std;
3  const int N = 110;
4 
5  int f[N][N];
6  int ans;
7  int a, b, c;
8  int init;
9 
10  int dfs(int x, int y) {
11      if (f[x][y] != init)
12          return f[x][y];
13      if (x == c || y == c)
14          return f[x][y] = 0;
15      f[x][y] = init - 1;
16      f[x][y] = min(f[x][y], dfs(a, y) + 1);
17      f[x][y] = min(f[x][y], dfs(x, b) + 1);
18      f[x][y] = min(f[x][y], dfs(0, y) + 1);
19      f[x][y] = min(f[x][y], dfs(x, 0) + 1);
20      int t = min(a - x, y);
21      f[x][y] = min(f[x][y], ①);
22      t = min(x, b - y);
23      f[x][y] = min(f[x][y], ②);
24      return f[x][y];
25  }
26 
27  void go(int x, int y) {
28      if (③)
29          return;
30      if (f[x][y] == dfs(a, y) + 1) {
31          cout << "FILL(1)" << endl;
32          go(a, y);
33      } else if (f[x][y] == dfs(x, b) + 1) {
34          cout << "FILL(2)" << endl;
35          go(x, b);
36      } else if (f[x][y] == dfs(0, y) + 1) {
37          cout << "DROP(1)" << endl;
38          go(0, y);
39      } else if (f[x][y] == dfs(x, 0) + 1) {
40          cout << "DROP(2)" << endl;
41          go(x, 0);
42      } else {
43          int t = min(a - x, y);
44          if (f[x][y] == ④) {
45              cout << "POUR(2,1)" << endl;
46              go(x + t, y - t);
47          } else {
48              t = min(x, b - y);
49              if (f[x][y] == ⑤) {
50                  cout << "POUR(1,2)" << endl;
51                  go(x - t, y + t);
52              } else
53              assert(0);
54          }
55      }
56  }
57 
58  int main() {
59      cin >> a >> b >> c;
60      ans = 1 << 30;
61      memset(f, 127, sizeof f);
62      init = **f;
63      if ((ans = dfs(0, 0)) == init - 1)
64          cout << "impossible";
65      else {
66          cout << ans << endl;
67          go(0, 0);
68      }
69  }

59.

①处应填( )。

(3 分)
60.

②处应填( )。

(3 分)
61.

③处应填( )。

(3 分)
62.

④处应填( )。

(3 分)
63.

⑤处应填( )。

(3 分)
CSP-S 2022 · 完善程序 第39-39-43题 | 知识点 复杂度分析
第 64 题 单选 未作答

假设 nn 是图的顶点个数,mm 是图的边数,为求解某一问题有下面四种不同时间复杂度的算法。对于 m=Θ(n)m=\Theta(n) 的稀疏图而言,下面四个选项中哪一项的渐近时间复杂度最小?( )

(1 分)
CSP-S 2023 · 单选 第3题 | 知识点 复杂度分析
第 65 题 单选 未作答

假设快速排序算法的输入是一个长度为 nn 的已排序数组,且该快速排序算法在分治过程中总是选择第一个元素作为基准元素。以下哪个选项描述的是这种情况下的快速排序行为?( )

(1 分)
CSP-S 2023 · 单选 第10题 | 知识点 复杂度分析
第 66 题 单选 未作答

现在用如下代码来计算 xnx^n,其时间复杂度为( )。

01double quick_power(double x, unsigned n) {
02    if (n == 0) return 1;
03    if (n == 1) return x;
04    return quick_power(x, n / 2)
05        * quick_power(x, n / 2)
06        * ((n & 1) ? x : 1);
07}

(1 分)
CSP-S 2023 · 单选 第15题 | 知识点 复杂度分析
第 67 题 单选 未作答

假设一个长度为 nn 的整数数组中每个元素值互不相同,且这个数组是无序的。要找到这个数组中最大元素的时间复杂度是多少?( )

(1 分)
CSP-S 2024 · 单选 第2题 | 知识点 复杂度分析
第 68 题 单选 未作答

在设计一个哈希表时,为了减少冲突,需要使用适当的哈希函数和冲突解决策略。已知某哈希表中有 nn 个键值对,表的装载因子为 aa0<a10 < a \le 1)。在使用开放地址法解决冲突的过程中,最坏情况下查找一个元素的时间复杂度为?

(1 分)
CSP-S 2024 · 单选 第10题 | 知识点 复杂度分析
第 69 题 单选 未作答

递归关系式 T(n)=2T(n/2)+O(n2)T(n) = 2T(n/2) + O(n^2) 描述了某个分治算法的时间复杂度。请问该算法的时间复杂度是多少?

(1 分)
CSP-S 2025 · 单选 第11题 | 知识点 复杂度分析
第 70 题 单选 未作答

斐波那契数列的定义为 F(0)=0F(0)=0F(1)=1F(1)=1F(n)=F(n1)+F(n2)F(n) = F(n-1) + F(n-2)。使用朴素递归方法计算 F(n)F(n) 的时间复杂度是指数级的。而使用动态规划(或迭代)方法的时间复杂度是线性的。造成这种巨大差异的根本原因是?

(1 分)
CSP-S 2025 · 单选 第14题 | 知识点 复杂度分析