用矩阵乘幂的方法,求斐波那契数列f(n)=f(n-1)+f(n-2),不用递归求,速度非常非常快

本文主要是介绍用矩阵乘幂的方法,求斐波那契数列f(n)=f(n-1)+f(n-2),不用递归求,速度非常非常快,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

用矩阵乘幂的方法,求斐波那契数列f(n)=f(n-1)+f(n-2),不用递归求,速度非常非常快!

提示:矩阵A的p次幂的快速乘法,是重要的优化算法基础知识

之前的基础:咱们求过数字最快速乘幂的方法(数字a的p次幂),
(1)最快乘法:普通数字a的p次幂怎么求速度最快,不用Math.pow(a,p)哦
(2)咱们求过矩阵最快速乘幂的方法(矩阵A的p次幂),
最快矩阵乘法:矩阵A的p次幂怎么求速度最快,Math根本没有求矩阵的幂次函数

这俩知识点,你必须看懂,否则这个文章你看不懂!
这俩知识点,你必须看懂,否则这个文章你看不懂!
这俩知识点,你必须看懂,否则这个文章你看不懂!

今天我们用矩阵的乘幂来求斐波那契数列f(n)
之前咱们用暴力递归和动态规划的方法,求过斐波那契数列:
(3)斐波那契数列:暴力递归改动态规划


文章目录

  • 用矩阵乘幂的方法,求斐波那契数列f(n)=f(n-1)+f(n-2),不用递归求,速度非常非常快!
    • @[TOC](文章目录)
  • 题目
  • 一、笔试AC解:暴力递归和动态规划求斐波那契数列(面试能将动态规划那个解)
  • 二、面试高超优化技巧:矩阵最快乘幂法求解
  • 总结

题目

用矩阵乘幂的方法,求斐波那契数列f(n)=f(n-1)+f(n-2),不用递归求,速度非常非常快


一、笔试AC解:暴力递归和动态规划求斐波那契数列(面试能将动态规划那个解)

之前咱们用暴力递归和动态规划的方法,求过斐波那契数列:
(3)斐波那契数列:暴力递归改动态规划
当时动态规划,就是填一个表,从1 2 填写到N,求dp[n],上面那个文章,我就不在这重复了,你去看懂,很简单。


二、面试高超优化技巧:矩阵最快乘幂法求解

情况是这样的,有一个关于斐波那契数列的基础理论

在这里插入图片描述
其实根据
n=1,f(n)=1
n=2,f(n)=1
n=3,f(n)=2
n=4,f(n)=5
……
可知:
上式子中的d矩阵为:
在这里插入图片描述
也就是说,斐波那契数列实际上有这么一个关系
在这里插入图片描述
所以,咱们,只需要把d的n-2次幂求出来不就完事了吗
然后取f(n)=ans[0][0]即可!!

是不是很妙??

你记住d就行,1110
这里就用到咱们的基础知识:
(2)咱们求过矩阵最快速乘幂的方法(矩阵A的p次幂),
最快矩阵乘法:矩阵A的p次幂怎么求速度最快,Math根本没有求矩阵的幂次函数
代码咱们直接贴过来用:

