斐波那契数列(二)--矩阵优化算法

之前写了一篇从斐波那契数列分析递归与动态规划(JAVA)来优化斐波那契数列,这样可以使算法的时间复杂度从O(n^2)变到O(n),这是使用递归公式f(n)=f(n-1)+f(n-2)求斐波那契数列的最优算法,但是这只是一维世界下的极限。下面我们将其从一维上升到二维,用二阶矩阵推导斐波那契数列,该算法的复杂度为O(logn)。

矩阵定义

一个m*n的矩阵是一个由m行n列元素排成的矩形阵列。矩阵里的元素可以是数字符号或者数学式.

下面是一个典型的二阶矩阵



                    

二阶矩阵的乘法

         


高效幂运算



第一种方法在高效幂运算(JAVA)中有类似的描述,虽然本文中是对矩阵进行幂运算,实质是一样的

第二种方法利用位运算转换成二进制处理

斐波那契数列的矩阵算法

import java.util.Scanner;/***  [F(n+1) F(n)]    [1  1 ]^n|           |   =|     |[F(n) F(n-1)]    [1  0 ]* */
public class Main {// 公式矩阵  private static final int[][] UNIT = {{1, 1}, {1, 0}};// 零矩阵  private static final int[][] ZERO = {{0, 0}, {0, 0}};public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();int[][] m = fb(n);System.out.println(m[0][1]);}/*** 利用二进制进行高效幂运算* 求斐波那契数列* */public static int[][] fb(int n) {if (n == 0) {return ZERO;}if (n == 1) {return UNIT;}if (n%2 == 0) {System.out.println(n >> 1);int[][] matrix = fb(n >> 1);return Multiply(matrix, matrix);} else {int[][] matrix = fb((n - 1) >> 1);return Multiply(Multiply(matrix, matrix), UNIT);}}/*** 矩阵乘法* */public static int[][] Multiply(int[][] m, int[][] n) {/*** 对于斐波那契数列来说,行和列都是2,这样写更易于理解,下面也给出了标准的矩阵乘法算法,是通用的* 用到此算法,除非进行算法学习和研究,否则一般都是进行较大数据的斐波那契求值,所以对结果取(10e9)+7的模* */int[][] r = new int[2][2];r[0][0] = (m[0][0]*n[0][0] + m[0][1]*n[1][0])%1000000007;r[0][1] = (m[0][0]*n[0][1] + m[0][1]*n[1][1])%1000000007;r[1][0] = (m[1][0]*n[0][0] + m[1][1]*n[1][0])%1000000007;r[1][1] = (m[1][0]*n[0][1] + m[1][1]*n[1][1])%1000000007;return r;}
}

标准矩阵乘法算法:

    public static int[][] Multiply(int[][] m, int[][] n) {
//        标准计算矩阵乘法算法int rows = m.length;int cols = n[0].length;int[][] r = new int[rows][cols];for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {r[i][j] = 0;for (int k = 0; k < m[i].length; k++) {r[i][j] += m[i][k] * n[k][j];}}}return r;}
}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/569804.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第六届省赛(软件类)真题----Java大学B组答案及解析

第六届省赛&#xff08;软件类&#xff09;真题----Java大学B组答案及解析三角形面积立方变自身三羊献瑞循环节长度九数组分数加法变乘法牌型种数饮料换购垒骰子生命之树 一、三角形面积如【图1】所示。图中的所有小方格面积都是1。那么&#xff0c;图中的三角形面积应该是多少…

【学习总结】GirlsInAI ML-diary day-11-while循环

【学习总结】GirlsInAI ML-diary 总 原博github链接-day11 认识while循环执行 对于while/break/continue的认识 新值替换变量 一般while语句 无限循环 & break continue 作业 1-更新变量 这一条没什么新的东西&#xff0c;别的语言也一样&#xff1a;python在赋值时&#x…

第六届省赛(软件类)真题----Java大学A组答案及解析

第六届省赛&#xff08;软件类&#xff09;真题----Java大学A组答案及解析熊怪吃核桃星系炸弹九数分三组循环节长度打印菱形加法变乘法牌型种数移动距离垒骰子灾后重建一、熊怪吃核桃森林里有一只熊怪&#xff0c;很爱吃核桃。不过它有个习惯&#xff0c;每次都把找到的核桃分成…

@PathVariable、@RequestParam、@RequestBody注解

讲解更加详细的参考资料 https://blog.csdn.net/u011410529/article/details/66974974 https://www.cnblogs.com/soul-wonder/p/8920553.html PathVariable注解的作用&#xff0c;获取请求地址中传递的参数&#xff0c;即&#xff1a;从URL模版中取值。 RequestParam 是从reque…

从背包问题优化详解动态规划思想

动态规划&#xff1a; 所有的数据结构与算法的理解必须建立在题目的练习上&#xff0c;否则看多少理论都没有实际用处&#xff01;&#xff01;&#xff01;所以下面这些理论文字看不懂通通没关系&#xff0c;跟随下面的背包问题还会跟深入的理解。一、基本概念&#xff1a;任何…

js判断数组里是否有重复元素的方法

转&#xff1a; js判断数组里是否有重复元素的方法 https://blog.csdn.net/longzhoufeng/article/details/78840974第一种方法&#xff1a;但是下面的这种方法数字字符串类似相同&#xff0c;返回的还是真&#xff0c;有点不靠谱&#xff0c;如果是其它的字符是可以的 var ary1…

