矩阵连乘 动态规划 详解

矩阵连乘问题----动态规划(转载):

给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。

解答:我们按照动态规划的几个步骤来分析:

(1)找出最优解的性质,刻画其特征结构

对于矩阵连乘问题,最优解就是找到一种计算顺序,使得计算次数最少。

令m[i][j]表示第i个矩阵至第j个矩阵这段的最优解。

将矩阵连乘积 简记为A[i:j] ,这里i<=j.假设这个最优解在第k处断开,i<=k<j,则A[i:j]是最优的,那么A[i,k]和A[k+1:j]也是相应矩阵连乘的最优解。可以用反证法证明之。 这就是最优子结构,也是用动态规划法解题的重要特征之一。

(2)建立递归关系

设计算A[i:j],1≤i≤j≤n,所需要的最少数乘次数m[i,j],则原问题的最优值为m[1,n] 。

当i=j时,A[i,j]=Ai, m[i,j]=0;(表示只有一个矩阵,如A1,没有和其他矩阵相乘,故乘的次数为0)

当i<j时,m[i,j]=min{m[i,k]+m[k+1,j] +pi-1*pk*pj} ,其中 i<=k<j

(相当于对i~j这段,把它分成2段,看哪种分法乘的次数最少,如A1,A2,A3,A4,则有3种分法:{A1}{A2A3A4 }、{A1A2}{A3A4 }、{A1A2A3}{A4 },其中{}表示其内部是最优解,如{A1A2A3}表示是A1A2A3的最优解),

也即:

(3)计算最优值

对于1≤i≤j≤n不同的有序对(i,j) 对于不同的子问题,因此不同子问题的个数最多只有o(n*n).但是若采用递归求解的话,许多子问题将被重复求解,所以子问题被重复求解,这也是适合用动态规划法解题的主要特征之一。 

用动态规划算法解此问题,可依据其递归式以自底向上的方式进行计算。在计算过程中,保存已解决的子问题答案。每个子问题只计算一次,而在后面需要时只要简单查一下,从而避免大量的重复计算,最终得到多项式时间的算法。

下面给出动态规划求解最优值的代码:

//也是要枚举求到的,但是如果我们之前先记录下这些小规模的情况,当求大规模的时候,直接提取就行了,因此体现了记忆搜索的说法

void MatrixChain(int *p,int n,int **m,int **s)

{    //m是最优值,s是最优值的断开点的索引,n为题目所给的矩阵的个数(下面例子中)

//矩阵段长度为1,则m[][]中对角线的值为0,表示只有一个矩阵,没有相乘的.

for(int i = 1;i<=n;i++) m[i][i] = 0;

for(int r = 2;r<=n;r++){//r表示矩阵的长度(2,3…逐渐变长)

   for(int i = 1;i<=n-r+1;i++){   

//从第i个矩阵Ai开始,长度为r,则矩阵段为(Ai~Aj)

int j = i+r-1;//当前矩阵段(Ai~Aj)的起始为Ai,尾为Aj

//求(Ai~Aj)中最小的,其实k应该从i开始,但些处先记录第一个值,k从i+1开始,这样也可以。

//例如对(A2~A4),则i=2,j=4,下面一行的m[2][4]=m[3][4]+p[1]*p[2]*p[4],即A2(A3A4)

     m[i][j] = m[i+1][j] + p[i-1]*p[i]*p[j];

     s[i][j] = i;//记录断开点的索引

//循环求出(Ai~Aj)中的最小数乘次数

     for(int k = i+1 ; k<j;k++){

//将矩阵段(Ai~Aj)分成左右2部分(左m[i][k],右m[k+1][j]), //再加上左右2部分最后相乘的次数(p[i-1] *p[k]*p[j])

       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;  //保存最小的,即最优的结果

}//if

     }//k

    }//i

}//r

}//MatrixChain

上面代码中后面的k也相当于是从i到j-1递增的,只是单独把第一个(k=i)提了出来.

对于 p={3035  155  10  20      25}:

 

计算顺序为:

对上例,共6个矩阵(A1~A6),n=6,当r=3时,r循环里面的是3个矩阵的最优解,i从1->4,即求的是

(A1A2A3),(A2A3A4),(A3A4A5),(A4A5A6)这4个矩阵段(长度为3)的最优解.当i=2时(A2A3A4)的最优解为{A2(A3A4) ,(A2A3)A4}的较小值。

 

•矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质。 

•在分析问题的最优子结构性质时,所用的方法具有普遍性:首先假设由问题的最优解导出的子问题的解不是最优的,然后再设法说明在这个假设下可构造出比原问题最优解更好的解,从而导致矛盾。 

•利用问题的最优子结构性质,以自底向上的方式递归地从子问题的最优解逐步构造出整个问题的最优解。最优子结构是问题能用动态规划算法求解的前提。

•递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。这种性质称为子问题的重叠性质。 

•动态规划算法,对每一个子问题只解一次,而后将其解保存在一个表格中,当再次需要解此子问题时,只是简单地用常数时间查看一下结果。 

•通常不同的子问题个数随问题的大小呈多项式增长。因此用动态规划算法只需要多项式时间,从而获得较高的解题效率。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549294.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

白盒测试中的六种覆盖方法及案例分析

语句覆盖是指选择足够的测试用例&#xff0c;使得运行这些测试用例时&#xff0c;被测程序的每一个语句至少执行一次&#xff0c;其覆盖标准无法发现判定中逻辑运算的错误&#xff1b;判定覆盖<又叫分支覆盖率>是指选择足够的测试用例&#xff0c;使得运行这些测试用例时…

回文数的C语言表述

2019独角兽企业重金招聘Python工程师标准>>> 现在的程序针对范围是0开始。直到溢出 #include #includemain(){ int i; /*本人的电脑用long和int一样*/for(i0;i<500;i){ if(svalue(i)) printf("%3d,",i); }getch();} int sv…

别人的爬虫在干啥

古人云博采众长&#xff0c;我们来看看其他人的爬虫是怎么学和用的&#xff1a; 爬虫文章 in 简书程序员专题&#xff1a; like:128 - Python 爬取落网音乐 like:127 - 【图文详解】python爬虫实战——5分钟做个图片自动下载器like:97 - 用Python写一个简单的微博爬虫like:87 …

windowsXP/7下消除快捷键箭头的方法

1.修改注册表。&#xff08;1&#xff09;启动注册表编辑器&#xff1a;点击 开始—运行里面输入“regedit”&#xff08;2&#xff09;然后依次展开如下分支&#xff1a;“HKEY_CLASSES_ROOT\lnkfile”&#xff1b;删除“lnkfile”子项中的“IsShortcut”字符串值项注意&#…

数据库 连接池、缓冲池(定义、原理)

数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接&#xff0c;当需要建立数据库连接时&#xff0c;只需要从缓冲池中取出一个了&#xff0c;使用完毕后再放回去。我们可以通过设定连接池最大数来防止系统无尽的与数据库连接。更为…

电子商务基础:中小企业建站方案和资源

目前国内的中小企业数量已经有几千万家&#xff0c;但信息化建设却并 不理想&#xff0c;拥有网站的只有不超过两百万家&#xff0c;数以千万计的中小企业存在电子商务需求&#xff0c;却没有自己独立的网站。现在&#xff0c;越来越多的企业意识到通过建立网站开展电子 商务的…

Hibernate——(3)主键生成策略持久化类的三种状态

一 持久化类 1.持久化&#xff1a;内存对象--->数据库&#xff08;硬盘&#xff09;Hibernate持久化的框架 持久化类&#xff1a;Java对象与数据库中的表建立映射关系 Hibernate就称为持久化类&#xff08;Java类映射文件&#xff09; 2.编写规则&#xff1a; …

C# 二进制BinaryFormatter进行序列化与反序列化

原文链接&#xff1a;https://blog.csdn.net/e295166319/article/details/52790131 序列化又称串行化&#xff0c;是.NET运行时环境用来支持用户定义类型的流化的机制。其目的是以某种存储形成使自定义对象持久化&#xff0c;或者将这种对象从一个地方传输到另一个地方。 .NET框…

Algorithm学习笔记 --- 迷宫问题

版权声明&#xff1a;学习交流为主&#xff0c;未经博主同意禁止转载&#xff0c;禁止用于商用。 https://blog.csdn.net/u012965373/article/details/26376987 </div><link rel"stylesheet" href"https://csdnimg.cn/release/phoenix…

css资源网站收集推荐

