趣学算法|斐波那契 矩阵算法
admin
2024-01-17 16:12:15
0

14天阅读挑战赛
努力是为了不平庸~
算法学习有些时候是枯燥的,这一次,让我们先人一步,趣学算法!

算法知识点

矩阵乘法特征:

1,当矩阵A的列数等于矩阵B的行数时,A与B可以相乘。

2,矩阵C的行数等于矩阵A的行数,C的列数等于B的列数。

3,乘积C的第m行第n列的元素等于矩阵A的第m行的元素与矩阵B的第n列对应元素乘积之和。

算法题目来源

斐波那契数列又称“斐波那契神奇数列”,是由13世纪的意大利数学家斐波那契提出的,当时是和兔子的繁殖问题有关的,它是一个很重要的数学模型。

算法题目描述

有小兔一对,若第二个月它们成年,第三个月生下小兔一对,以后每月生产一对小兔,而所生小兔亦在第二个月成年,第三个月生产另一对小兔,以后亦每月生产小兔一对,假定每产一对小兔必为一雌一雄,且均无死亡,试问一年后共有小兔几对?

算法推导

矩阵法斐波那契
F(1) = F(2) = 1
F(n) = F(n-1)+F(n-2)矩阵转化:
[F(n) F(n-1)] 
= [F(n-1)+F(n-2) F(n-1)+0]
= [[1 1] [1 0]]   *  [F(n-1) F(n-2)]
= [[1 1] [1 0]]   *  [F(n-2)+F(n-3) F(n-3)+0]
= [[1 1] [1 0]]^2 *  [F(n-2) F(n-3)]
= [[1 1] [1 0]]^2  *  [F(n-3)+F(n-4) F(n-4)+0]
= [[1 1] [1 0]]^3 *  [F(n-3) F(n-4)]
.......
= [F(2) F(1)] * [[1 1] [1 0]]^(n-2) 

算法实现

/*** 矩阵法斐波那契* F(1) = F(2) = 1* F(n) = F(n-1)+F(n-2)* [F(n) F(n-1)]* = [F(n-1)+F(n-2) F(n-1)+0]* = [[1 1] [1 0]]   *  [F(n-1) F(n-2)]* = [[1 1] [1 0]]   *  [F(n-2)+F(n-3) F(n-3)+0]* = [[1 1] [1 0]]^2 *  [F(n-2) F(n-3)]* = [[1 1] [1 0]]^2  *  [F(n-3)+F(n-4) F(n-4)+0]* = [[1 1] [1 0]]^3 *  [F(n-3) F(n-4)]* .......* = [[1 1] [1 0]]^(n-2) * [F(2) F(1)]* @param n* @return*/public static double matrixFbnq(int n){if(n==1){return 1;}if(n == 2){return 1;}double[][] a = new double[2][2];a[0][0] = 1;a[0][1] = 1;a[1][0] = 1;a[1][1] = 0;Matrix matrix = new Matrix(a);Matrix b = Matrixs.mutils(matrix,n-2);double[][] c = new double[2][1];c[0][0] = 1;c[1][0] = 1;Matrix e = Matrixs.mutil(b,new Matrix(c));return e.getMatrix()[0][0];}
public class Matrix{// 矩阵private double[][] matrix;// m x n private int m;private int n;public double[][] getMatrix() {return matrix;}public Matrix() {}public Matrix(double[][] matrix) {this.matrix = matrix;this.m=matrix.length;this.n=matrix[0].length;}public Matrix(int m, int n) {this.matrix=new double[m][n];this.m=m;this.n=n;}public void setMatrix(double[][] matrix) {this.matrix = matrix;this.m=matrix.length;this.n=matrix[0].length;}public int getM() {return m;}public void setM(int m) {this.m = m;}public int getN() {return n;}public void setN(int n) {this.n = n;}@Overridepublic String toString() {return "Matrix{" +"matrix=" + Arrays.toString(matrix) +'}';}
}
 /*** 矩阵的幂运算* @param m 矩阵对象* @param count  运算次数* @return  如果矩阵不是方阵,则矩阵无法进行*/public static Matrix  mutils(Matrix m,int count){if(m==null||m.getM()!=m.getN()){return null;}double[][] matrix = m.getMatrix();Matrix result = new Matrix(matrix);// [A]^countfor (int i=0;i

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...