//C=A×B咋求public static int[][] matrixMul(int[][] A, int[][] B){int m = A.length;int b = B[0].length;int[][] C = new int[m][b];//A的一行,×B的一列,求和,放在C的m行,b列for (int i = 0; i < m; i++) {for (int j = 0; j < b; j++) {//A的一行,×B的一列,求和,放在C的m行,b列int ans = 0;for (int k = 0; k < A[0].length; k++) {//是A的列哦ans += A[i][k] * B[k][j];}C[i][j] = ans;}}return C;}//矩阵A的p次幂public static int[][] powMatrixAitsPCiMi(int[][] A, int p){int m = A.length;int n = A[0].length;//初始化,a=I,t=A的1次方int[][] a = new int[m][n];for (int i = 0; i < m; i++) {a[i][i] = 1;//单位阵}int[][] tmp = A;//基数矩阵//(1)p的0位x=1:a=a×t=1×A的1次方=A的1次方,t=t×t=A的2次方//(2)p的1位x=1:a=a×t=A的1次方=A的1次方×A的2次方,t=t×t=A的4次方//(3)p的2位x=0:~~a=a×t=A的1次方=A的1次方×A的2次方~~ ,t=t×t=A的8次方//(4)p的3位x=1:a=a×t=A的1次方=A的1次方×A的2次方×A的8次方,t=t×t=A的16次方//(5)p的4位x=0:~~a=a×t=A的1次方=A的1次方×A的2次方×A的8次方~~ ,t=t×t=A的32次方//(6)p的5位x=0:~~a=a×t=A的1次方=A的1次方×A的2次方×A的8次方~~ ,t=t×t=A的64次方//(7)p的6位x=1:a=a×t=A的1次方=A的1次方×A的2次方×A的8次方×A的64次方 ,t=t×t=A的128次方//此时a已经是A的p=75次方了//看p的x位是否为1for(; p != 0; p >>= 1){//每次结束p往右移动1位,p=0结束if ((p & 1) != 0){//p最右那个x位=1,需要雷×结果a = matrixMul(a, tmp);//a=a*t}//每次t都需要倍次幂tmp = matrixMul(tmp, tmp);//t=t*t}return a;//返回a}

下面咱们求:ans
在这里插入图片描述
手撕代码也很好理解

//求anspublic static int feiBoNaQiSeqReview(int n){if (n == 1) return 1;if (n == 2) return 1;int[][] m21 = {{1, 1}};//1*2矩阵哦//f2 f1 = 1 1int[][] d = {{1, 1},{1, 0}};//2*2矩阵哦//递归那个公式记住了//结果ans[0]=f(n)int[][] ans = matrixMul(m21, powMatrixAitsPCiMi(d, n - 2));return ans[0][0];}public static void test4(){System.out.println(feiBoNaQi2(5));System.out.println(feiBoNaQiSeqReview(5));}public static void main(String[] args) {test4();}

是不是超简单

5
5

这个矩阵幂次的求法,是不是跟递归不一样,速度贼快!


总结

提示:重要经验:

1)矩阵幂次求斐波那契数列适合在面试中秀一把,因为矩阵的幂次很快,这就是加速算法的高超技巧
2)斐波那契数列的递归矩阵公式,要记住,d=1110,方便怎么优化。
3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

这篇关于用矩阵乘幂的方法,求斐波那契数列f(n)=f(n-1)+f(n-2),不用递归求,速度非常非常快的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/291336

相关文章

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

判断PyTorch是GPU版还是CPU版的方法小结

《判断PyTorch是GPU版还是CPU版的方法小结》PyTorch作为当前最流行的深度学习框架之一,支持在CPU和GPU(NVIDIACUDA)上运行,所以对于深度学习开发者来说,正确识别PyTor... 目录前言为什么需要区分GPU和CPU版本?性能差异硬件要求如何检查PyTorch版本?方法1:使用命

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Java中的工具类命名方法

《Java中的工具类命名方法》:本文主要介绍Java中的工具类究竟如何命名,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java中的工具类究竟如何命名?先来几个例子几种命名方式的比较到底如何命名 ?总结Java中的工具类究竟如何命名?先来几个例子JD

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

python获取网页表格的多种方法汇总

《python获取网页表格的多种方法汇总》我们在网页上看到很多的表格,如果要获取里面的数据或者转化成其他格式,就需要将表格获取下来并进行整理,在Python中,获取网页表格的方法有多种,下面就跟随小编... 目录1. 使用Pandas的read_html2. 使用BeautifulSoup和pandas3.

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Pandas统计每行数据中的空值的方法示例

《Pandas统计每行数据中的空值的方法示例》处理缺失数据(NaN值)是一个非常常见的问题,本文主要介绍了Pandas统计每行数据中的空值的方法示例,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是空值?为什么要统计空值?准备工作创建示例数据统计每行空值数量进一步分析www.chinasem.cn处