首页 > 其他分享 >超越常规:斐波那契数列的极速计算技术3

超越常规:斐波那契数列的极速计算技术3

时间:2024-09-06 17:21:13浏览次数:5  
标签:数列 复杂度 矩阵 long 斐波 那契 极速

针对斐波那契数列算法进行详细介绍和优化,从最简单的递归方法到更高效的迭代、缓存、动态规划、公式推导和矩阵解法,最终达到了时间复杂度为O(logn)的快速幂矩阵解法来感受算法的神奇之处,最后可以看到如何实现在输入n=2100000000(21亿)时仅耗时0.02毫秒的最佳效果。

一、回顾斐波那契数列

斐波那契数列(Fibonacci sequence)是一种非常经典的数学序列,其特点是每个数字是前两个数字之和,起始于0和1。也就是说,数列的第三个数是前两个数的和,第四个数是第二个数和第三个数的和,以此类推。斐波那契数列的前几项是:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ...

这个数列最早是意大利数学家斐波那契(Fibonacci)在其《算盘书》(1202年)中引入的,用来描述兔子繁殖的理想化情况。假设一对刚出生的兔子一年后成熟并能生育,且从第二年开始每年产下一对新兔子,不考虑其他因素的影响。这个问题导致了斐波那契数列的产生,兔子的对数就对应了斐波那契数列的每一项。

那通过算法实现求第n个斐波那契数的具体数值,让我们感受下算法的不断优化和极致表现。

二、矩阵解法+快速幂解法分析

基本思想是利用矩阵乘法的性质,将斐波那契数列的递推关系表示为矩阵形式,然后通过快速幂算法来快速计算矩阵的高次幂,从而得到斐波那契数列的第n项的值。

三、代码展示

package org.zyf.javabasic.algorithm;
 
/**
 * @program: zyfboot-javabasic
 * @description: 使用矩阵解法结合快速幂
 * @author: zhangyanfeng
 * @create: 2024-04-25 01:06
 **/
public class MatrixFibonacciWithFastPower {
    private static final long[][] INIT_MATRIX = {{1, 1}, {1, 0}};
    private static final long[][] UNIT_MATRIX = {{1, 0}, {0, 1}};
 
    public static long getFibonacciByMatrixAndFastPower(int index) {
        // 检查索引的有效性
        if (index <= 0) {
            throw new IllegalArgumentException("Index must be a positive integer");
        }
 
        // 边界情况处理
        if (index == 1 || index == 2) {
            return 1;
        }
 
        // 初始结果为单位矩阵
        long[][] result = UNIT_MATRIX;
        long[][] temp = INIT_MATRIX;
        int m = index - 2;
 
        // 利用快速幂算法计算矩阵的高次幂
        while (m != 0) {
            if ((m & 1) == 1) {
                result = matrixMultiply(temp, result);
            }
            temp = matrixMultiply(temp, temp);
            m >>= 1;
        }
 
        // 结果矩阵的第一个元素即为斐波那契数列的第n项的值
        return result[0][0];
    }
 
    // 矩阵乘法
    private static long[][] matrixMultiply(long[][] a, long[][] b) {
        long[][] result = new long[2][2];
        result[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0];
        result[0][1] = a[0][0] * b[0][1] + a[0][1] * b[1][1];
        result[1][0] = a[1][0] * b[0][0] + a[1][1] * b[1][0];
        result[1][1] = a[1][0] * b[0][1] + a[1][1] * b[1][1];
        return result;
    }
 
    public static void main(String[] args) {
        // 计算第100000项的斐波那契数
        long startTime1 = System.nanoTime();
        long fibonacci100000 = MatrixFibonacciWithFastPower.getFibonacciByMatrixAndFastPower(100000);
        long endTime1 = System.nanoTime();
        double elapsedTime1 = (endTime1 - startTime1) / 1_000_000.0; // 转换为毫秒
        System.out.println("Fibonacci(100000) = " + fibonacci100000);
        System.out.println("耗时:" + elapsedTime1 + "毫秒");
 
        // 计算第2100000000项的斐波那契数
        long startTime2 = System.nanoTime();
        long fibonacci2100000000 = MatrixFibonacciWithFastPower.getFibonacciByMatrixAndFastPower(2100000000);
        long endTime2 = System.nanoTime();
        double elapsedTime2 = (endTime2 - startTime2) / 1_000_000.0; // 转换为毫秒
        System.out.println("Fibonacci(2100000000) = " + fibonacci2100000000);
        System.out.println("耗时:" + elapsedTime2 + "毫秒");
    }
}

四、性能分析

时间复杂度分析:计算第n项斐波那契数需要进行快速幂运算,时间复杂度为O(log n)。这是因为快速幂算法的时间复杂度为O(log n),在算法中只需进行log n次乘法运算。在快速幂运算中,每次矩阵相乘的时间复杂度为O(1)。因此,总的时间复杂度为O(log n)。
空间复杂度分析:算法中使用的空间主要由两个矩阵所占用的空间决定。这两个矩阵分别是初始矩阵和结果矩阵,都是固定大小的2x2矩阵。因此,空间复杂度为O(1),即常数级别的空间复杂度。
实际运行发现当n为10万时耗时0.013125毫秒,n为21亿时耗时0.022042毫秒。

