【动态规划】矩阵链乘法——算法设计与分析

这篇具有很好参考价值的文章主要介绍了【动态规划】矩阵链乘法——算法设计与分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、问题定义

1.1 矩阵乘法

对于矩阵 U p × q U_{p\times q} Up×q V q × r V_{q\times r} Vq×r Z p × r = U V Z_{p\times r}=UV Zp×r=UV,共需计算 p q r pqr pqr次标量乘法,时间复杂度为 Θ ( p q r ) \Theta (pqr) Θ(pqr)

矩阵乘法满足结合律,即 ( U V ) W = U ( V W ) (UV)W=U(VW) (UV)W=U(VW),选择不同的结合顺序,会对计算的次数产生巨大的影响。


1.2 矩阵链乘法问题

n n n个矩阵相乘称为矩阵链乘法,问题在于如何确定相乘顺序,以提高计算效率?

形式化定义如下:

输入:

  • n n n个矩阵组成的矩阵链 U 1.. n = < U 1 , U 2 , . . . , U n > U_{1..n}=<U_1,U_2,...,U_n> U1..n=<U1,U2,...,Un>
  • 矩阵链 U 1.. n U_{1..n} U1..n对应的维度数分别为 p 0 , p 1 , . . . , p n p_0,p_1,...,p_n p0,p1,...,pn U i U_i Ui的维度为 p i − 1 × p i p_{i-1}\times p_i pi1×pi

输出:

  • 找到一种添加括号的方式,以确定矩阵链乘法的计算顺序,使得最小化矩阵链标量乘法的次数


二、求解策略

显然,最优矩阵链乘法加括号的组合中,任意一部分均为最优,具有最优子结构性质,尝试动态规划求解。


2.1 分析问题结构

形式化表示问题:

  • D [ i , j ] D[i,j] D[i,j]:计算矩阵链 U i . . j U_{i..j} Ui..j所需标量乘法的最小次数

原问题:

  • D [ i , n ] D[i,n] D[i,n]:计算矩阵链 U 1.. n U_{1..n} U1..n所需标量乘法的最小次数

2.2 建立递推关系

以长度为4的矩阵链为例辅助思考, U = U 1 U 2 U 3 U 4 U=U_1U_2U_3U_4 U=U1U2U3U4

对其进行加1个括号的操作,有以下几种方式:
U = ( U 1 ) ( U 2 U 3 U 4 ) ⇒ D [ 1 , 4 ] = D [ 1 , 1 ] + D [ 2 , 4 ] + p 0 p 1 p 4 U = ( U 1 U 2 ) ( U 3 U 4 ) ⇒ D [ 1 , 4 ] = D [ 1 , 2 ] + D [ 3 , 4 ] + p 0 p 2 p 4 U = ( U 1 U 2 U 3 ) ( U 4 ) ⇒ D [ 1 , 4 ] = D [ 1 , 3 ] + D [ 4 , 4 ] + p 0 p 3 p 4 U=(U_1)(U_2U_3U_4)\Rightarrow D[1,4]=D[1,1]+D[2,4]+p_0p_1p_4\\ U=(U_1U_2)(U_3U_4)\Rightarrow D[1,4]=D[1,2]+D[3,4]+p_0p_2p_4\\ U=(U_1U_2U_3)(U_4)\Rightarrow D[1,4]=D[1,3]+D[4,4]+p_0p_3p_4 U=(U1)(U2U3U4)D[1,4]=D[1,1]+D[2,4]+p0p1p4U=(U1U2)(U3U4)D[1,4]=D[1,2]+D[3,4]+p0p2p4U=(U1U2U3)(U4)D[1,4]=D[1,3]+D[4,4]+p0p3p4
D [ 1 , 4 ] D[1,4] D[1,4]结果只需要在这3种方式中取得最大值即可。

我们不妨来看一下,求得 D [ 1 , 4 ] D[1,4] D[1,4]需要哪些数据:

1 2 3 4
1 目标
2
3
4

再次观察,对角线上的元素表示矩阵自身,不需要进行运算,所以值均为0。而左下三角的矩阵并没有实际含义,因为 j ≥ i j\ge i ji,故当前表格更新为下表所示:

