设 n 是描述问题规模的非负整数,下面程序片段的时间复杂度是()
x = 2;
while (x < n / 2)
x = 2 * x;查看提示
写出 x 的前几项:2、4、8、16,再判断达到 n 需要多少次翻倍。
用 19 道交互式选择题练习时间与空间复杂度计算,覆盖常见循环形态、递归递推、主定理与渐近增长比较。
00T0230~45 分钟更新于 2026-09-11DSA Mastery Team、Azen基础draft在浏览器里直接作答 19 道选择题,练习三步分析法:定义规模 → 数基本操作 → 保留主导项。覆盖 O(1)、O(log n)、O(√n)、O(n)、O(n log n)、O(n²)、O(2ⁿ) 等复杂度形态,并包含递推主定理、渐近增长排序与空间复杂度判断,以及「两层循环不一定是 O(n²)」「递归不一定是 2ⁿ」等陷阱题。
30~45 分钟,可随 0.2 时间与空间复杂度概论分组完成。每次先写计数依据,再选择答案;不要求在入门阶段提前掌握主定理。
| 阅读位置 | 对应题号 | 重点核验 |
|---|---|---|
| 增长趋势与渐近记号 | 8、9、17 | 上界、紧界、常数与低阶项 |
| 三角求和与几何步长 | 15;3、6、13 | 起止边界、内层上界、实际取值 |
| 累计停止与平方边界 | 4、5、7 | 第 k 轮状态、最小停止轮数 |
| 倍增与折半 | 1、18、19 | 整数取整、初值、停止于 1 或 0 |
| 峰值辅助空间 | 12、16 | 同时存活的数据、统计口径 |
| 简单递归 | 2、14 | 调用总数与最大活跃深度 |
| 第 12 章递推分析 | 10、11 | 逐层工作量与主定理条件 |
代码题默认输入规模非负(题面另有限定时从其限定),整数运算不溢出,基本算术按常数成本计;运行实验时应限制输入范围。若选项使用 O 列出若干量级,选择与实际增长同阶的最紧一项;第 11 题明确用 Θ,避免把有效但较松的上界误当唯一答案。
作答方法
每题先选择一个选项,再点击「提交答案」;提交后立即显示对错,并给出正确答案与详细计算过程。做错的题,先看题解、自己再推一遍,然后点击「重新作答」,直到能独立得出正确答案。
设 n 是描述问题规模的非负整数,下面程序片段的时间复杂度是()
x = 2;
while (x < n / 2)
x = 2 * x;写出 x 的前几项:2、4、8、16,再判断达到 n 需要多少次翻倍。
求整数 n(n ≥ 0)阶乘的算法如下,其时间复杂度是()
int fact(int n) {
if (n <= 1) return 1;
return n * fact(n - 1);
}下列程序段的时间复杂度是()
count = 0;
for (k = 1; k <= n; k *= 2)
for (j = 1; j <= n; j++)
count++;设 n 为非负整数,下列函数的时间复杂度是()
int func(int n) {
int i = 0, sum = 0;
while (sum < n)
sum += ++i;
return i;
}设 n 是描述问题规模的非负整数,下列程序段的时间复杂度是()
x = 0;
while (n >= (x + 1) * (x + 1))
x = x + 1;下列程序段的时间复杂度是()
int sum = 0;
for (int i = 1; i < n; i *= 2)
for (int j = 0; j < i; j++)
sum++;以下 C 代码的时间复杂度是()
int count = 0;
for (int i = 0; i * i < n; i++)
for (int j = 0; j < i; j++)
count++;下列关于 T(n) = O(f(n)) 这一记号的说法中,正确的是()
设 n 充分大。下列关于复杂度函数渐近增长由慢到快的排序中,错误的是()
设 n 为 2 的非负整数次幂。递推式 T(n) = 2T(n/2) + n(其中 T(1) = 1)的渐近紧界对应下列哪个量级?
下列递推式中,渐近紧界为 Θ(n²) 的是()?假设 T(1)=1;含 n/2 的递推在 n 为 2 的幂时讨论。
下列关于时间复杂度与空间复杂度的说法中,错误的是()
下列代码段的时间复杂度是()
int count = 0;
for (int i = n; i > 0; i /= 2)
for (int j = 0; j < i; j++)
count++;下列函数 fun 的时间复杂度是()
int fun(int n) {
if (n <= 1) return 1;
int a = fun(n / 2);
int b = fun(n / 2);
return a + b;
}假定 n > 2,执行下面的语句时,语句 S 的执行次数为()
for (i = 1; i < n - 1; i++)
for (j = n; j >= i; j--)
S;设输入为 n 个固定大小的元素,空间复杂度按辅助空间统计。若某算法的空间复杂度为 O(1),则表示该算法()
下列关于时间复杂度的函数中,时间复杂度最小的是()
设 n 是描述问题规模的正整数,则如下程序片段的时间复杂度是()
i = 2;
while (i < n / 3)
i = i * 3;设 n 是描述问题规模的正整数,则下列程序段的时间复杂度是()
i = n * n;
while (i != 1)
i = i / 2;常见陷阱
20000log₂n 并非对每个小 n 都小于 n(第 17 题);for (int j = 0; j < n; j++),复杂度变成多少?与第 3 题一致吗?fun(n/2) 的两次调用改成 fun(n-1) 两次,复杂度变成多少?while (sum < n) sum += ++i; 改为 while (sum < n) sum += n;,复杂度变成多少?sum++:第 6 题改后每轮内层 n 次,共 ⌈log₂n⌉ 轮,时间 Θ(n log n)。与第 3 题同阶,但第 3 题的外层是 <=n,在 n 为 2 的幂时多一轮,精确次数不总相同。n,两次 fun(n-1) 的总调用数满足 C(n)=1+2C(n-1)、C(1)=1,解为 2^n-1,时间 Θ(2^n)。兄弟调用依次返回,最大活跃深度为 n,辅助空间 Θ(n)。n>0 时第一次就把 sum 从 0 变成 n,只执行一轮;n=0 时零轮,整体时间 Θ(1)。改变的是每轮增量,不能沿用三角和反推平方根。a,b>1,log_a n=log_b n/log_b a,分母与 n 无关,故同阶。若底数随 n 改变,这个常数因子论证就不适用。