什么是算法
算法就是用于解决特定问题的一系列的执行步骤
一个简单的算法:
// 接收两个int 类型的整数,计算A + B 的值并返回
public static int plus(int a,int b){
return a + b;
}
求第n个斐波那契数
// 用递归来求
public static void main(String[] args) {
System.out.println(fib(12)); // 输出 144
}
public static int fib(int n){
if(n<=1)
return n;
return fib(n-1) + fib(n-2);
}
//用循环
public static void main(String[] args) {
System.out.println(fib2(12));
}
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;
}
}
循环来计算斐波那契数所消耗的时间要远远快于递归
好的算法会大节省计算机的使用资源
如何去判断一个算法的好坏
一般从以下维度来评估算法的优劣
- 正确性、可读性、健壮性(对不合理输入的反应能力和处理能力)
时间复杂度(time complexity): 估算程序指令的执行次数、执行时间)
空间复杂度(space complexity):估算所需占用的存储空间
大O表示法(Big O)
- 一般用大O表示法来描述复杂度,它表示的是数据规模n对应的复杂度
执行次数 | 复杂度 |
---|---|
12 12 12 | O ( 1 ) O(1) O(1) |
2 n + 3 2n + 3 2n+3 | O ( n ) O(n) O(n) |
4 n 2 + 6 4n^2+6 4n2+6 | O ( n 2 ) O(n^2) O(n2) |
4 l o g 2 n + 25 4log2^n+25 4log2n+25 | O ( l o g n ) O(logn) O(logn) |
3 n + 2 n l o g 3 n + 15 3n+2nlog3^n+15 3n+2nlog3n+15 | O ( n l o g n ) O(nlogn) O(nlogn) |
4 n 3 + 3 n 2 + 22 n + 100 4n^3+3n^2+22n+100 4n3+3n2+22n+100 | O ( n 3 ) O(n^3) O(n3) |
2 n 2^n 2n | O ( 2 n ) O(2^n) O(2n) |
Leetcode
https://leetcode-cn.com/problemset/all/.