数据算法之斐波那契数列

文章介绍了斐波那契数列的定义及如何使用递归代码实现,指出了基本实现的时间复杂度为指数级。然后,文章探讨了利用Memoization优化技术来降低时间复杂度至线性,并提供了优化后的代码示例。通过这种方法,可以使用空间换取时间,提高算法效率。
摘要由CSDN通过智能技术生成

斐波那契数列


斐波那契数列就是在一个数列中,每前两项数数据之和都为第三项数据,这样的数列称之为斐波那契数列。`

使用代码实现斐波那契数列

主要使用的是多路递归的思想实现斐波那契数列

代码示例

public static int f(int n) {
if (n == 0) {
return 0;
}
if (n == 1) {
return 1;
}
return f(n - 1) + f(n - 2);
}
时间复杂度

● 递归的次数也符合斐波那契规律, 2 ∗ f ( n + 1 ) − 1 2 * f(n+1)-1 2f(n+1)1
● 时间复杂度推导过程
● 斐波那契通项公式 f ( n ) = 1 5 ∗ ( 1 + 5 2 n − 1 − 5 2 n ) f(n) = \frac{1}{\sqrt{5}}*({\frac{1+\sqrt{5}}{2}}^n - {\frac{1-\sqrt{5}}{2}}^n) f(n)=5 1(21+5 n215 n)
● 简化为: f ( n ) = 1 2.236 ∗ ( 1.618 n − ( − 0.618 ) n ) f(n) = \frac{1}{2.236}*({1.618}^n - {(-0.618)}^n) f(n)=2.2361(1.618n(0.618)n)
● 带入递归次数公式 2 ∗ 1 2.236 ∗ ( 1.618 n + 1 − ( − 0.618 ) n + 1 ) − 1 2*\frac{1}{2.236}*({1.618}^{n+1} - {(-0.618)}^{n+1})-1 22.2361(1.618n+1(0.618)n+1)1
● 时间复杂度为 Θ ( 1.61 8 n ) \Theta(1.618^n) Θ(1.618n)
1 . 更多 Fibonacci 参考[8][9][^10]
2 . 以上时间复杂度分析,未考虑大数相加的因素

Memoization 记忆法

是一种优化技术,通过存储函数调用结果(通常比较昂贵),当再次出现相同的输入(子
问题)时,就能实现加速效果,

代码示例

     public static void main(String[] args) {
            int n = 13;
            int[] cache = new int[n + 1];
            Arrays.fill(cache, -1);//使用Arrays类对数组进行初始化
            cache[0] = 0;//n=0,结果为0;
            cache[1] = 1;//n=1,结果为1;
            System.out.println(f(cache, n));
        }
        public static int f(int[] cache, int n) {
            if (cache[n] != -1) {
                return cache[n];
            }
            cache[n] = f(cache, n - 1) + f(cache, n - 2);//将已经得到结果的数据存储到数组
            return cache[n];
        }

● 改进后的时间复杂度为 O ( n ) O(n) O(n)
注意:
1 . 记忆法是动态规划的一种情况,强调的是自顶向下的解决。
2 . 记忆法的本质是空间换时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值