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

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


一、问题定义

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模板网!

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

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

相关文章

  • 【算法分析与设计】动态规划(下)

      若给定序列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日
    浏览(51)
  • 算法设计与分析复习--动态规划

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

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

    任务描述 沿着河岸摆放 N 堆石子,现要将石子有次序地合并成一堆,规定每次只能选相邻的 2 堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。 例如: 4 堆石子 4,5,9,4 ,可以按 (((4,5),9),4) 合并。 第一次合并得分是 9 分,合并之后石子堆是 9,9,4 第二次合并得

    2024年02月08日
    浏览(51)
  • 算法设计与分析—动态规划例题

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

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

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

    2024年02月08日
    浏览(47)
  • 【算法设计与分析】作业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日
    浏览(44)
  • 算法设计与分析 实验三 动态规划

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

    2024年01月24日
    浏览(78)
  • 【动态规划】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日
    浏览(79)
  • 【算法设计与分析】动态规划:数塔问题

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

    2024年02月11日
    浏览(73)
  • 算法设计与分析实验:动态规划与贪心

    目录 一、零钱兑换 1.1 思路一:动态规划 1.2 思路二:贪心 二、安排工作以达到最大效益 2.1 具体思路 2.2 思路呈现 2.3 代码实现 2.4 复杂度分析 2.5 运行结果 三、雇佣k名工人的最低成本 3.1 具体思路 3.2 思路展示 3.3 代码实现 3.4 复杂度分析 3.5 运行结果 结尾语 “生活有意思的

    2024年02月19日
    浏览(75)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包