一算法效率
1.时间效率:时间复杂度
代码执行的次数为时间复杂度。
举例:
pulblic static void main(String[] args){
int n ;
for(int i = 0; i < n ;i++){
}
for(int i = 0; i < n ;i++){
for(int j = 0; j < n ;j++){
sum = sum + j;
}
}
}
时间复杂度:O(N) = n^2 + n;
当 n = 10时,算法时间复杂度:100+10;
当 n = 100时,算法时间复杂度:10000+100;
当 n = 1000时,算法时间复杂度:1000000+1000;
可以看出,影响算法的时间效率为最高阶的次数
递归函数的时间复杂度:
一个递归函数的时间复杂度,要把这个递归函数展开,看一下递归的次数与变量N的关系
1.阶乘的时间复杂度:
public static int jieChen(int num){
if (num == 2){
return num;
}
return num * jieChen(num-1);
}
将函数展开:num * (num -1) * (num -2) * ......* 2 * 1 —> 递归函数总共执行了n次,所以算法使劲按复杂度为O(N);
2.斐波那契时间复杂度;
public static int febonqie(int num){
if (num == 1 || num == 2){
return 1;
}
return febonqie(num-1)+febonqie(num-2);
}
展开:
相当于求二叉树的节点个数,相当于2^n - 1的时间复杂度,所以O(N) = N^2;
O的推到原则:
O(1)的表示常数次的时间复杂度
时间复杂度每次只保存最高阶,其他阶忽略,最高阶的系数也忽略。
三种时间复杂度:
1.最好时间复杂度:任意输入规模运行的最大时间
2.最坏时间复杂度:任意输入规模运行最小时间
3.平均时间复杂度:任意输入规模的期望时间
2.空间效率:空间复杂度
代码执行时额外开辟的空间大小为空间复杂度。
空间复杂度就看算法中是否开辟了数组空间
递归函数的空间复杂度:
函数每次递归调用开辟空间的大小 * 函数递归的次数