1、什么是算法?
算法是用于解决特定问题的一系列的执行步骤,不论代码的长短,只要是为了解决特定问题的步骤都是算法
解决同一个问题,使用不同的算法,效率相差非常大
eg:求第n个斐波那契数(0 1 1 2 3 5 8 13 简单来说就是每个数是它的前面两个数相加)
package com.mj;
import java.util.zip.Inflater;
public class Main {
/*
* 斐波那契数:0 1 1 2 3 5 13 18 ...
* 方法1
*/
public static int fib1(int n) {
if (n<=1) return n;
return fib1(n-1)+fib1(n-2);
}
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;
}
public static void main(String[] args) {
System.out.println(fib1(70));
}
}
测试算法复杂度方法一:可以计算算法运行的时间从而比较效率
可以看到当n=46时,两个算法花费的时间差距已经非常大了
2、如何评判一个算法的好坏?
- 时间复杂度:估算程序指令的执行次数(执行时间)
- 空间复杂度:估计所需占用的存储空间
2.1、大O表示法
- 用来描述复杂度,它表示的是数据规模n对应的复杂度
- 忽略常数、系数、低阶
- 对数阶一般省略底数
常见的复杂度
算法1 计算慢的原因:
算法的优化方向:
- 用尽量少的存储空间
- 用尽量少的执行步骤(执行时间)
- 根据实际情况还可以时间换空间或者空间换时间