iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java矩阵连乘问题(动态规划)算法实例分析
  • 636
分享到

Java矩阵连乘问题(动态规划)算法实例分析

java矩阵算法 2023-05-30 20:05:45 636人浏览 安东尼
摘要

本文实例讲述了Java矩阵连乘问题(动态规划)算法。分享给大家供大家参考,具体如下:问题描述:给定n个矩阵:A1,A2,...,An,其中ai与Ai+1是可乘的,i=1,2...,n-1。确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连

本文实例讲述了Java矩阵连乘问题(动态规划)算法。分享给大家供大家参考,具体如下:

问题描述:给定n个矩阵:A1,A2,...,An,其中ai与Ai+1是可乘的,i=1,2...,n-1。确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。输入数据为矩阵个数和每个矩阵规模,输出结果为计算矩阵连乘积的计算次序和最少数乘次数。

问题解析:由于矩阵乘法满足结合律,故计算矩阵的连乘积可以有许多不同的计算次序。这种计算次序可以用加括号的方式来确定。若一个矩阵连乘积的计算次序完全确定,也就是说该连乘积已完全加括号,则可以依此次序反复调用2个矩阵相乘的标准算法计算出矩阵连乘积。

完全加括号的矩阵连乘积可递归地定义为:

(1)单个矩阵是完全加括号的;
(2)矩阵连乘积A是完全加括号的,则A可表示为2个完全加括号的矩阵连乘积B和C的乘积并加括号,即A=(BC)

例如,矩阵连乘积A1A2A3A4有5种不同的完全加括号的方式:(A1(A2(A3A4))),(A1((A2A3)A4)),((A1A2)(A3A4)),((A1(A2A3))A4),(((A1A2)A3)A4)。每一种完全加括号的方式对应于一个矩阵连乘积的计算次序,这决定着作乘积所需要的计算量。

看下面一个例子,计算三个矩阵连乘{A1,A2,A3};维数分别为10*100 , 100*5 , 5*50 按此顺序计算需要的次数((A1*A2)*A3):10X100X5+10X5X50=7500次,按此顺序计算需要的次数(A1*(A2*A3)):10*5*50+10*100*50=75000次

所以问题是:如何确定运算顺序,可以使计算量达到最小化。

算法思路:

例:设要计算矩阵连乘乘积A1A2A3A4A5A6,其中各矩阵的维数分别是:

A1:30*35;     A2:35*15;     A3:15*5;     A4:5*10;     A5:10*20;     A6:20*25

递推关系:

设计算A[i:j],1≤i≤j≤n,所需要的最少数乘次数m[i,j],则原问题的最优值为m[1,n]。
当i=j时,A[i:j]=Ai,因此,m[i][i]=0,i=1,2,…,n
当i<j时,若A[i:j]的最优次序在Ak和Ak+1之间断开,i<=k<j,则:m[i][j]=m[i][k]+m[k+1][j]+pi-1pkpj。由于在计算是并不知道断开点k的位置,所以k还未定。不过k的位置只有j-i个可能。因此,k是这j-i个位置使计算量达到最小的那个位置。

综上,有递推关系如下:

Java矩阵连乘问题(动态规划)算法实例分析

构造最优解:

