动态规划_备忘录法_矩阵链乘问题
时间:2021-07-12
本文章向大家介绍动态规划_备忘录法_矩阵链乘问题 ,主要包括动态规划_备忘录法_矩阵链乘问题 使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
目录
问题描述
给定nn个矩阵{A1,A2,A3,...,An}{A1,A2,A3,...,An},其中AiAi为Pi−1×PiPi−1×Pi矩阵,i=1,...,ni=1,...,n,并且AiAi与Ai−1Ai−1是可乘的。由于矩阵乘法满足结合律,所以计算矩阵的链乘可有许多不同的计算次序,两个矩阵Ai×jAi×j与Aj×kAj×k相乘的工作量为i×j×ki×j×k次数乘。
给定向量P=<P0,P1,...,Pn>P=<P0,P1,...,Pn>为nn个矩阵的行数和列数,确定一种乘法次序,使得基本运算“数乘”的总次数最少。
完全加括号
完全加括号的矩阵链乘积可递归地定义为:
- 单个矩阵是完全加括号的
- 矩阵链乘积AA是完全加括号的,则AA可表示为两个完全加括号的矩阵链乘积BB和CC的乘积,并加括号,即A=(BC)A=(BC)
最优子结构
- 矩阵链乘AiAi+1...AjAiAi+1...Aj简记为Ai...j,i≤jAi...j,i≤j,于是矩阵链乘A1A2...AnA1A2...An可记为A1...nA1...n,完全加括号形式为A1...n=A1...kAk+1...n,1≤k<nA1...n=A1...kAk+1...n,1≤k<n
- 矩阵连乘A1...nA1...n的最优计算次序的计算量等于A1...kA1...k和Ak+1...nAk+1...n两者的最优计算次序的计算量之和,再加上A1...kA1...k和Ak+1...nAk+1...n相乘的计算量。矩阵链乘问题的最优解具有最优子结构特性。
最优解的递推关系
- 由ii和jj确定子问题的边界,输入P=<P0,P1,...Pn>P=<P0,P1,...Pn>
Ai...j=Ai...kAk+1...j,k=i,i+1,...,j−1Ai...j=Ai...kAk+1...j,k=i,i+1,...,j−1
- 确定优化函数和递推方程:二维数组mm用来保存矩阵链乘时所需的最小计算量
m[i][j]={mini≤k<j{m[i][k]+m[k+1][j]+Pi−1PkPj}0if i<jif i=jm[i][j]={mini≤k<j{m[i][k]+m[k+1][j]+Pi−1PkPj}if i<j0if i=j
- 设立标记函数:为了确定加括号的次序,设计表s[i,j]s[i,j]记录求得最优时,最后一次运算的位置,即m[i][j]m[i][j]达到最小时kk的划分。
算法描述(伪代码)
- 迭代实现 备忘录法
haskell
MatrixChain(P,n)
令所有m[i,j]的初值为0;
for r <- 2 to n do
for i <- 1 to n-r+1 do
j <- i+r-1;
m[i,j] <- m[i+1,j]+P_i-1P_iP_j;
s[i,j] = i;
for k <- i+1 to j-1 do
t <- m[i,k]+m[k+1,j]+P_i-1P_kP_j;
if t < m[i,j]
then m[i,j] <- t;
s[i,j] <- k;
结束语
醉后不知天在水,满船清梦压星河
作者:花城
原文地址:https://www.cnblogs.com/wl-blog/p/15000956.html
- java中的tuple实现
- MYSQL5.7开启慢查询日志
- 微信又是一次大更新,下拉多任务切换 各种有趣小游戏
- 人工智能有可能超越人类大脑?
- 一种简单的数据库性能测试方法
- xiaomao.com7位数高价成交,并已启用建站
- Docker基于已有的镜像制新的镜像-Docker for Web Developers(3)
- 如何通过Remoting实现双向通信
- jenkins 入门教程(上)
- 让jQuery Tools Scrollable控件在Mobile Web里面支持resize功能
- CentOS6.5上golang环境配置
- 马斯克频发推文,或在揭示特斯拉明年大动作?
- yum安装出现No package nodejs available解决办法
- InfoPath中repeationg section动态填充数据
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Java并发之Condition 并发同步控制
- Java并发工具类Semaphore应用实例
- Java并发之死锁实例
- Java并发之ThreadPoolExecutor 线程执行服务
- Java并发之工具类 ForkJoin 任务分解
- 简单的 http 服务器
- 动态代理:cgib、jdk、java javassist
- JAVA NIO Channel
- JAVA NIO Scatter/Gather(矢量IO)
- JAVA NIO FileChannel 内存映射文件
- JAVA NIO Socket通道
- Mysql Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operat
- Spring 资源文件处理
- Spring profile配置应用
- Spring Bean的加载