时间复杂度与空间复杂度
评估一个算法的优劣,核心在于对比两个维度:时间和空间。时间复杂度衡量运行快慢,空间复杂度衡量额外占用的存储大小。
一、时间复杂度
算法的时间复杂度通常表示为函数 T(N),代表基本操作的执行次数。需要注意的是,不同编译器编译耗时不同,越新的编译器往往越快,但在理论分析中我们主要关注代码逻辑本身的执行量。
比较 T(N) = N 和 T(N) = N^2,显然前者在数据量大时更快。
1. 大 O 渐进表示法
为了简化分析,我们遵循以下规则推导大 O 阶:
- 用常数 1 取代所有加法常数。
- 只保留最高阶项。
- 如果最高阶项存在且不是 1,则去除与该项相乘的常数系数。
示例分析:
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;
}
}
Func1 的基本操作次数是 T(N) = N^2 + 2*N + 10。当 N 趋于无穷大时,低阶项影响微乎其微,因此时间复杂度为 O(N^2)。
2. 实际运行时间测试
虽然理论分析很重要,但有时我们需要实测代码运行时间。C 语言提供了 clock() 函数,通过记录运算前后的时钟滴答数来计算耗时。
#include <stdio.h>
#include <time.h>
int main() {
int n = 1000000;
begin = clock();
x = ;
( i = ; i < n; i++) {
x++;
}
end = clock();
(, end - begin);
;
}