若将对应m[i][j]的断开位置k记为s[i][j],在计算出最优值m[i][j]后,可递归地由s[i][j]构造出相应的最优解。s[i][j]中的数表明,计算矩阵链A[i:j]的最佳方式应在矩阵Ak和Ak+1之间断开,即最优的加括号方式应为(A[i:k])(A[k+1:j)。因此,从s[1][n]记录的信息可知计算A[1:n]的最优加括号方式为(A[1:s[1][n]])(A[s[1][n]+1:n]),进一步递推,A[1:s[1][n]]的最优加括号方式为(A[1:s[1][s[1][n]]])(A[s[1][s[1][n]]+1:s[1][s[1][n]]])。同理可以确定A[s[1][n]+1:n]的最优加括号方式在s[s[1][n]+1][n]处断开...照此递推下去,最终可以确定A[1:n]的最优完全加括号方式,及构造出问题的一个最优解。

package Matrix;public class Matrix {  public static void MatrixChain(int[] p,int n, int[][] m, int[][] s) {   for (int i = 1; i <= n; i++) {     m[i][i] = 0;   }    for(int r = 2;r <= n; r++ ) {      for(int i = 1; i <= n-r+1; i++) {        int j = i+r-1;        m[i][j] = m[i+1][j] + p[i-1]*p[i]*p[j];        s[i][j] = i;        for(int k = i+1; k < j; k++) {          int t = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j];          if(t < m[i][j]) {            m[i][j] = t;            s[i][j] = k;          }        }      }    }  }  public static void Traceback(int i, int j, int[][] s) {    if(i == j) return;    Traceback(i,s[i][j],s);    Traceback(s[i][j] + 1,j,s);    System.out.println("Multiply  A" + i + "," + s[i][j] + "and A" + (s[i][j] + 1) + "," + j);  }  public static void main(String[] args) {    System.out.println("编程测试结果:");    Matrix mc = new Matrix();    int n = 7;    int p[] = { 30, 35, 15, 5, 10, 20, 25 };    int m[][] = new int[n][n];    int s[][] = new int[n][n];    int l = p.length-1;    mc.MatrixChain(p, l,m, s);    for (int i = 1; i < n; i++) {      for (int j = 1; j < n; j++) {        System.out.print(m[i][j] + "\t");      }      System.out.println();    }    System.out.println();    for (int i = 1; i < n; i++) {      for (int j = 1; j < n; j++) {        System.out.print(s[i][j]+" ");      }      System.out.println();    }    mc.Traceback( 1, 6, s);  }}

--结束END--

本文标题: Java矩阵连乘问题(动态规划)算法实例分析