1 2 3 4
1 0 目标
2 NULL 0
3 NULL NULL 0
4 NULL NULL NULL 0

相信大家已经看出递推关系。

对于矩阵链 U i . . j U_{i..j} Ui..j,求解 D [ i , j ] D[i,j] D[i,j]时,为了不遗漏最优分割位置,需要枚举所有可能位置 i , i + 1 , . . , j − 1 i,i+1,..,j-1 i,i+1,..,j1,一共 j − i j-i ji种。

假设在 k k k处进行分割,分为 U i . . k U_{i..k} Ui..k U k + 1.. j U_{k+1..j} Uk+1..j两部分,前者的维度为 p i − 1 × p k p_{i-1} \times p_k pi1×pk,后者的维度为 p k × p j p_k\times p_j pk×pj,将两部分进行乘积时,需要额外增加 p i − 1 × p k × p j p_{i-1}\times p_k \times p_j pi1×pk×pj的计算次数。

因此, D [ i , j ] = min ⁡ i ≤ k < j { D [ i , k ] + D [ k + 1 , j ] + p i − 1 p k p j } D[i,j]=\min_{i\leq k <j} \left \{ D[i,k]+D[k+1,j]+p_{i-1}p_kp_j \right \} D[i,j]=minik<j{D[i,k]+D[k+1,j]+pi1pkpj}


2.3 自底向上计算

采用图中的方向进行计算:

矩阵链乘法算法,算法设计与分析,算法,矩阵,动态规划

许多教材中习惯将其逆时针旋转45度,以方便观察,在于个人习惯。

矩阵链乘法算法,算法设计与分析,算法,矩阵,动态规划


2.4 追踪最优方案

构造追踪数组 R e c [ 1.. n , 1.. n ] Rec[1..n,1..n] Rec[1..n,1..n] R e c [ i , j ] Rec[i,j] Rec[i,j]表示矩阵链 U i . . j U_{i..j} Ui..j的最优分割位置(一次分割)。

在计算 D [ i , j ] D[i,j] D[i,j]的过程中,选出最小的 k k k,记录 R e c [ i , j ] = k Rec[i,j]=k Rec[i,j]=k

追踪时,从 R e c [ 1 , n ] Rec[1,n] Rec[1,n]出发,假设 R e c [ 1 , n ] = k Rec[1,n]=k Rec[1,n]=k,则说明在 U k U_k Uk处进行了分割,分为矩阵链 D [ 1 , k ] D[1,k] D[1,k] D [ k + 1 , n ] D[k+1,n] D[k+1,n],再分别查看 R e c [ 1 , k ] Rec[1,k] Rec[1,k] R e c [ k + 1 , n ] Rec[k+1,n] Rec[k+1,n],便找到两部分的分割地方。如此寻找直至对角线部分。

矩阵链乘法算法,算法设计与分析,算法,矩阵,动态规划

矩阵链乘法算法,算法设计与分析,算法,矩阵,动态规划



三、算法分析

3.1 伪代码

计算及记录部分:

矩阵链乘法算法,算法设计与分析,算法,矩阵,动态规划

矩阵链乘法算法,算法设计与分析,算法,矩阵,动态规划

追踪方案部分:

矩阵链乘法算法,算法设计与分析,算法,矩阵,动态规划


3.2 时间复杂度

时间复杂度 O ( n 3 ) O(n^3) O(n3)

矩阵链乘法算法,算法设计与分析,算法,矩阵,动态规划文章来源地址https://www.toymoban.com/news/detail-773905.html

