算法复杂度分析能够评判出代码的好坏,帮助我们编写性能更优的代码
算法复杂度分析包含两个内容:时间复杂度+空间复杂度,通常就是时间复杂度分析,现在电脑内存都不错空间复杂度可以忽略.
时间复杂读就是评估代码的执行耗时的,我们需要借助大O表示法来计算这个代码的时间复杂度.
大O表示法:不具体表示代码真正的执行时间,而是代表代码执行时间随数据规模增长的变化趋势.
public int sum(int n) {
int sum = 0;
for ( int i = 1; i <= n; i++) {
sum = sum + i;
}
return sum;
}
int sum=0、int i =1、return sum 这三行代码是固定的
i <= n、i++、sum = sum + i 这三行代码是随n变化的
固代码总耗时T(n) = (3n + 3) * 每行代码执行时长(假设每行代码执行时长相同),得出结论T(n) 与执行次数n成正比,大O表示法只需代将代码执行时长与数据规模的增长趋势表示出来即可,n很大的时候,公式里的低阶、常量、系数三部分可以忽略,所以大O表示法最终简化为T(n) = O(n)
常见复杂度表示形式如下表,越往上性能越高,越往下性能就越低
下面为时间复杂度的时间与数据规模的趋势关系
举例如下
public void test(int n){
int i=0;
int sum=0;
for(;i<100;i++){
sum = sum+i;
}
System.out.println(sum);
}
代码循环次数是固定的100次,代码复杂度为O(1)
public static int sum(int n){
int sum = 0;
for (int i = 1; i < n; ++i) {
for (int j = 1; j < n; ++j) {
sum = sum + i * j;
}
}
return sum;
}
public void test04(int n){
int i=1;
while(i<=n){
i = i * 2;
}
}
2^X=n,高中数学,x记作以2为底n的对数,代码复杂度为O(log n)
public void test01(int n){
int i=0;
for(;i<=n;i++){
test04(n);
}
}
public void test02(int n){
int i=1;
while(i<=n){
i = i * 2;
}
}
有上述拓展,代码复杂度为O( n * log n )
空间复杂度(全程为渐进空间复杂度),表示算法占用额外存储空间与数据规模之间的增长关系
public void test(int n){
int i=0;
int sum=0;
for(;i<n;i++){
sum = sum+i;
}
System.out.println(sum);
}
无需额外的空间存储,空间复杂度为O(1)
void print(int n) {
int i = 0;
int[] a = new int[n];
for (i; i <n; ++i) {
a[i] = i * i;
}
for (i = n-1; i >= 0; --i) {
System.out.println(a[i]);
}
}
传入的变量n,决定申请多少int数组空间内存,代码空间复杂度为O(n)