本文链接: https://www.lsjlt.com/news/220975.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java矩阵连乘问题(动态规划)算法实例分析
    本文实例讲述了Java矩阵连乘问题(动态规划)算法。分享给大家供大家参考,具体如下:问题描述:给定n个矩阵:A1,A2,...,An,其中Ai与Ai+1是可乘的,i=1,2...,n-1。确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连...
    99+
    2023-05-30
    java 矩阵 算法
  • C++动态规划算法实现矩阵链乘法
    问题描述: 给定n个矩阵的链<A1,A2,…,An>,矩阵Ai的规模为p(i-1)×p(i) (1<=i<=n),求完全括号化方案,...
    99+
    2024-04-02
  • 怎么使用C++动态规划算法实现矩阵链乘法
    这篇文章主要介绍“怎么使用C++动态规划算法实现矩阵链乘法”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用C++动态规划算法实现矩阵链乘法”文章能帮助大家解决问题。问题描述:给定n个矩阵的链&...
    99+
    2023-07-02
  • java背包问题动态规划算法分析
    背包问题 【题目描述】 一个旅行者有一个最多能装 MM 公斤的背包,现在有 nn 件物品,它们的重量分别是W1,W2,…,WnW1,W2,…,Wn,它们的价值分别为C1,C2,…,C...
    99+
    2024-04-02
  • C++ 动态规划算法使用分析
    目录Fibonacci字符串分割(Word Break)三角矩阵(Triangle)路径总数(Unique Paths)最小路径和(Minimum Path Sum)Fibonacc...
    99+
    2024-04-02
  • Java动态规划之丑数问题实例讲解
    问题描述: 我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。 注: 1也是丑数 思路: 我们来分析一下丑数如何得到,肯...
    99+
    2024-04-02
  • Java实现动态规划背包问题
    目录前言一、原理1.1 最优子结构性质1.2 递归关系二、算法描述2.1 算法描述2.2 图解2.3 构造最优解三、 0 − 1 0-1 0−1 背包问题相关...
    99+
    2024-04-02
  • Java动态规划之硬币找零问题实现示例
    目录问题描述:问题分析:具体的过程如下:动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20...
    99+
    2022-11-13
    Java 硬币找零
  • Java使用动态规划算法思想解决背包问题
    目录动态规划算法动态规划算法的思想最优性原理动态规划算法的三大特点动态规划算法中的0/1背包问题动态规划算法的优点小结动态规划算法 动态规划算法的思想 动态规划算法处理的对象是多阶段...
    99+
    2024-04-02
  • Python算法题解:动态规划解0-1背包问题
    概述背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给...
    99+
    2023-06-02
  • python实现动态规划算法的示例代码
    动态规划(Dynamic Programming,DP)是一种常用的算法思想,通常用于解决具有重叠子问题和最优子结构性质的问题。动态规划算法通常是将问题分解为子问题,先解决子问题,再...
    99+
    2023-02-16
    python 动态规划算法
  • C++中的动态规划子序列问题分析探讨
    目录一、子序列(不连续)最长上升子序列最长公共子序列不相交的线二、子序列(连续)最长连续递增序列最长重复子数组最大子序和三、编辑距离判断子序列两个字符串的删除操作不同的子序列编辑距离...
    99+
    2023-03-15
    C++动态规划子序列 C++子序列问题 C++动态规划
  • Java算法题输入问题实例分析
    本篇内容介绍了“Java算法题输入问题实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.给定范围,确定输入几个数据直接使用普通的Sc...
    99+
    2023-06-29
  • JavaScript程序设计高级算法之动态规划的示例分析
    这篇文章给大家分享的是有关JavaScript程序设计高级算法之动态规划的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体如下:其实像在我们前端的开发中,用到的高级算法...
    99+
    2024-04-02
  • C语言动态规划多种背包问题分析讲解
    目录写在前面01背包问题完全背包问题多重背包问题 I多重背包问题 II为什么可以这样优化呢一 、二进制与十进制二 、动态规划的时间复杂度估算三 、多重背包分组背包问题写在前面 之前讲...
    99+
    2024-04-02
  • Java算法之BFS,DFS,动态规划和贪心算法的实现
    目录前言广度优先搜索深度优先搜索动态规划贪心总结前言 广度优先搜索(BFS)和深度优先搜索(DFS)是图遍历算法中最常见的两种算法,主要用于解决搜索和遍历问题。动态规划和贪心算法则用...
    99+
    2023-05-14
    Java BFS Java DFS Java动态规划 Java贪心
  • Java动态规划之硬币找零问题实现代码
    动态规划的基本思想是将待求解问题分解成若干个子问题,先求解子问题,并将这些子问题的解保存起来,如果以后在求解较大子问题的时候需要用到这些子问题的解,就可以直接取出这些已经计算过的解而免去重复运算。保存子问题的解可以使用填表方式,例如保存在数...
    99+
    2023-05-30
    java 算法 硬币找零
  • JavaScript股票的动态买卖规划实例分析下篇
    目录1. 最佳买卖股票时机含冷冻期题目描述题解2. 买卖股票的最佳时机 III题目描述题解1. 最佳买卖股票时机含冷冻期 题目描述 给定一个整数数组prices,其中第prices[...
    99+
    2022-11-13
    JavaScript 股票 JavaScript 股票买卖
  • C语言动态规划点杀dp算法LeetCode炒股习题案例解析
    目录概念性质典型特征实战论证算法实现优化概念 说到动态规划,什么是动态规划? 动态规划(英语:Dynamic programming,简称 dp)通过把原问题分解为相对简单的子问题的...
    99+
    2024-04-02
  • JavaScript股票的动态买卖规划实例分析上篇
    目录1. 买卖股票的最佳时机题目描述题解2. 买卖股票的最佳时机 II题目描述题解3. 买卖股票的最佳时机含手续费题目描述题解1. 买卖股票的最佳时机 题目描述 给定一个数组 pri...
    99+
    2022-11-13
    JavaScript 股票 JavaScript 股票买卖
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作