到了这里,关于【动态规划】矩阵链乘法——算法设计与分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法设计与分析—动态规划例题

    题目描述 求FIB数列第n项的值 输入 输入一个整数n,表示需要输出FIB数列第n项的值 输出 输出FIB数列第n项的值 样例输入  复制 样例输出  复制 提示 题目描述 长江游艇俱乐部在长江上设置了n (n=10)个游艇出租站1,2,…,n。游客可在这些游艇出租站租用游艇,并在下游的

    2024年04月13日
    浏览(41)
  • 【算法分析与设计】动态规划(下)

      若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的 子序列 是指 存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij 。例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相应的递增下标序列为{2,3,5,7}。   给定2个序列X和Y,当另

    2024年02月08日
    浏览(50)
  • 【算法分析与设计】动态规划(上)

       理解动态规划算法的概念 。    掌握动态规划算法的基本要素 :   (1) 最优子结构性质   (2) 重叠子问题性质   掌握设计动 态规划算法的步骤 :   (1) 找出最优解的性质,并刻划其结构特征 。   (2) 递归地定义最优值 。   (3) 以自底向上的方式计算

    2024年02月08日
    浏览(44)
  • 算法分析与设计---分治+动态规划

    1.分治法 适用条件: 问题规模缩小到一定程度容易求解 问题可以分解为若干个规模较小的 相同 子问题,即问题具有最优子结构( 使用分治法前提 ) 可以利用子问题的解合并为该问题的解( 决定是否使用分治法 ) 各个子问题 相互独立 ,即子问题之间不包含公共子问题(

    2024年02月07日
    浏览(43)
  • 算法设计与分析复习--动态规划

    算法设计与分析复习–递归与分治(二) 与分析法类似:将原问题分解为子问题 不同点:不是通过递归的方式,而是自底向上的求解问题 矩阵连乘的次数是左矩阵行列,右矩阵行列取出左右中进行相乘。 由于矩阵乘积需要满足左矩阵列等于右矩阵的行,所以可以用一维数组

    2024年02月04日
    浏览(39)
  • 算法设计与分析 实验三 动态规划

    1.打家劫舍:  给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 入: 每组测试案例有两行,第一行只有一个整数N,代表着有N间房屋 第二行有N个整数,代表着每间房屋里的金额,金额范围[0, 1000]。 出:

    2024年01月24日
    浏览(76)
  • 【算法设计与分析】作业2:动态规划

    最长递增⼦序列(LIS) 编程实现求解最长递增⼦序列的三种动态规划算法(⼀些细节请参考课件) 1.1 算法1:令 L ( k ) L(k) L ( k ) 表示 s [ 1.. n ] s[1..n] s [ 1.. n ] 中以 s [ k ] s[k] s [ k ] 结尾的LIS的长度,原问题即求解 max ⁡ 1 ≤ k ≤ n L ( k ) max_{1le kle n}L(k) max 1 ≤ k ≤ n ​ L ( k

    2024年02月21日
    浏览(43)
  • 【动态规划】01背包问题——算法设计与分析

    若超市允许顾客使用一个体积大小为13的背包,选择一件或多件商品带走,则如何选择可以使得收益最高? 商品 价格 体积 啤酒 24 10 汽水 2 3 饼干 9 4 面包 10 5 牛奶 9 4 0-1 Knapsack Problem 输入: quad - n n n 个商品组成集合 O O O ,每个商品有属性价格 p i p_i p i ​ 和体积 v i v_i v

    2024年02月04日
    浏览(75)
  • 【算法设计与分析】动态规划-练习题

    输入一个整数数组 S[n] ,计算其最长递增子序列的长度,及其最长递增子序列。 定义 k ( 1 ≤ k ≤ n ) k (1 ≤ k ≤ n) k ( 1 ≤ k ≤ n ) ,L[k]表示以 S[k] 结尾的递增子序列的最大长度。子问题即为 L[k]。 对于每一个k,我们都遍历前面0~k-1的所有的数,找出最大的L[i],且 S [ k ] L [

    2024年02月03日
    浏览(58)
  • 【算法设计与分析】动态规划:数塔问题

    提示:头歌 算法作业 实验七 动态规划 第1关:数塔问题 本关任务:编写用动态规划解决数塔问题。 求解过程(自底向上) 决策结果输出过程(自顶向下) 将上述分析求解过程角标记录为 path数组 ,方便顺序输出结果 代码如下(不知题目给出三维数组的a的第三维我用处,去

    2024年02月11日
    浏览(72)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包