斐波那契数列

斐波那契数列 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;
}

使用动态规划为最优解 时间复杂度和空间复杂度均最低

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值