算法导论15-2

读书笔记

本小节介绍了利用动态规划解决矩阵链乘法的过程。

matrix_chain_question

穷举不可行

想要通过穷举的方法,获得所有的解决方案是不可行的。

对于一个矩阵链,我们可以宏观地将它看作两个子矩阵链相乘,即A1..AkA(k+1)..An

所以代价P(n)的表达式如下:

P(n)={1,ifn=1k=1n1P(k)P(nk),ifn2

在练习题15.23中会要求证明上述公式的时间复杂度为Ω(2n)

一个指数级的时间复杂度是难以接受的。

应用动态规划算法

最优括号化方案的结构特征

matrix_chain_process_1

其实这个结构特征和上面穷举所描述的是一致的,但是动态规划接下来的做法有所不同。

一个递归解决方案

假设我们已经知道一个矩阵链分割点k的值,那么矩阵链Ai..j的最小代价由三部分组成:左子矩阵链的最小代价,右子矩阵链的最小代价和这两个大矩阵相乘的代价;

即:

m[i,j]=m[i,k]+m[k+1,j]+Pi1PkPj

但是实际上我们并不知道k的值,所以需要在ij之间遍历出代价最小的k值。

计算最优代价

采用自底向上方法:

MATRIX-CHAIN-ORDER(p)
n = p.length - 1
let m[1..n,1..n] and s[1..n-1, 2..n] be new tables
for i = 1 to n
	m[i, i] = 0
for l = 2 to n	// l is the chain length
	for i = 1 to n-l+1
		j = i + l -1
		m[i, j] = ∞
		for k = i to j-1
			q = m[i,k] + m[k+1,j]+ p(i-1)p(k)p(j)
			if q < m[i,j]
				m[i,j] = q
				s[i,j] = k
return m and s

时间复杂度为Ω(n3)

构造最优解

PRINT-OPTIMAL-PARENS(s,i,j)
if i = j
	print A(i)
else 
	print "("
	PRINT-OPTIMAL-PARENS(s, i, s[i,j])
	PRINT-OPTIMAL-PARENS(s, s[i,j]+1, j)
	print ")"

课后习题

15.2-1

对矩阵规模序列<5,10,3,12,5,50,6>,求矩阵链最优括号化方案。

//todo

15.2-2

设计递归算法MATRIXCHAINMULTIPLY(A,s,i,j),实现矩阵链最优代价乘法的真正计算过程,其输入参数为矩阵序列<A1,A2,...,An>,$MATRIX-CHAIN-ORDER sijMATRIX-CHAIN-MULTIPLY(A,s,1,n)$。)

MATRIX-CHAIN-MULTIPLY(A,s,i,j)
k = s[i,j]
return MATRIX-CHAIN-MULTIPLY(A,s,i,k)*MATRIX-CHAIN-MULTIPLY(A,s,k+1,j)

15.2-3

用代入法证明递归公式(15.6)的结果为Ω(2n)

15.2-4

对输入链长度为n的矩阵链乘法问题,描述其子问题图:它包含多少个顶点?包含多少条边?这些边分别连接哪些顶点?

包含n2个顶点,n3条边连接n2个顶点

posted @   ijkzen  阅读(788)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示