动态规划_备忘录法_矩阵链乘问题

问题描述

给定n个矩阵{A1,A2,A3,...,An},其中AiPi1×Pi矩阵,i=1,...,n,并且AiAi1是可乘的。由于矩阵乘法满足结合律,所以计算矩阵的链乘可有许多不同的计算次序,两个矩阵Ai×jAj×k相乘的工作量为i×j×k次数乘。
给定向量P=<P0,P1,...,Pn>n个矩阵的行数和列数,确定一种乘法次序,使得基本运算“数乘”的总次数最少。

完全加括号

完全加括号的矩阵链乘积可递归地定义为:

  • 单个矩阵是完全加括号的
  • 矩阵链乘积A是完全加括号的,则A可表示为两个完全加括号的矩阵链乘积BC的乘积,并加括号,即A=(BC)

最优子结构

  • 矩阵链乘AiAi+1...Aj简记为Ai...j,ij,于是矩阵链乘A1A2...An可记为A1...n,完全加括号形式为A1...n=A1...kAk+1...n,1k<n
  • 矩阵连乘A1...n的最优计算次序的计算量等于A1...kAk+1...n两者的最优计算次序的计算量之和,再加上A1...kAk+1...n相乘的计算量。矩阵链乘问题的最优解具有最优子结构特性。

最优解的递推关系

  • ij确定子问题的边界,输入P=<P0,P1,...Pn>

Ai...j=Ai...kAk+1...j,k=i,i+1,...,j1

  • 确定优化函数和递推方程:二维数组m用来保存矩阵链乘时所需的最小计算量

m[i][j]={minik<j{m[i][k]+m[k+1][j]+Pi1PkPj}if i<j0if i=j

  • 设立标记函数:为了确定加括号的次序,设计表s[i,j]记录求得最优时,最后一次运算的位置,即m[i][j]达到最小时k的划分。

算法描述(伪代码)

  • 迭代实现 备忘录法
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;

结束语

醉后不知天在水,满船清梦压星河

作者:花城

posted @   花城1122  阅读(275)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示