算法导论15-2
读书笔记
本小节介绍了利用动态规划解决矩阵链乘法的过程。
穷举不可行
想要通过穷举的方法,获得所有的解决方案是不可行的。
对于一个矩阵链,我们可以宏观地将它看作两个子矩阵链相乘,即和;
所以代价的表达式如下:
在练习题中会要求证明上述公式的时间复杂度为。
一个指数级的时间复杂度是难以接受的。
应用动态规划算法
最优括号化方案的结构特征
其实这个结构特征和上面穷举所描述的是一致的,但是动态规划接下来的做法有所不同。
一个递归解决方案
假设我们已经知道一个矩阵链分割点的值,那么矩阵链的最小代价由三部分组成:左子矩阵链的最小代价,右子矩阵链的最小代价和这两个大矩阵相乘的代价;
即:
但是实际上我们并不知道的值,所以需要在与之间遍历出代价最小的值。
计算最优代价
采用自底向上方法:
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
时间复杂度为。
构造最优解
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
对矩阵规模序列,求矩阵链最优括号化方案。
//todo
15.2-2
设计递归算法,实现矩阵链最优代价乘法的真正计算过程,其输入参数为矩阵序列,$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.2-4
对输入链长度为的矩阵链乘法问题,描述其子问题图:它包含多少个顶点?包含多少条边?这些边分别连接哪些顶点?
包含个顶点,条边连接个顶点
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 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】