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

问题描述

给定 n n n个矩阵 { A 1 , A 2 , A 3 , . . . , A n } \{A_1,A_2,A_3,...,A_n\} {A1,A2,A3,...,An},其中 A i A_i Ai P i − 1 × P i P_{i-1}\times P_i Pi1×Pi矩阵, i = 1 , . . . , n i = 1,...,n i=1,...,n,并且 A i A_i Ai A i − 1 A_{i-1} Ai1是可乘的。由于矩阵乘法满足结合律,所以计算矩阵的链乘可有许多不同的计算次序,两个矩阵 A i × j A_{i\times j} Ai×j A j × k A_{j\times k} Aj×k相乘的工作量为 i × j × k i\times j\times k i×j×k次数乘。
给定向量 P = < P 0 , P 1 , . . . , P n > P=<P_0,P_1,...,P_n> P=<P0,P1,...,Pn> n n n个矩阵的行数和列数,确定一种乘法次序,使得基本运算“数乘”的总次数最少。

完全加括号

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

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

最优子结构

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

最优解的递推关系

  • i i i j j j确定子问题的边界,输入 P = < P 0 , P 1 , . . . P n > P=<P_0,P_1,...P_n> P=<P0,P1,...Pn>
    A i . . . j = A i . . . k A k + 1... j , k = i , i + 1 , . . . , j − 1 A_{i...j}=A_{i...k}A_{k+1...j},k=i,i+1,...,j-1 Ai...j=Ai...kAk+1...j,k=i,i+1,...,j1
  • 确定优化函数和递推方程:二维数组 m m m用来保存矩阵链乘时所需的最小计算量
    m [ i ] [ j ] = { min ⁡ i ≤ k < j { m [ i ] [ k ] + m [ k + 1 ] [ j ] + P i − 1 P k P j } if  i < j 0 if  i = j m[i][j]=\begin{cases} \min\limits_{i\leq k < j} \{m[i][k]+m[k+1][j]+P_{i-1}P_kP_j\} &\text{if } i<j \\ 0 &\text{if } i=j \end{cases} m[i][j]=ik<jmin{m[i][k]+m[k+1][j]+Pi1PkPj}0if i<jif i=j
  • 设立标记函数:为了确定加括号的次序,设计表 s [ i , j ] s[i,j] s[i,j]记录求得最优时,最后一次运算的位置,即 m [ i ] [ j ] m[i][j] m[i][j]达到最小时 k k 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;

结束语

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

作者:花城

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值