14天阅读挑战赛
努力是为了不平庸~
算法学习有些时候是枯燥的,这一次,让我们先人一步,趣学算法!
算法知识点
斐波那契数列
算法题目来源
斐波那契数列又称“斐波那契神奇数列”,是由13世纪的意大利数学家斐波那契提出的,当时是和兔子的繁殖问题有关的,它是一个很重要的数学模型。
算法题目描述
有小兔一对,若第二个月它们成年,第三个月生下小兔一对,以后每月生产一对小兔,而所生小兔亦在第二个月成年,第三个月生产另一对小兔,以后亦每月生产小兔一对,假定每产一对小兔必为一雌一雄,且均无死亡,试问一年后共有小兔几对?
算法推导
第一个月:一对新小兔
第二个月:一对成熟小兔
第三个月:一对孕育小兔,一对新小兔
第四个月:一对孕育小兔,一对新小兔,一对成熟小兔
第五个月:一对孕育小兔,一对新小兔,一对成熟小兔,一对孕育小兔,一对新小兔
······
第n个月:第n-1个月的小兔总数+第n-2个月的小兔总数
算法总结:F(n) = F(n-1)+F(n-2) , n>2
算法实现
/** * 斐波那契 * 递归算法 * @param n * @return */ public static int recursion(int n){ if(n==1){ return 1; } if(n == 2){ return 1; } return recursion(n-1)+recursion(n-2); }
算法复杂度分析
n=1 和 n=2 时,时间复杂度 T(n) = 1
n>2 时,时间复杂度 T(n) = T(n-1)+T(n-2)+1
时间复杂度计算
/** * 斐波那契算法时间复杂度 * @param n * @return */ public static Double timeCount(int n){ if(n == 1){ return 1d; } if(n == 2){ return 1d; } return timeCount(n-1) + timeCount(n-2) +1; }
算法分析
由图可以看出,斐波那契递归算法的时间复杂度,是指数级别的,很不幸我们遇到了指数炸弹,虽然12个月可以轻松计算,但算法指数级不可取。
常见时间复杂度:常数,多项式,对数,指数
迭代算法优化
/** * 斐波那契 * F(1) = F(2) = 1 * F(n) = F(n-1)+F(n-2) * @param n * @return */ public static int simpleFbnq(int n){ if(n==1){ return 1; } if(n == 2){ return 1; } // 时间复杂度 +1 // F(n-2)暂存 ,时间复杂度 +1 int f1 = 1; // F(n-1)暂存 ,时间复杂度 +1 int f2 = 1; // F(n)暂存 ,时间复杂度 +1 int fn = 0; for(int i=3;i<=n;i++){ fn = f1+f2; //时间复杂度 +1 f1 = f2;//时间复杂度 +1 f2 = fn;//时间复杂度 +1 } return fn; }
算法分析
根据算法可知,优化后算法时间复杂度(n>2): T(n) = 4+3(n-2) = 3n -2
时间复杂度由指数级 降到 多项式 ,线性匀速增长,时间可控,优化效果比较明显。
注:本文所引算法及思路来自于趣学算法