什么是复杂度分析
- 复杂度也叫渐进复杂度,包括时间复杂度和空间复杂度,用来分析算法执行效率与数据规模之间的增长关系,可以粗略地表示,越高阶复杂度的算法,执行效率越低
- 表示的是代码执行时间或者空间占用随着数据规模增长的变化趋势,而不是真正的代码执行时间和空间占用大小
时间复杂度分析的方法
时间复杂度主要主要有三个比较实用的方法
- 只关注循环执行次数最多的一段代码
我们分析一段代码的时间复复杂度的时候,也只关注循环执行次数最多的这段代码就可以了
int cal(int n){
int sum = 0;
for(int i = 0; i < n; i++){
sum += i; //只需要关注这句执行次数最多的代码即可
}
return sum;
}
- 加法法则:总复杂度等于量级最大的那部分代码的复杂度
如下代码的section1段代码的时间复杂度为O(1),section2段代码的时间复杂度为O(n),section3段代码的时间复杂度为O(n2),所以取时间复杂度最大的时间复杂度O(n2)
int call(int n){
int sum1 = 0;
int sum2 = 0;
int sum3 = 0;
//section1
for(int i = 0; i < 100; i++){
sum1 += i; //时间复杂度O(1)
}
//section2
for(int i = 0; i < n; i++){
sum2 += i; //时间复杂度O(n)
}
//section3
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
sum3 += i * j; //时间复杂度O(n^2)
}
}
return (sum1 + sum2 + sum3);
}
- 乘法法则:嵌套代码的时间复杂度等于嵌套内外代码时间复杂度的乘积
int call(int n){
int ret = 0;
for(int i = 0; i < n; i++){
ret = ret + f(i); //时间复杂度为O(n^2)
}
return ret;
}
int f(int n){
int sum = 0;
for(int i = 0; i < n; i++){
sum += i;
}
return sum; //时间复杂度为O(n)
}