非原创&#xff0c;来源网络。感谢原作者奉献如此精彩文章。原文地址&#xff1a;http://www.jianbitou.com/post/20_websites-learn-master-css.html1. A List Apart CSS Topics A List Apart是一个CSS优秀文章的收集网站&#xff0c;从1999年开始收集文章&#xff0c;关注最佳…

IP地址、子网掩码、网络号、主机号、网络地址、主机地址以及ip段/数字-如192.168.0.1/24是什么意思?

背景知识 IP地址 IP地址被用来给Internet上的电脑一个编号。大家日常见到的情况是每台联网的PC上都需要有IP地址&#xff0c;才能正常通信。我们可以把“个人电脑”比作“一台电话”&#xff0c;那么“IP地址”就相当于“电话号码”&#xff0c;而Internet中的路由器&#xff0…

思科CCNA第一学期期末考试答案

1 第 3 层头部包含的哪一项信息可帮助数据传输&#xff1f; 端口号 设备物理地址 目的主机逻辑地址 虚拟连接标识符 2 IP 依靠 OSI 哪一层的协议来确定数据包是否已丢失并请求重传&#xff1f; 应用层 表示层 会话层 传输层 3 请参见图示…

思科CCNA第二学期期末考试答案

1.关于数据包通过路由器传输时的封装和解封的叙述&#xff0c;下列哪三项是正确的&#xff1f;&#xff08;选择三项。&#xff09; 路由器修改 TTL 字段&#xff0c;将其值减 1。 路由器将源 IP 更改为送出接口的 IP。 路由器保持相同的源 IP 和目的 IP。 路…

关于xrdp的安装设置

参考链接http://linuxfan-linuxtips.blogspot.com/2010/03/get-xrdp-to-work-in-ubuntu.htmlhttp://chip.twbbs.org/blog/?p658http://www.mexlinux.com/how-to-install-xrdp-in-ubuntu/首先&#xff0c;你必须remove vnc4server&#xff0c;这个东西和这个软件有冲突sudo apt…

35-46集 中心极限定理、置信区间

第三十五集 中心极限定律   该定律是说随着样本n越来越大&#xff0c;这n个样本的m个均值会趋于正态分布。与大数定律的区别在于&#xff1a;大数定律描述的样本均值趋于总体均值&#xff0c;而中心极限定律描述的是样本均值的分布。 第三十六、七集 样本均值的抽样分布   …

AS3自制按钮通用代码

系统提供按钮不大适合现在的很多实用&#xff0c;很多都是MC做的&#xff0c;很多情况要些很多代码…… 代码 stop();addEventListener(MouseEvent.MOUSE_OVER,MouseOver);addEventListener(MouseEvent.MOUSE_UP,MouseOver);addEventListener(MouseEvent.MOUSE_DOWN,MouseDown)…

统计学(可汗学院视频62-81集笔记)

资料链接 本次统计学学习以网易云可汗学院公开课为主&#xff1a; 视频链接&#xff1a;http://open.163.com/special/Khan/khstatistics.html 并以《深入浅出统计学》为辅&#xff1a; 书籍链接&#xff1a;https://pan.baidu.com/s/1dCV6rrOWZU-deKxAoectGA </div…

可汗学院统计学笔记 42-81集

假设检验 假设检验是推论统计中用于检验统计假设的一种方法。而“统计假设”是可通过观察一组随机变量的模型进行检验的科学假说。一旦能估计未知参数&#xff0c;就会希望根据结果对未知的真正参数值做出适当的推论。统计上对参数的假设&#xff0c;就是对一个或多个参数的论述…

再谈js拖拽(一)

关于js拖拽早已是老生常谈&#xff0c;网上一搜一大坨&#xff0c;但是有很多并不是很完善&#xff0c;或者兼容性不够&#xff0c;或者功能不全&#xff0c;并且这样的东西还是自己写的好用。我打算在&#xff08;一&#xff09;中主要对js拖拽功能的注意点进行罗列&#xff0…

操作系统进程调度算法图解(FCFS、轮转、SPN、SRT、HRRN、反馈)

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 本文链接&#xff1a;https://blog.csdn.net/woshiwanghao_hi/article/details/13004507 FCFS: 先来先服务&#xff0c;也可以称为先进先出 轮转…