动态规划——矩阵连乘积

矩阵乘法基础

对于 p × q p\times q p×q矩阵 A A A q × r q\times r q×r矩阵 B B B A × B A\times B A×B需要 p × q × r p\times q\times r p×q×r次乘法计算(模拟矩阵乘法过程易得)

问题描述

矩阵乘法满足结合律,我们可以通过加括号的方式改变矩阵乘法的计算次序。问何种计算次序(加括号的方式),使得计算矩阵连乘积所需的数乘次数最少。

穷举法复杂度分析

穷举法递推关系如下:
在这里插入图片描述

贪心策略

沿着先把大维数消除,达到最少乘法运算次数的贪心策略是错误的,例题中 A 4 A 5 A_4A_5 A4A5没有结合起来先运算说明了这一点。

动态规划求解

将矩阵连乘积 A i A i + 1 … A j A_iA_{i+1}\dots A_j AiAi+1Aj简记为 A [ i : j ] A[i:j] A[i:j],这里 i ≤ j i\leq j ij
我们设其中一种加括号方式为: ( A i A i + 1 … A k ) ( A k + 1 A k + 2 … A j ) (A_iA_{i+1}\dots A_k)(A_{k+1}A_{k+2}\dots A_j) (AiAi+1Ak)(Ak+1Ak+2Aj)
则该加括号方式的计算量为
在这里插入图片描述
两种情况讨论

  • i = = j i == j i==j时, A [ i : j ] = A i A[i:j] =A_i A[i:j]=Ai,因此, m [ i , i ] = 0 , i = 1 , 2 , … , n m[i,i] = 0,i=1,2,\dots,n m[i,i]=0i=1,2,,n
  • i < j i<j i<j时, m [ i , j ] = m [ i , k ] + m [ k + 1 , j ] + p i − 1 p k p j m[i,j] = m[i,k]+m[k+1,j]+p_{i-1}p_kp_j m[i,j]=m[i,k]+m[k+1,j]+pi1pkpj,其中 A i A_i Ai的维数为 p i − 1 × p i p_{i-1}\times p_i pi1×pi

根据以上讨论,得到下列递推式:
在这里插入图片描述
求解最优解(由短序列到长序列,枚举 k k k所在位置的过程)
计算次序如下图所示:
在这里插入图片描述
求解最优加括号方案
在每次计算最优解表格的基础上,额外开一个相同大小的表格记录该最优解对应的 k k k值的位置, k k k A [ i : k ] A[i:k] A[i:k]中的边界 k k k

例题如下:

在这里插入图片描述复杂度分析

  • 时间复杂度:因为要枚举序列长度(从短序列到长序列),枚举序列起点(不用枚举序列终点,因为起点和长度确定了,终点也就确定了),枚举 k k k值,一共3层枚举。因此计算时间上界为 O ( n 3 ) O(n^3) O(n3)
  • 空间复杂度: m [ i ] [ j ] m[i][j] m[i][j]为一个2维表格,因此空间复杂度为 O ( n 2 ) O(n^2) O(n2)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值