15.2 矩阵链乘法
1.代码
public class MatrixChainMultiplication {public static void main(String[] args) { // 在该代码中,我们首先创建了两个n * n的矩阵m和s,分别用于记录最优值和分割点。 其中m 矩阵 通过i j 来显示在i到j的矩阵链中最优解 // // 然后,我们将i = j时的m[i][j]赋值为0,因为一个矩阵的乘积为0。 // // 接下来,我们使用L循环枚举子问题规模,i循环枚举左端点,j循环枚举右端点,并使用k循环枚举分割点。 // // 对于每个分割点k,我们计算最优值q,然后将q与m[i][j]进行比较,如果q小于m[i][j],则更新m[i][j]和s[i][j]。 // 通过公式算法导论15.7 // // 最后,我们返回m[1][n-1],即原问题的最优值。 // // 该算法的时间复杂度为O(n^3),其中n是矩阵的数量。int[] p = {30, 35, 15, 5, 10, 20, 25};System.out.println("最少的乘法次数为:" + matrixChainOrder(p));} public static int matrixChainOrder(int[] p) {int n = p.length;// 创建n * n的矩阵m和s,用于记录最优值和分割点int[][] m = new int[n][n];int[][] s = new int[n][n];// i==j时,m[i][j]=0,因为一个矩阵的乘积为0for (int i = 1; i < n; i++) {m[i][i] = 0;}for (int i = 0; i < m.length; i++) {System.out.println(Arrays.toString(m[i]));} // L是子问题规模for (int L = 2; L < n; L++) {// i是左端点,j是右端点,k是分割点for (int i = 1; i < n - L + 1; i++) {int j = i + L - 1;m[i][j] = Integer.MAX_VALUE;// 枚举分割点k,求解最优值for (int k = i; k < j; k++) {int q = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];System.out.println("m[i][k]: "+m[i][k] );System.out.println("m[k + 1][j]: "+m[k + 1][j]);System.out.println("i:"+i+" k:"+k+" j:"+j);System.out.println(q);if (q < m[i][j]) {m[i][j] = q;s[i][j] = k;}}}}// 返回最优值return m[1][n - 1];} }
2.原理
自己看算法导论吧
我再看到
这条公式的时候很困惑,然后自己手算了他给的第一个例子才知道这是正确的.
3.问题
具体的问题已经在代码注释中讲解完毕
4.进阶
输出只是I一个普通的递归而已
package collection; public class printOptimalParens {public static void matrixChainOrder(int[] p) {int n = p.length - 1;int[][] m = new int[n + 1][n + 1];int[][] s = new int[n + 1][n + 1];for (int i = 1; i <= n; i++) {m[i][i] = 0;}for (int len = 2; len <= n; len++) {for (int i = 1; i <= n - len + 1; i++) {int j = i + len - 1;m[i][j] = Integer.MAX_VALUE;for (int k = i; k <= j - 1; k++) {int q = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];if (q < m[i][j]) {m[i][j] = q;s[i][j] = k;}}}}System.out.println("Optimal Parenthesization:");printOptimalParens(s, 1, n);} public static void printOptimalParens(int[][] s, int i, int j) {if (i == j) {System.out.print("A" + i);} else {System.out.print("(");printOptimalParens(s, i, s[i][j]);printOptimalParens(s, s[i][j] + 1, j);System.out.print(")");}} public static void main(String[] args) {int[] p = {30, 35, 15, 5, 10, 20, 25};matrixChainOrder(p);} }
((A1(A2A3))((A4A5)A6))
15.2 矩阵链乘法相关推荐
- 矩阵链乘法 自顶向下 自底向上 Python 实现 算法导论
算法导论 矩阵链乘法 自顶向下 自底向上 Python 实现 带备忘的自顶向下实现方式 def Memoized_Matrix_chain(p):n = len(p)m = [[0 for i in ...
- 【动态规划】矩阵链乘法
矩阵链乘法 求解矩阵链相乘问题时动态规划算法的另一个例子.给定一个n个矩阵的序列(矩阵链)<A1,A2,...,An>,我们希望计算它们的乘积 A1A2...An 为了计算表 ...
- C++matrix chain multiplication矩阵链乘法算法的实现(附完整源码)
C++lmatrix chain multiplication矩阵链乘法算法的实现 C++matrix chain multiplication矩阵链乘法算法的实现的完整源码(定义,实现,main函数 ...
- 【算法分析与设计】矩阵链乘法最优顺序问题
矩阵链乘法 矩阵连乘,选择不同的乘法顺序,效率可能千差万别. 高效的实现算法应该用动态规划来设计,具体的讲解可以看这里. 编程实现 public class Main {private static ...
- 矩阵链乘法问题 (算法)
一.概述 以两个矩阵相乘为例,A1*A2,A1和A2为两个矩阵,假设A1的行列数是p*q,A2的行列数是q*r.注意这里由于是A1乘以A2,所以A1的列数要等于A2的行数,否则无法做矩阵乘法,满足上述 ...
- python矩阵乘法算法_Python算法|矩阵链乘法
概述 矩阵乘法是一个满足结合律的运算.显然,对于矩阵A.B.C来说,(AB)C 与 A(BC) 是等价的,我们可以根据自己的心情选择任意的运算顺序,总之,结果都是一样的. 糟糕的是,对计算机来说可不是 ...
- 动态规划典型题之——矩阵链乘法
动态规划是算法分析与设计中一种重要的算法.其核心思想是将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法. 文章目录 一.矩阵链相乘问题 二.求解 1.构建备忘录 2.回溯 结果展示 一.矩 ...
- c语言备忘录算法矩阵链乘,矩阵链乘法(备忘录法)
/* * @fileMemoMatrixchain.cpp * @briefa solution of martrix chain with memorized way. * @author/Univ ...
- 矩阵相乘的strassen算法_矩阵乘法的Strassen算法+动态规划算法(矩阵链相乘和硬币问题)...
矩阵乘法的Strassen 这个算法就是在矩阵乘法中采用分治法,能够有效的提高算法的效率. 先来看看咱们在高等代数中学的普通矩阵的乘法 两个矩阵相乘 上边这种普通求解方法的复杂度为: O(n3) 也称 ...
最新文章
- Chapter 8(查找)
- IFTTT 加入开源大家庭,已开源5个项目
- 美国公司欲联合大电脑商阻止绿坝推广
- libslog---高性能开源C/C++多线程安全日志库
- Springsecurity之FilterSecurityInterceptor
- shiro认证+授权(使用MD5+salt+散列加密)
- 【uniapp】组件封装与引用
- 循环神经网络(RNN)相关知识
- 火炬之光使用了哪些技术
- ARM中ROM,RAM,FLASH区别
- geoserver发布瓦片_Geoserver2.15.1配置自带GeoWebCache 插件发布ArcGIS Server瓦片
- memlock mysql_mysql配置详解(不断更新)
- 一文入门区块链相关知识
- mavros常用消息类型表
- Hibernate入门教程
- java list对象转json_java中List对象转换为JSON对象
- 用友ERP实施流程(不是本人所写,只是个搬运工!)
- 好看简约加速器官网源码
- 2021-2022年小学期 程序设计开发实践 随堂笔记
- 【Unity游戏开发】动画系统(二)2D动画
热门文章
- mac装机系列:每次打开iTerm都需要source bash_profile问题
- 2016年度最受欢迎中国开源软件评选 - 开源中国社区
- 自动驾驶介绍、应用、前景
- 记bilibili 2021 1024程序员节安全攻防挑战赛
- TP-LINK /TL-ER6120G Vlan 设置
- 大学毕业4年-回顾和总结(2)-钱,收入和支出
- 【basler】Chapter5:basler相机C#代码实现与详解
- AI创作教程之什么是Stable Diffusion?
- CTFSHOW-misc
- python3 paramiko 远程执行 ssh 命令、上传文件、下载文件