为什么需要时间复杂度分析?
通过统计、监控,就能得到算法执行的时间和占用的内存大小,但是,这种统计方法
有很多不足,例如:
- 测试结果依赖测试环境,例如测试PC的电脑的芯片从i7换为i5,那么运行时间就会增加
- 测试结果依赖测试数据规模,例如小规模的数据排序,插入排序比快速排序快
时间复杂度的表示方法
大O表示法(重要)
定义:当且仅当存在两个参数 c > 0 ,n0 > 0, 对于所有的 n >= n0 , 都有 f(n) <= cg(n),则
f(n) = O(g(n)),如图:
用大O表示法表示时间复杂度示例:
int cal(int n) {
int sum = 0;
int i = 1;
int j = 1;
for (; i <= n; ++i) {
j = 1;
for (; j <= n; ++j) {
sum = sum + i * j;
}
}
return sum;
}
假设上述代码,执行一行代码的时间为 t ,则花费的总时间为 (2*n^2+2*n+4)*t
。当 n 非常大时,上述代码花费的时间
只取决于 n^2 ,即 T(n) = O(n2),上述代码的时间复杂度为O(n2)
简单说:大O表示法就是忽略掉公式中的常量、低阶、系数,只需要记录一个最大阶的量级
大Ω表示法(了解即可)
定义 :如果存在正数 c 和 n0 ,使得对所有的 n >= n0 ,
都有 f(n) >= cg(n),则 f(n) = Ω(g(n)) ,如图:
大θ表示法(了解即可)
定义:如果一个函数既在集合 O (g(n)) 中又在集合 Ω(g(n))
中,则称其为 θ(g(n))。也即,当上、下限相同时则可用大 θ 表示法,如图:
常用的时间复杂度量级
- 常数阶 O(1)
O(1)只是常量级时间复杂度的一种表示方法,并不是指只执行了一行代码。比如这段代码,即便有3行,它的时间复杂度也是O(1),