矩阵解法结合快速幂的斐波那契数列算法具有优秀的时间复杂度O(log n)和空间复杂度O(1),适用于需要高效计算大数值斐波那契数列的场景。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/xiaofeng10330111/article/details/138143503

标签:数列,复杂度,矩阵,long,斐波,那契,极速
From: https://blog.csdn.net/2401_86609655/article/details/141957560

相关文章

  • 例2.12 分别编写求n!和输出斐波那契数列的函数,并用两个函数进行测试
    例2.12分别编写求n!和输出斐波那契数列的函数,并用两个函数进行测试2.12.1deffactorial(n):r=1whilen>1:r*=nn-=1returnrdeffib(n):a,b=1,1whilea<n:print(a,end="")a,b=b,a+bprint('%d!=%d'%(......
  • 极速全景图下载出错显示Permission denied怎么回事
    在极速全景图下载大师下载拼接全景图的过程中,出现了错误,提示错误信息: creating file kvmem_xxxxx_xxxxx.swapfailed:Permissiondenied(errno=13)  经过排查,上述错误是由以下原因导致的:- 系统运行内存不足,导致在拼接过程无法创建缓存文件,导致出错解决......
  • 360安全卫士极速版,如何查找恢复区,隔离区,信任区
    我已经使用360安全卫士极速版已经2年时间,在个人使用感受上,说实话我觉得很不错,至少没有广告。如果有朋友是360安全卫士的使用者,我推荐你们使用安全极速版界面更加清晰,简洁,好用。很多功能都没有删减,可以说是保留360安全卫士的核心功能下载地址:360官网_360安全卫士极速版_360官方下......
  • 代码随想录算法训练营第32天|509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
    目录509.斐波那契数1、题目描述2、思路3、code4、复杂度分析70.爬楼梯1、题目描述2、思路3、code746.使用最小花费爬楼梯1、题目描述2、思路3、code4、复杂度分析509.斐波那契数题目链接:link1、题目描述斐波那契数(通常用F(n)表示)形成的序列称为斐波那......
  • 极速掌握MinIO对象存储:从零部署到实战操作全攻略
    文章目录介绍安装部署安装服务器开放服务使用端口挂载磁盘安装MinIO创建目录下载安装文件设置执行权限目录结构如下所有节点都需要执行上述步骤编写启动脚本使用Console使用JavaApi调用获取永久链接可能报的错误错误1:ispartofrootdrive,willnotbeused错误2:Therequestsig......
  • 关于斐波那契数列
    问题输入整数N,求出斐波那契数列中的第N项是多少。斐波那契数列的第0项是0,第1项是1,从第2项开始的每一项都等于前两项之和。输入格式第一行包含整数T,表示共有T个测试数据。接下来T行,每行包含一个整数N。输出格式每个测试数据输出一个结果,每个结果占一行,结果格式为Fib(N)......
  • Go入门:gin框架极速搭建图书管理系统
    Go入门:gin框架极速搭建图书管理系统前言本项目适合Golang初学者,通过简单的项目实践来加深对Golang的基本语法和Web开发的理解。项目源码请私信,欢迎前往博主博客torna.top免费查看。项目结构D:.├─go.mod├─go.sum│├─cmd│└─main│......
  • Linux性能调优大作战:从零到英雄,手把手教你打造极速系统!让你的服务器快如闪电!
    第一章引言Linux系统性能调优在信息技术领域具有不可忽视的重要性。随着Linux操作系统的广泛应用,从桌面环境到大型服务器集群,其性能优化变得尤为关键。调优不仅可以提升系统的响应速度和吞吐量,还能降低资源消耗,从而延长硬件使用寿命,减少总体拥有成本。本文研究旨在深入探讨Li......
  • 斐波那契数列相关性质推导及证明
    大部分是上课做的笔记,包含我自己的一些思考的推导,希望可以帮助到大家!(更好的阅读体验)洛谷专栏查看:点击此处\(fib_{n+k}=fib_n\timesfib_{k+1}+fib_{n-1}\timesfib_{k}\)经典模型:一段台阶有\(n\)阶,从第\(\mathbf{1}\)阶开始,每次可以向上跳\(1\)阶或\(2\)阶,跳到第......
  • 全网最易懂的解题——C语言“求斐波那契数(递归)”
    那先来知道什么是斐波那契数列吧前两个数相加等于第三个数,如果其中数字都满足此条件,那么这就是斐波那契数列 现在我们要求第n个斐波那契数,代码框架先搭出来吧,找斐波那契数的函数就命名为Fib吧//求斐波那契数intmain(){ intn=0; printf("请输入你想知道第几个斐波......