下面算法的空间复杂度为 ▁▁▁▁▁。
int foo(int **a, int n)
{
int i, j, s = 0;
for (i = 0; i < n; ++i)
{
for (j = 0; j < n; ++j)
{
s += a[i][j];
}
}
return s;
}
A.
O(n2)
B.
O(1)
C.
O(2n)
D.
O(n)
代码分析
- 变量声明:函数内仅声明了两个整型变量
i
和s
,用于循环计数和累加求和。 - 空间占用:无论输入参数
n
的值如何变化,这两个变量始终只占用固定大小的内存空间(与n
无关)。 - 循环特性:循环过程中没有使用额外的数组、栈、队列等数据结构,也没有递归调用导致的栈空间增长。
空间复杂度判断
- O(1) 表示算法的空间占用为常数级别,与输入规模
n
无关。 - 本题中,变量数量和内存占用不随
n
增大而增加,因此空间复杂度为 O(1)。
下面算法的空间复杂度为 ▁▁▁▁▁。
int foo(int n)
{
return n * (n + 1) / 2;
}
A.
O(n)
B.
O(1)
C.
O(n2)
D.
O(2n)
代码分析
函数 foo
中仅包含简单的算术运算,直接返回数学公式的结果:
- 没有声明额外的数组、链表等数据结构。
- 变量(如
n
本身为输入参数,通常不计入额外空间)占用的内存空间固定,与输入规模n
无关。
空间复杂度判断
- O(1) 表示空间占用为常数级别,不随
n
的增大而变化。 - 本题中,无论
n
多大,算法仅使用固定数量的变量(如计算过程中的临时存储单元),空间占用恒定。
其他选项排除
- A. O(n) 和 C. O(n²):适用于需要线性或平方级额外空间的算法(如存储
n
个元素的数组),本题不满足。 - D. O(2ⁿ):指数级空间复杂度,本题无此类空间增长。
答案:B
下面算法的时间复杂度为 ▁▁▁▁▁。
下面算法的时间复杂度为 ▁▁▁▁▁。
int foo(int *a, int n)
{
int i, s = 0;
for (i = 0; i < n; ++i)
{
s += a[i];
}
return s;
}
)
A.
O(nlog2n)
B.
O(n2)
C.
O(n)
D.
O(n根号n)
代码分析
函数 foo
通过一个 for
循环遍历数组 a
的所有元素,从 i=0
到 i=n-1
,共执行 n
次循环。每次循环内仅进行一次加法运算(s += a[i]
),时间消耗为常数 O(1)
。
时间复杂度计算
- 总操作次数为 n × O(1) = O(n),即时间复杂度与输入规模
n
成线性关系。
选项排除
- A. O(nlog₂n):常见于分治算法(如归并排序),本题无对数级操作。
- B. O(n²):常见于双重循环,本题仅单层循环。
- D. O(nⁿ):指数级复杂度,本题无此类增长。
答案:C
下面算法的时间复杂度为 ▁▁▁▁▁。
int foo(int **a, int n)
{
int i, j, s = 0;
for (i = 0; i < n; ++i)
{
for (j = 0; j < n; ++j)
{
s += a[i][j];
}
}
return s;
}
代码分析
函数 foo
包含一个双重循环:
- 外层循环
for (i = 0; i < n; ++i)
执行n
次。 - 内层循环
for (j = 0; j < n; ++j)
在外层每次循环时执行n
次。 - 每次内层循环内仅进行一次加法运算(
s += a[i][j]
),时间消耗为常数O(1)
。
时间复杂度计算
- 总操作次数为 外层循环次数 × 内层循环次数 = n × n = n²。
- 因此,时间复杂度为 O(n²),表示算法耗时与输入规模
n
的平方成正比。
答案:B