Java矩阵快速幂实现
时间:2022-07-23
本文章向大家介绍Java矩阵快速幂实现,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
之前做题目喷到一题,自己通过递归求解也能做出来,但是数据量一大超过10000,就基本上凉凉了,所以自己之后一直看了别人的解法,认识到了矩阵快速幂的好处,自己之前也碰到过,但是只是简单了解了一下,所以什么东西最好还是精一点的好,略懂是不行的。 首先一般的幂运算,普通的解法就是一次乘,比如说X^12,可能就是简单的12个X相乘,总共计算的c次数就是12次,但是我们可以把12分解成12=4+8,那么只需要计算4次方以及8次方,这样我们一次计算2次方,4次方,8次方,最后直接将4次方与8次方相乘即可,那这样我们最后只计算了4次,次数大大的减少了,所以非常实用。 同理我们也可以将这种运算方式运用到矩阵上。 下面就是详细的代码:
import java.util.Scanner;
public class Main {
public static int [][] figure(int [][]num1,int [][]num2)//矩阵乘法函数
{
int [][]num3=new int [num1.length][num2[0].length];
for(int i=0;i<num1.length;i++)
{
for(int j=0;j<num2[0].length;j++)
{
for(int k=0;k<num1[0].length;k++)
{
num3[i][j]+=num1[i][k]*num2[k][j];
}
}
}
return num3;
}
public static int [][]figure1(int [][]num1,int n)矩阵的n次方函数
{
int [][]num2=new int [num1[0].length][num1[0].length];//构造单位矩阵
for(int i=0;i<num1.length;i++)
{
num1[i][i]=1;
}
int [][]res=new int [num1.length][num1[0].length];
while(n>0)
{
if((n&1)==1) res=figure(num1, num2);
num1=figure(num1, num1);
n>>=1;
}
return res;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
int k=sc.nextInt();
int [][]num1=new int [n][m];
int [][]num2=new int [m][k];
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
num1[i][j]=sc.nextInt();
}
}
for(int i=0;i<m;i++)
{
for(int j=0;j<k;j++)
{
num2[i][j]=sc.nextInt();
}
}
int [][]num3=figure(num1, num2);
int [][]num4=figure1(num3, 4);
}
}
通常情况下矩阵快速幂不会单独使用,一般都是与动态规划一同使用,毕竟矩阵快速幂中的矩阵就类似于状态方程。 作者很菜,如有不足,请大佬指出。
- Asp.Net 用Jquery和一般处理程序实现无刷新上传大文件
- WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用
- WCF技术剖析之十四:泛型数据契约和集合数据契约(上篇)
- WCF技术剖析之十四:泛型数据契约和集合数据契约(下篇)
- WCF技术剖析(卷1)之前言
- WCF技术剖析(卷1)之目录
- WCF技术剖析(卷1)之推荐序
- 谈谈基于SQL Server 的Exception Handling[上篇]
- 谈谈WCF中的Data Contract(4):WCF Data Contract Versioning
- 如何在silverlihgt中使用右键
- WCF技术剖析之十二:数据契约(Data Contract)和数据契约序列化器(DataContractSerializer)
- silverlight向服务器post数据类
- WCF技术剖析之十三:序列化过程中的已知类型(Known Type)
- 44 Amazing Silverlight 2.0 Screencasts
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Python 技术篇-pygame库实现播放音乐,带漂亮小界面!
- Java底层:GC相关
- Python 技术篇-pygame界面添加图片不显示,原因及解决办法
- SpringBoot集成Graylog
- Python 技术篇-pygame播放音乐没有声音,原因及解决办法
- Docker安装Graylog
- Spring Batch快速入门
- Python 技术篇-用PIL库修改图片尺寸
- 从行动上支持鸿蒙,HarmonyOS开发环境搭建快人一步
- 智能合约编程语言-solidity快速入门(下)
- Python 技术篇-用PIL库修改图片透明度,改变png图片色道为RGBA、RGB。
- 智能合约编程语言-solidity快速入门(上)
- Redis系列:项目中哪些常用的命令
- Chrome 插件编写-用几行js代码实现写入剪贴板功能
- Python 技术篇-socket套接字实现服务器客户端消息传递,UDP实现