1,什么是算法?
- 算法是用于解决特定问题的一系列的解决步骤
- 例如:
-
//计算a和b的和 public static int plus(int a,int b){ return a + b;} //计算1+2+3+...+n的和 public static int sum(int n){ int result = 0; for(int i = 0; i < n; i ++){ result += i; } return result; }
2,使用不同的算法,解决同一个问题,效率可能会相差很大
-
例如:斐波那契数: (0,1,1,2,3,5,8,13,21,34,55.........n ),前两个数相加的和做为第三个数,依次类推
-
求第n个斐波那契数:
//方法一 public static int fib1(int n){ if(n <= 1) return n; //第(n-1)和 第(n-2)相的和就是第n个斐波那契数 return fib1(n - 1) + fib1(n - 2); } 复杂度:O(2^n)
//方法二 public static int fib2(int n){ if(n <= 1) return n;
int first = 0;//第一个数 int second = 1;//第二个数 for(int i = 0; i < (n - 1);i ++){ int sum = first + second; first = second;//把第二个数付给第一个 second = sum;//把求的和付给第二个 } return second;//返回第二个的值
} 复杂度:O(n)
3,如何评价一个算法的好坏?
3.1,一般从以下的维度进行判断
- 正确性,可读性,健壮性
- 时间复杂度:估算程序指令的执行次数(估算执行的时间)
- 空间复杂度:估算程序所需占用的空间
3.2,大O表示法
- 一般用大O法来表示复杂度,他表示数据模型n对应的复杂度
- 注意:大O法只是一种初略的分析模型,是一种估算,帮助我们在短时间内了解一个算法的执行效率。
3.3,对数的复杂度处理
- 对数一般忽略底数
3.4,常见的复杂度
4,斐波那契数时间复杂度的分析
4.1,方法一
//方法一
public static int fib1(int n){
if(n <= 1) return n;
//第(n-1)和 第(n-2)相的和就是第n个斐波那契数
return fib1(n - 1) + fib1(n - 2);
}
复杂度:O(2^n)
4.2,方法二
//方法二复杂度计算
public static int fib2(int n){
if(n <= 1) return n;
int first = 0;
int second = 1;
// 1 + (n - 1)+ n
for(int i = 0; i < (n - 1);i ++){
int sum = first + second;
first = second;//把第二个数付给第一个
second = sum;//把求的和付给第二个
}
return second;//返回第二个的值
}
复杂度:O(n)
一、在for循环计算复杂度:
- int i = 0; 复杂度为:1
- i < n - 1; 复杂度为:n - 1
- i ++; 复杂度为:n
二、for循环里面计算复杂度:
- 里面复杂度为:n
所以复杂度为:1 + n - 1 + n + n= 3n , 忽略系数,所以复杂度为:O(n)