了解复杂度分析,数据结构和算法中复杂度分为时间复杂度和空间复杂度,我们用大O表示法,时间复杂度分析用三种方法分析:
1、只关注循环执行次数最多的一段代码,以下代码复杂度为O(n)
private int cal(int n){
int sum = 0;
int i = 0;
for(; i<=n; i++){
sum = sum + i;
}
return sum;
}
2. 加法法则:总复杂度等于量级最大的那段代码的复杂度,以下代码复杂度为O(n²)
int cal(int n){
int sum = 0;
int sum2 = 0;
for(int i = 1; i <= n; i++){
sum = sum + i;
}
for(int i=1; i <= n; i++){
for(int j=1 ; j <= n; j++){
sum2 = sum2 + j * i;
}
}
return sum + sum2;
}
3. 乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积,以下代码复杂度为O(n²)
int cal(int n){
int sum = 0;
for(int i = 0; i < n; i++){
sum = sum + sum2(i);
}
return sum;
}
int sum2(int n){
int sum2 = 0;
for(int i=0;i < n; i++){
sum2 = sum2 + i;
}
return sum2;
}
以下是常见的几种时间复杂度(复杂度量级依次递增):
- 常量阶 O(1)
- 对数阶 O(logn)
- 线性阶 O(n)
- 线性对数阶 O(nlogn)
- 平方阶 O(n²) 、立方阶 O(n³) ▪▪▪ k次方阶 O(n^k)
- 指数阶 O(2^n)
- 阶层阶 O(n!)
以上可以简单分两类,前面的属于多项式量级,最后两种属于非多项式量级,当数据规模 n 越来越大时,非多项式量级算法的执行时间会急剧增加,求解问题的时间会无限增长;
int[] a = new int[n];
这段代码的空间复杂度就是为O(n)。