矩阵链相乘(动态规划法)
矩阵链乘法是耳熟能详的问题了,有很多矩阵,排列成矩阵链,矩阵链的要求是相邻的两个是可以相乘的,可以相乘是有条件的,两个矩阵能够相乘的条件就是行、列之间是有关系的,两个矩阵如果能够相乘,就是前面矩阵的列号和后面矩阵的行号是一致的。 如何确定矩阵的乘法顺序,使得元素相乘的总次数最少。
文章目录
- 一、问题描述
- 1、问题
- 2、输入:向量
- 3、输出:矩阵链乘法加括号的位置.
- 二、矩阵相乘基本运算次数
- 三、实例说明
- 1、实例
- 2、蛮力算法
- 3、动态规划算法
- 四、总结
一、问题描述
1、问题
设A1 _,A2 , … ,An为矩阵序列, Ai为 Pi-1 X Pi 阶矩阵,i = 1, 2, … , n. 试确定矩阵的乘法顺序,使得元素相乘的总次数最少。
2、输入:向量
P=<P0,P1,…,Pn>,P = < P_0, P_1, … , P_n >, P=<P0,P1,…,Pn>,
其中P0,P1,…,Pn为n个矩阵的行数与列数其中 P_0, P_1, …, P_n为 n 个矩阵的行数与列数 其中P0,P1,…,Pn为n个矩阵的行数与列数
3、输出:矩阵链乘法加括号的位置.
二、矩阵相乘基本运算次数
矩阵A: i 行 j 列,B: j 行 k 列,以元素相乘作基本运算,计算 AB的工作量
cts = at1 b1s + at2 b2s + … + atj bjs
AB: i 行 k列,计算每个元素需要做 j 次乘法, 总计乘法次数 为 i
j
k
Notes:两个矩阵相乘的工作量就是,A、B相乘得到C矩阵,C矩阵里面有i行k列个元素,每一个元素的计算是由列数j的地方的行数来决定的,j次的乘法,这里面有多少次元素j次元素相乘,每一个元素是由j次乘法决定的,一共有i 行 k列(ik)个元素,(ik)是它的总个数,每个元素个数要进行k次乘法,所以总计乘法次数 为 i
j
k
三、实例说明
1、实例
现在有三个矩阵,A1,A2,A3
P=<10,100,5,50>,A1:10X100,A2:100X5,A3:5X50P = <10, 100, 5, 50> , A1: 10 X100, A2: 100 X 5, A3: 5 X 50 P=<10,100,5,50>,A1:10X100,A2:100X5,A3:5X50
最终乘完后是10 X 50的矩阵,这个时候做相乘有两种乘法顺序
(1)比如A1,A2先乘,乘法次数 为 i
j
k
,需要10 X 100 X 50次乘法,(A1 A2)乘完之后的矩阵大小是10 X 5的矩阵,这个矩阵再和A3相乘,它的乘法次数 为10 X 5 X 50,运算次数是7500次
(2)另外一种运算,先让A2,A3先乘,需要100 X 5 X 50次乘法,乘完之后的矩阵大小是100 X 50的矩阵,这个矩阵再和A1相乘,它的乘法次数 为10 X 100 X 50,运算次数是75000次
这两种乘法的次数明显差别非常大,第一种次序计算次数最少,次序的不同计算的次数也会不同,这个时候问题就变成了加括号的问题
2、蛮力算法
现在有n个矩阵,决定先乘的次序,量级是非常高的
3、动态规划算法
矩阵链里面的子问题就是将原问题划分成两段的时候,不管怎样分割,最后一次分割的位置一旦确定以后,原问题就变成了两段。
一个是在最后一次分割最后一次加括号的位置一定会分成左边和右边,左边这一段就是新的矩阵链相乘的问题,在这个里面依然存在要去找一个最好的括号化的方法(也就是往里面加括号),加入的括号能够得到最少的乘法的次数,然后原问题整个矩阵链从左边界到右边界分割成两段以后,原问题加括号的方法,在子问题里面加括号的方法加进去之后的乘法的次数,其实是一样的。
原问题的最优的加括号的方法一定也是也是子问题的最优的加括号的方法,否则我们就可以用剪切粘贴的方法来构成一个新的最优解,最优子结构就不满足了。
- 子问题划分
Ai…j:矩阵链 Ai Ai+1 … Aj,边界i, j
输入向量: < Pi-1, PI, … , Pj>
其最好划分的运算次数: m[i, j] - 子问题的依赖关系
最优划分最后一次相乘发生在矩阵k 的位置,即
A~i …j~ = Ai…k Ak+1…j
Ai…j最优运算次数依赖于 Ai…k与 Ak+1…j 的最优运算次数
四、总结
动态规划算法设计要素 :
- 多阶段决策过程,每步处理一个子问题,界定子问题的边界
- 列出优化函数的递推方程及初值
- 问题要满足优化原则或最优子结构性质,即:一个最优决策序列的任何子序列本身一定是相对于子序列的初始和结束状态的最优决策序列
矩阵链相乘(动态规划法)相关推荐
- 动态规划——矩阵链相乘
如果看过我上一篇文章(动态规划--最长公共子序列)的同学,相信已经对动态规划的思想有了一定的了解和认识,即把之前求解得出的子问题存储起来,以便后续求解大问题直接使用. 本章要讲解的问题是矩阵链相乘.因 ...
- 【动态规划】矩阵链相乘 (ssl 1596)/能量项链 (ssl 2006)
矩阵链相乘{\color{Cyan} 矩阵链相乘 }矩阵链相乘 Description Input n表示矩阵的个数(<=100) n+1个数,表示矩阵(<=100) Output 最小的 ...
- Java动态规划---矩阵链相乘的最小计算代价
参考书籍:算法导论第三版. 采用自底向上的递归模式来求解. * 动态规划在矩阵链相乘的应用,目的求出最小的计算代价,即矩阵的计算顺序,用加小括号表示. * 主要的计算思想是递归,而且是带备忘录的递归, ...
- 以空间换时间——动态规划算法及其应用:矩阵链相乘
动态规划算法是5大算法基础中最重要的一个,它专门用来解决平面世界下的应用,即会多次使用二维数组. 当然动态规划算法是空间换时间的算法,也就是说:我们可以利用空间资源来使某算法问题的时间复杂度降到最低. ...
- 矩阵相乘的strassen算法_矩阵乘法的Strassen算法+动态规划算法(矩阵链相乘和硬币问题)...
矩阵乘法的Strassen 这个算法就是在矩阵乘法中采用分治法,能够有效的提高算法的效率. 先来看看咱们在高等代数中学的普通矩阵的乘法 两个矩阵相乘 上边这种普通求解方法的复杂度为: O(n3) 也称 ...
- 7-1 矩阵链相乘问题 (20 分)(思路+详解+题目解析) 动态规划做法
一:题目: 输入样例: 在这里给出一组输入.例如: 5 30 35 15 5 10 20 输出样例: 在这里给出相应的输出.例如: 11875 二:基本解析 1.基本的动态规划知识: 1):求解过程是 ...
- 【动态规划】矩阵链乘法
矩阵链乘法 求解矩阵链相乘问题时动态规划算法的另一个例子.给定一个n个矩阵的序列(矩阵链)<A1,A2,...,An>,我们希望计算它们的乘积 A1A2...An 为了计算表 ...
- 动态规划典型题之——矩阵链乘法
动态规划是算法分析与设计中一种重要的算法.其核心思想是将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法. 文章目录 一.矩阵链相乘问题 二.求解 1.构建备忘录 2.回溯 结果展示 一.矩 ...
- 【动态规划】区间DP - 最优矩阵链乘(另附POJ1651Multiplication Puzzle)
最优矩阵链乘(动态规划) 一个n∗mn*mn∗m的矩阵由 nnn 行 mmm 列共 n∗mn*mn∗m 排列而成.两个矩阵A和B可以相乘当且仅当A的列数等于B的行数.一个nm的矩阵乘mp的矩阵,运算量 ...
最新文章
- CSS的元素显示模式(块内元素和行内元素)
- Deep Learning 26:读论文“Maxout Networks”——ICML 2013
- Fetcher类的工作流程
- sql server 2008学习1–系统数据库
- matlab hashset,MATLAB集合操作
- 四六级php,详解四六级查询API+网页
- 黑马程序员C++学习笔记(第三阶段核心:STL)--- 更新中
- 坚果pro2刷机分享
- 新概念英语(1-29)Come in, Amy.
- ASCII码对照表 包含二进制、十进制、十六进制
- PLC和变频器通讯方式
- 深度解析中国养老产业发展前景
- Google与百度、搜狗合作,共同推进移动网络发展
- 使用QT SDK 1.1 Qt Creator 2.0.9创建symbian sisx安装包
- Windows7 上运行docker实战
- YTU.2362: 愚公的遗愿
- 关于stm32f030的DMA配置
- Windows 7 繁体中文MSDN原版
- PDF的文本工具在哪里?有哪些工具怎么用?
- ansys 14.0
热门文章
- [Extjs6]随记-使用h5的placeholder给编辑框添加提示效果
- 智能LIMS实验室系统的核心功能分析
- C51的UART 串口通信
- nas存储如何做远程服务器数据备份_服务器数据远程备份
- Thin Plate Spline TPS薄板样条变换基础理解
- 零基础K210实现人脸识别(YOLO2)
- for-in,for-of(含Map)详细演示
- github删除某个项目流程
- Elasticsearch索引检控之Indices Segments API与Indices Shard Stores
- 好用的开源电路设计EDA工具--KiCAD使用入门