深入浅出讲算法思想--蛮力法思想分析及应用

蛮力法&#xff08;brute force method&#xff0c;也称为穷举法或枚举法&#xff09;是一种简单直接地解决问题的方法&#xff0c;常常直接基于问题的描述&#xff0c;所以&#xff0c;蛮力法也是最容易应用的方法。虽然&#xff0c;用蛮力法设计的算法时间特性往往也是最低的…

光耦在短距离通信中的应用

在高低压隔离系统设计中&#xff0c;难免会使用光耦来通信。在选择光耦器件时&#xff0c;需要考虑光耦允许的最大通信速率&#xff0c;否则在高速通信时会失败. 对于高速的光耦应用时&#xff0c;需要注意电流传输比率和开关速度。 参考文档《Basic Characteristics and Appli…

减治法解决八枚硬币问题/假币问题(JAVA)----二分,三分,不知轻重的情况

八枚硬币问题 在八枚外观相同的硬币中&#xff0c;有一枚是假币&#xff0c;并且已知假币与真币的重量不同&#xff0c;但不知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币&#xff0c;设计一个高效的算法来检测出这枚假币。 我们先假设一个条件&#xf…

减治法在查找算法中的应用(JAVA)--折半查找

减治法在查找算法中的应用 折半查找&#xff1a;(时间复杂度O(log以2为底n的对数)) 对于有序数组的查找来说&#xff0c;折半查找是一种非常高效的算法&#xff0c;其基本原理为&#xff1a;比较查找键k和数组中间元素a[m]&#xff0c;如果相等&#xff0c;算法结束&#xff…

牛客寒假算法基础集训营2 A处女座的签到题

处女座的签到题 链接&#xff1a;https://ac.nowcoder.com/acm/contest/327/A 题目描述 平面上有n个点&#xff0c;问&#xff1a;平面上所有三角形面积第k大的三角形的面积是多少?输入描述: 第一行T&#xff0c;表示样例的个数。对于每一组样例&#xff0c;第一行两个整数n和…

减治法解决约瑟夫斯问题(JAVA)

减治法在查找算法中的应用问题背景&#xff1a;据说著名犹太历史学家 Josephus有过以下的故事&#xff1a;在罗马人占领乔塔帕特后&#xff0c;39 个犹太人与Josephus及他的朋友躲到一个洞中&#xff0c;39个犹太人决定宁愿死也不要被敌人抓到&#xff0c;于是决定了一个自杀方…

从NetCore报错到MySql安全

从NetCore报错到MySql安全 原文:从NetCore报错到MySql安全之前项目在测试服务器上的一些接口时不时会报出下面的错误&#xff1a;&#xff08;采用Abp框架&#xff09; "SocketException: 你的主机中的软件中止了一个已建立的连接。 STACK TRACE: at MySqlConnector.Pr…

减治法在查找算法中的应用(JAVA)--快速查找

减治法在查找算法中的应用 快速查找&#xff1a;选择问题是求一个n个数列表的第k个最小元素的问题&#xff0c;这个数k被称为顺序统计量。对于k1或kn来说&#xff0c;这并没有什么意义&#xff0c;我们通常会要找出这样的元素&#xff1a;该元素比列表中一半元素大&#xff0…

JavaScript中使用Json

转载于:https://www.cnblogs.com/lyonwu/p/10368989.html

减治法在查找算法中的应用(JAVA)--二叉查找树的查找、插入、删除

减治法在查找算法中的应用二叉查找树的查找与插入&#xff1a; 二叉排序树或者是一棵空树&#xff0c;或者是具有下列性质的二叉树&#xff1a;&#xff08;1&#xff09;若左子树不空&#xff0c;则左子树上所有结点的值均小于或等于它的根节点的值&#xff1b; &#xff08;…

Navicat Premium试用期破解方法(转)

转载网址https://blog.csdn.net/Jason_Julie/article/details/82864187 1、按步骤安装Navicat Premium&#xff0c;如果没有可以去官网下载&#xff1a;http://www.navicat.com.cn/download/navicat-premium 2、安装好后下载激活文件&#xff1a;https://pan.baidu.com/s/1kVgT…

减治法在排序算法中的应用(JAVA)--插入排序

一、减治法在排序算法中的应用 插入排序&#xff1a;时间复杂度O(n^2)&#xff0c;虽然和选择、冒泡在最坏的情况下时间复杂度相同&#xff0c;但是插排平均性能在比自身的最差性能快一倍&#xff0c;所以相比选择、冒泡来说&#xff0c;插排要领先于二者。 public class Main…

减治法在求解拓扑排序问题中的应用(JAVA)--有向无环图

减治法在求解拓扑排序问题中的应用 拓扑排序&#xff1a;对于一个有向无环图来说&#xff0c;如果我们能够按照次序列出顶点&#xff0c;使得对于每条边来说&#xff0c;边的起始顶点总是排在边的结束顶点之前&#xff0c;那么这个过程就称为拓扑排序&#xff0c;拓扑排序有解…

Java中string.equalsIgnoreCase(0)与0.equalsIgnoreCase(string)的区别:

string.equalsIgnoreCase("0")&#xff1a;如果string为null,会抛出java.lang.NullPointerException异常。 "0".equalsIgnoreCase(string)&#xff1a;即使string为null也不会抛出异常。 所以一般如果判断一个字符串与一个常量是否相等的时候&#xff0c;应…