趣学算法|神奇的兔子数列

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

时间复杂度由指数级 降到 多项式 ,线性匀速增长,时间可控,优化效果比较明显。

注:本文所引算法及思路来自于趣学算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fjza1168

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值