【算法】矩阵链乘法的动态规划算法

矩阵链乘法的动态规划算法

  1. 定义问题
  • 给定矩阵链 (A1,A2,...,An)( A_1, A_2, \dots, A_n )(A1,A2,...,An),其中 AiA_iAi 的维度为 (pi−1×pi)( p_{i-1} \times p_i )(pi−1×pi)。

  • 目标是找到计算 (A1A2...An)( A_1A_2 \dots A_n )(A1A2...An) 的最优顺序,使得所需的乘法次数最少。

  1. 动态规划表格
  • 定义 mijmijmij 表示子链 (Ai...Aj)( A_i \dots A_j )(Ai...Aj) 的最小乘法次数。

  • 表格 mmm 的大小为 n×nn \times nn×n,其中 mijmijmij 专门对应从 AiA_iAi 到 AjA_jAj 的最小乘法次数。

  1. 链长 lll 的作用
  • 链长 lll 代表子链的长度,取值从 2 到 nnn 逐步递增。

  • 链长 l=2l=2l=2 对应两个矩阵相乘,l=3l=3l=3 对应三个矩阵相乘,以此类推直至覆盖完整矩阵链。

  1. 表格填充步骤

4.1 初始化

当 i=ji = ji=j 时,子链仅包含一个矩阵,无需进行乘法运算,因此乘法次数为 0,即 mii=0mii = 0mii=0。

4.2 按链长递增填充表格

  1. 外层循环:链长 lll 从 2 遍历至 nnn(覆盖所有可能的子链长度)。

  2. 中层循环:遍历所有可能的起始位置 iii,取值范围为 111 到 n−l+1n - l + 1n−l+1。

  3. 计算结束位置:由起始位置 iii 和链长 lll 可得,j=i+l−1j = i + l - 1j=i+l−1。

  4. 内层循环:尝试所有可能的分割点 kkk(i≤k<ji \leq k < ji≤k<j),通过以下公式计算 mijmijmij 的最小值:
    mij=min⁡i≤k<j(mik+mk+1j+pi−1pkpj)mij = \min_{i \leq k < j} \left( mik + mk+1j + p_{i-1}p_k p_j \right)mij=i≤k<jmin(mik+mk+1j+pi−1pkpj)

4.3 最终结果

表格中的 m1nm1nm1n 即为整个矩阵链 A1A2...AnA_1A_2 \dots A_nA1A2...An 的最小乘法次数。

  1. 链长 lll 的具体计算过程

假设矩阵链长度 n=4n = 4n=4,矩阵维度序列为 p=p0,p1,p2,p3,p4p = p_0, p_1, p_2, p_3, p_4p=p0,p1,p2,p3,p4,以下是链长 lll 从 2 到 4 的完整计算过程:

5.1 链长 l=2l = 2l=2(两个矩阵相乘)

计算所有相邻矩阵对的最小乘法次数(仅一种分割方式,无需比较):

  • m12=p0p1p2m12 = p_0 p_1 p_2m12=p0p1p2

  • m23=p1p2p3m23 = p_1 p_2 p_3m23=p1p2p3

  • m34=p2p3p4m34 = p_2 p_3 p_4m34=p2p3p4

5.2 链长 l=3l = 3l=3(三个矩阵相乘)

每个子链有两种分割方式,取计算结果的最小值:

m13=min⁡(m11+m23+p0p1p3,m12+m33+p0p2p3)m13 = \min(m11 + m23 + p_0 p_1 p_3, m12 + m33 + p_0 p_2 p_3)m13=min(m11+m23+p0p1p3,m12+m33+p0p2p3)

m24=min⁡(m22+m34+p1p2p4,m23+m44+p1p3p4)m24 = \min(m22 + m34 + p_1 p_2 p_4, m23 + m44 + p_1 p_3 p_4)m24=min(m22+m34+p1p2p4,m23+m44+p1p3p4)

5.3 链长 l=4l = 4l=4(完整矩阵链)

整个矩阵链有三种分割方式,取计算结果的最小值:

m14=min⁡(m11+m24+p0p1p4,m12+m34+p0p2p4,m13+m44+p0p3p4)m14 = \min( m11 + m24 + p_0 p_1 p_4, m12 + m34 + p_0 p_2 p_4, m13 + m44 + p_0 p_3 p_4 )m14=min(m11+m24+p0p1p4,m12+m34+p0p2p4,m13+m44+p0p3p4)

  1. 时间复杂度分析

6.1 子问题数量

动态规划表格 mmm 的规模为 n×nn \times nn×n,因此子问题总数为 O(n2)O(n^2)O(n2)。

6.2 每个子问题的计算量

对于子链 mijmijmij,分割点 kkk 的取值范围为 i≤k<ji \leq k < ji≤k<j,共 O(j−i)O(j - i)O(j−i) 种可能,即每个子问题的计算量为 O(n)O(n)O(n)。

6.3 总计算量

算法通过三层循环实现,总时间复杂度为 O(n3)O(n^3)O(n3),各层循环的时间复杂度如下:

  • 外层循环:链长 lll 从 2 到 nnn,共 O(n)O(n)O(n) 次。

  • 中层循环:起始位置 iii 从 1 到 n−l+1n - l + 1n−l+1,共 O(n)O(n)O(n) 次。

  • 内层循环:分割点 kkk 从 iii 到 j−1j - 1j−1,共 O(n)O(n)O(n) 次。

  1. 总结

矩阵链乘法的动态规划算法核心是通过链长 lll 控制子问题规模,按子链长度从小到大的顺序逐步填充动态规划表格 mijmijmij,最终通过 m1nm1nm1n 得到完整矩阵链的最小乘法次数。该算法的时间复杂度为 O(n3)O(n^3)O(n3),其中 nnn 为矩阵链中矩阵的个数。

相关推荐
珠海西格电力3 分钟前
云边端协同架构:零碳园区管理系统的技术底座
大数据·运维·人工智能·算法·架构·能源
还有多久拿退休金2 小时前
让飞书知识库跟着 commit 自己长:一套自动化知识库的真实实现
前端·算法·架构
KaMeidebaby3 小时前
卡梅德生物技术快报|小 RNA 适配体合成 + 多方法亲和力表征全流程标准化操作手册
前端·网络·数据库·人工智能·算法
是Dream呀3 小时前
基于深度学习的人类行为识别算法研究
人工智能·深度学习·算法
happyprince4 小时前
03_NVIDIA_ModelOpt-量化算法深入
人工智能·深度学习·算法
大鱼>4 小时前
AI+货物追踪:智能快递柜追踪系统
人工智能·深度学习·算法·机器学习
researcher-Jiang5 小时前
算法训练:堆 & 可并堆
算法
在书中成长5 小时前
HarmonyOS 小游戏《对战五子棋》开发第18篇 - 棋盘设计
算法·harmonyos
Frostnova丶5 小时前
(12)LeetCode 76. 最小覆盖子串
算法·leetcode·职场和发展
灯澜忆梦5 小时前
GO_函数_1
算法