动态规划--矩阵链乘法
一、问题描述
矩阵乘法规则
如果A是a*b的矩阵,B是b*c的矩阵,那么AB就是a*c的矩阵,所做的乘法次数为a*b*c
矩阵链乘法
给定一个矩阵链A1A2A3A4,要计算乘积,给这个矩阵链加上括号,来改变运算次序。
如果矩阵链为(A1,A2,A3,A4),那么有如下5中加括号的方式:
(A1(A2(A3A4)))
(A1((A2A3)A4))
((A1A2)(A3A4))
((A1(A2A3))A4)
(((A1A2)A3)A4)
而改变矩阵的运算次序,能改变所做乘法的运算次数,比如说3个矩阵的链(A1,A2,A3),假设3个矩阵的维数分别为10*100,100*5,5*50。按照((A1,A2)A3)的次序来计算,需要10*100*5+10*5*50=7500次乘法。但如果按照(A1(A2,A3))的次序来计算,则需要100*5*50+10*100*50=75000次乘法,慢了10倍。
总而言之,矩阵链中不同的运算顺序会导致运算次数有很大的差异
矩阵链乘法问题
矩阵链乘法问题就是寻找一个最佳的运算次序,使所做的乘法次数最小
p[n+1]:表示n个矩阵的维度,其中矩阵Ai的维度为pi-1*pi
二、问题分析
由前面可知,一个序列如果只有一个矩阵,则只有一种方式加全部括号,如果有两个或两个以上的矩阵,则必然可以看做两个子序列的乘积,且这两个子序列又可以分解成更小的两个子序列的乘积(两个矩阵相乘的运算次数看前面)。我们用cost(i,j)表示序列Ai…Aj在最优加全部括号时的标量乘积次数,则
其中pi-1pkpj为子序列Ai…Ak与Ak+1…Aj相乘时的标量相乘次数。
三、代码实现
代码中,测试用例为6个矩阵相乘,各个矩阵的维度存放在p中
int main()
{//代表矩阵链int p[7] = {30,35,15,5,10,20,25};//mij表示矩阵i到矩阵j的最小代价int m[7][7] = {0};//sij表示矩阵i到矩阵j最小代价的分割点int s[7][7];//长度为1的矩阵代价设为0for (int i = 1; i <= 6; i++)m[i][i] = 0;//对于每一个大于1的长度for (int j = 2; j <= 6; j++)//k为左端点位置,取值不能大于6-k+1,这是计算位置的方式,要记得,for (int k = 1; k <= 6 - j + 1; k++) {int end = k + j - 1;//end为右端点位置m[k][end] = 999999; //计算代价,图个代价等于划分位置两边的矩阵代价,加上两矩阵合并代价for (int n = k; n <= end; n++) {int temp = m[k][n] + m[n + 1][end] + p[k-1] * p[n] * p[end];if (temp < m[k][end]) {m[k][end] = temp;s[k][end] = n;}}}cout << m[1][6] << endl;system("pause");return 0;
}
最终输出结果为15125,表示最优运算次数。
转载于:https://www.cnblogs.com/likaiming/p/8053094.html
动态规划--矩阵链乘法相关推荐
- 【动态规划】矩阵链乘法
矩阵链乘法 求解矩阵链相乘问题时动态规划算法的另一个例子.给定一个n个矩阵的序列(矩阵链)<A1,A2,...,An>,我们希望计算它们的乘积 A1A2...An 为了计算表 ...
- 【算法分析与设计】矩阵链乘法最优顺序问题
矩阵链乘法 矩阵连乘,选择不同的乘法顺序,效率可能千差万别. 高效的实现算法应该用动态规划来设计,具体的讲解可以看这里. 编程实现 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) 是等价的,我们可以根据自己的心情选择任意的运算顺序,总之,结果都是一样的. 糟糕的是,对计算机来说可不是 ...
- C++matrix chain multiplication矩阵链乘法算法的实现(附完整源码)
C++lmatrix chain multiplication矩阵链乘法算法的实现 C++matrix chain multiplication矩阵链乘法算法的实现的完整源码(定义,实现,main函数 ...
- 矩阵链乘法 自顶向下 自底向上 Python 实现 算法导论
算法导论 矩阵链乘法 自顶向下 自底向上 Python 实现 带备忘的自顶向下实现方式 def Memoized_Matrix_chain(p):n = len(p)m = [[0 for i in ...
- 动态规划典型题之——矩阵链乘法
动态规划是算法分析与设计中一种重要的算法.其核心思想是将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法. 文章目录 一.矩阵链相乘问题 二.求解 1.构建备忘录 2.回溯 结果展示 一.矩 ...
- 动态规划——矩阵链相乘
如果看过我上一篇文章(动态规划--最长公共子序列)的同学,相信已经对动态规划的思想有了一定的了解和认识,即把之前求解得出的子问题存储起来,以便后续求解大问题直接使用. 本章要讲解的问题是矩阵链相乘.因 ...
- Java动态规划---矩阵链相乘的最小计算代价
参考书籍:算法导论第三版. 采用自底向上的递归模式来求解. * 动态规划在矩阵链相乘的应用,目的求出最小的计算代价,即矩阵的计算顺序,用加小括号表示. * 主要的计算思想是递归,而且是带备忘录的递归, ...
- 15.2 矩阵链乘法
1.代码 public class MatrixChainMultiplication {public static void main(String[] args) { // 在该代码中,我们首先创 ...
最新文章
- java8 时间加一秒_年货买瓜子有讲究!这些加了“料”的瓜子不安全!
- shell 获取ora报错信息_频发:故障排除之又见 ORA-4031丨云和恩墨技术通讯
- android百度地图开发之自动定位所在位置与固定位置进行驾车,步行,公交路线搜索...
- 点击桌面计算机图打不开,idf,手把手教你怎么解决电脑桌面图标打不开
- 【深度学习】2021年深度学习哪些方向比较新颖,处于上升期或者朝阳阶段,没那么饱和,比较有研究潜力?...
- Spark 1.3 新特性 :176个贡献者,1000+ patches
- 现代操作系统第三版高清.pdf中文版免费下载
- 电子表格控件Spreadsheet 对象方法事件详细介绍
- C++控制台打飞机小游戏 | CSDN 博文精选
- RAID简单介绍和Linux如何搭建一个RAID
- Java从零开始(4)——入门项目
- Spark 调优 ——cache(persist)与 checkpoint
- SPSS25安装教程
- Android 音视频开发(二):使用 AudioRecord 采集音频PCM并保存到文件(学习笔记)
- 稳定性和高可用如何保障?一手测评华为云网站高可用解决方案
- 电脑软件没运行,内存爆满可以这样解决
- 拿到软考高级证书就是高级职称了吗?
- Windows 10系统下查看硬盘类型的方法
- google gms包各apk的包名和类名
- CornerStone —— 医学影像显示的JavaScript库简介
热门文章
- 2021-08-02 INSERT INTO插入语句
- linux进程状态a,Linux进程状态标识符含义
- fastreport按条件查询_数据分析sql从入门到精通--条件和过滤查询
- truffle version/usr/local/lib/node_modules/truffle/build/385.bundled.js:65232 catch cli.bundled.js:6
- 基于SSM的作业管理(在线学习)系统
- Games101 Tansformer
- JVM常量池和八种基本数据及字符串
- 一、Oracle学习笔记:认识数据库
- 情人节到了,Postman 都脱单了,那你咧?
- Netty 网络框架概述 与 快速入门