理解复杂度
评估一个算法的好坏,核心在于对比其时间和空间两个维度。简单来说,时间复杂度衡量算法运行的快慢,而空间复杂度则关注运行过程中需要的额外内存开销。
时间复杂度
算法的时间复杂度通常表示为函数 T(N),它反映了基本操作的执行次数随输入规模 N 增长的变化趋势。需要注意的是,不同编译器的优化策略会导致实际编译时间有差异,但大 O 表示法主要关注的是算法本身的逻辑效率。
大 O 渐进表示法
为了简化分析,我们遵循以下规则推导时间复杂度:
- 只保留最高阶项,忽略低阶项(当 N 趋于无穷大时,低阶项影响微乎其微)。
- 如果最高阶项是线性函数,去除常数系数。
- 如果没有 N 相关项,仅含常数,则统一用 1 表示。
来看一段代码示例,计算 Func1 中 ++count 的执行次数:
void Func1(int N) {
int count = 0;
// 双重循环,执行 N * N 次
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
++count;
}
}
// 单次循环,执行 2 * N 次
for (int k = 0; k < 2 * N; ++k) {
++count;
}
// 固定次数循环,执行 10 次
int M = 10;
while (M--) {
++count;
}
}
该函数的总操作次数为 T(N) = N^2 + 2N + 10。根据大 O 推导规则,当 N 很大时,N^2 占主导地位,因此 Func1 的时间复杂度为 O(N^2)。
使用 clock 函数估算运行时间
虽然理论分析很重要,但在实际开发中,有时我们需要通过代码实测来验证性能。C 语言提供了 clock() 函数来记录 CPU 时间。
#include <stdio.h>
#include <time.h>
int main() {
n = ;
begin = clock();
x = ;
( i = ; i < n; i++) {
x++;
}
end = clock();
(, (end - begin) * / CLOCKS_PER_SEC);
;
}


