时间复杂度分析
1.原则
- 只关注循环执行次数最多的一段代码
- 加法法则:总复杂度等于量级最大的那段代码的复杂度
如果 T1(n)=O(f(n)),T2(n)=O(g(n));
那么 T(n)=T1(n)+T2(n)=max(O(f(n)), O(g(n))) =O(max(f(n), g(n))).
- 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
如果 T1(n)=O(f(n)),T2(n)=O(g(n));那么
T(n)=T1(n)*T2(n)=O(f(n))*O(g(n))=O(f(n)*g(n)).
2.常见复杂度分析
O(1) 常量级复杂度
- 代码的执行时间不随着n的增大而增大,这样的时间复杂度为O(1)
- 算法中不存在
循环语句
,递归语句
等.基本可以认为是O(1)
O(logn)、O(nlogn)
- 一个是涉及到a个数的b次方等于n的时候,可以考虑O(logn),而对数阶时间复杂度的表示方法里,我们忽略对数的“底”,统一表示为 O(logn)
- O(nlogn) 可以用乘法法则解释为O(nlogn) = O(n) * O(logn),即O(logn)的场景下,执行了n次
m n 两种规模下的的加法和乘法法则 O(m+n)、O(m*n)
int cal(int m, int n) {
int sum_1 = 0;
int i = 1;
for (; i < m; ++i) {
sum_1 = sum_1 + i;
}
int sum_2 = 0;
int j = 1;
for (; j < n; ++j) {
sum_2 = sum_2 + j;
}
return sum_1 + sum_2;
}
- m 和 n 是表示两个数据规模。我们无法事先评估 m 和 n 谁的量级大,所以我们在表示复杂度的时候,就不能简单地利用加法法则,省略掉其中一个。所以,上面代码的时间复杂度就是 O(m+n)。
- 针对这种情况,原来的加法法则就不正确了,我们需要将加法规则改为:T1(m) + T2(n) = O(f(m) + g(n))。但是乘法法则继续有效:T1(m)*T2(n) = O(f(m) * f(n))。
网友评论