斐波那契数列 1 1 2 3 5 8 13 21 。 。 。 。 。 。 。
主函数
public static void main(String[] args) {
long startTime = System.nanoTime();
getNumber(30);
long endTime = System.nanoTime();
System.out.println("消耗时间:"+(endTime-startTime)+"ns");
}
方式1、 递归算法 消耗时间:3880907ns
m为要计算的第m项
算法思想: 使用递归
public static int getNumber(int m){
if(m == 1 || m == 2){
return 1;
}
return getNumber(m-1)+getNumber(m-2);
}
方式2、 备忘录算法 消耗时间:145983ns
内部也是使用了递归思想,但是由于递归需要重复的计算已经计算的项,大大的提高了时间复杂度和空间复杂度
因此使用Map集合 将所有计算出的项存放到Map集合中,如果有需要已知的项,那么直接从集合获取已知项,未知项则计算出来,再将其存放到集合中
private static Map<Integer, Integer> map = new HashMap<Integer, Integer>();
private static int getNumber(int m) {
if(m == 1 || m == 2){
return 1;
}
if(map.containsKey(m)){
return map.get(m);
}else{
int value = getNumber(m-1)+getNumber(m-2);
map.put(m, value);
return value;
}
}
方式3、 动态规划 消耗时间:3527ns
从下往上计算 定义 a b 两个数 用来存放前两项 再使用temp来计算两项之和
a + b = temp
_ _ a + b = temp
将 b 赋值给 a temp 赋值给b 再使用temp = a + b
/*
* 前面的方式都是通过从上往下获取数据
*/
private static int getNumber(int m) {
if(m == 1 || m == 2){
return 1;
}
int a = 1;
int b = 1;
int temp=0;
for(int x=3;x<=m;x++){
temp = a + b;
a = b;
b = temp;
}
return temp;
}
使用动态规划为最优解 时间复杂度和空间复杂度均最低