设 n 是描述问题规模的非负整数,下面程序片段的时间复杂度是()
x = 2;
while (x < n / 2)
x = 2 * x;查看提示
写出 x 的前几项:2、4、8、16,再判断达到 n 需要多少次翻倍。
用 19 道交互式选择题练习时间与空间复杂度计算,覆盖常见循环形态、递归递推、主定理与渐近增长比较。
00T0230~45 分钟更新于 2026-08-17DSA 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 节「复杂度入门」再做。题量大,可以分两次完成:先做第 1~10 题,休息后再做第 11~19 题。
作答方法
每题先选择一个选项,再点击「提交答案」;提交后立即显示对错,并给出正确答案与详细计算过程。做错的题,先看题解、自己再推一遍,然后点击「重新作答」,直到能独立得出正确答案。
设 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++;下列函数的时间复杂度是()
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 充分大。下列关于复杂度函数渐近增长由慢到快的排序中,错误的是()
递推式 T(n) = 2T(n/2) + n(其中 T(1) = 1)的渐近复杂度是()
下列递推式中(假设 T(1) = 1),渐近复杂度为 O(n²) 的是()
下列关于时间复杂度与空间复杂度的说法中,错误的是()
下列代码段的时间复杂度是()
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;若某算法的空间复杂度为 O(1),则表示该算法()
下列关于时间复杂度的函数中,时间复杂度最小的是()
设 n 是描述问题规模的正整数,则如下程序片段的时间复杂度是()
i = 2;
while (i < n / 3)
i = i * 3;设 n 是描述问题规模的正整数,则下列程序段的时间复杂度是()
i = n * n;
while (i != 1)
i = i / 2;常见陷阱
for (int j = 0; j < n; j++),复杂度变成多少?与第 3 题一致吗?fun(n/2) 的两次调用改成 fun(n-1) 两次,复杂度变成多少?while (sum < n) sum += ++i; 改为 while (sum < n) sum += n;,复杂度变成多少?