【算法分析】动态规划详解+范例+习题解答

🦄1.动态规划Dynamic Programming

1.1子问题的重叠性质

递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。这种性质称为子问题的重叠性质

1.2 动态规划【自底向上】和分治法【自顶向下】的适用情况

  • 不考虑计算效率的情况下,对分治法适用的问题,动态规划也适用;
  • 不考虑计算效率的情况下,对动态规划适用的问题,分治法也适用;
  • 当子问题具有重叠性质时,动态规划比分治法更有优势;
    在这里插入图片描述

1.3动态规划的基本思想

  • 将求解的较大规模的问题分割成k个更小规模的子问题。
  • 对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止。
  • 如果能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,就可以避免大量重复计算,从而提高计算效率。
  • 经分解得到的子问题往往不是互相独立的。不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次。

动态规划每次总是“自底向上”地求解问题,是否可能存在“多余求解”的情形?

1.4动态规划基本步骤

  • 找出最优解的性质,并刻划其结构特征。
  • 递归地定义最优值。
  • 以自底向上的方式计算出最优值。
  • 根据计算最优值时得到的信息,构造最优解。

🦄2.范例

2.1 矩阵连乘问题

给定n个矩阵{ A 1 A_1 A1, A 2 A_2 A2,…, A n A_n An},其中 A i A_i Ai A i + 1 A_i+1 Ai+1是可乘的,i=1,2 ,…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。

2.2.1 基本思想

矩阵连乘计算次序问题的最优解包含着其子问题的最优解。这种性质称为最优子结构性质。
具体:计算A[i:j]的最优次序所包含的计算矩阵子链 A[i:k]和A[k+1:j]的次序也是最优的

设计算A[i:j],1≤i≤j≤n,所需要的最少数乘次数m[i,j],则原问题的最优值为m[1,n]
当i=j时,A[i:j]=Ai,因此,m[i,i]=0,i=1,2,…,n
当i<j时,
在这里插入图片描述
可以递归地定义m[i,j]为:
在这里插入图片描述
k的位置只有 j-i 种可能

2.2.2 伪代码–分治法

【求解方法分治法】

利用递归式直接计算m[i:j]
static int MatrixChain (int i, int j)
   {
      if (i == j) return 0;
      int u = MatrixChain (i+1,j) + p[i-1]*p[i]*p[j];

      for (int k = i+1; k < j; k++) {
         int t = MatrixChain (i,k) + MatrixChain ( k+1,j) 
                    + p[i-1]*p[k]*p[j];
         if (t < u) {
           u = t;
          }
       }
       return u;
   }

2.2.3 伪代码–动态规划法

public static void matrixChain(int [] p, int [][] m  )
   {
      int n=p.length-1;
      for (int i = 1; i <= n; i++) m[i][i] = 0;
      for (int r = 2; r <= n; r++)# r连乘长度,2个矩阵连乘开始
         for (int i = 1; i <= n - r+1; i++) {
            int j=i+r-1;
            m[i][j] = m[i+1][j]+ p[i-1]*p[i]*p[j];
            #r=2时 M12、M23、M34.。。。。
            #r=3时 M13、M24、M35.。。。。
            👇找例如连乘为3时,里面有两种可能,通过循环找最小的可能结果
            for (int k = i+1; k < j; k++) {
               int t = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j];
               if (t < m[i][j]) {
                 m[i][j] = t;
                 }
            }
       }
   }

在这里插入图片描述
算法复杂度分析:
算法matrixChain的主要计算量取决于算法中对r,i和k的3重循环。循环体内的计算量为O(1),而3重循环的总次数为O(n3)。因此算法的计算时间上界为O(n3)。算法所占用的空间显然为O(n2)

2.3 重叠子问题

  • 递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。这种性质称为子问题的重叠性质。
  • 动态规划算法,对每一个子问题只解一次,而后将其解保存在一个表格中,当再次需要解此子问题时,只是简单地用常数时间查看一下结果。
  • 通常不同的子问题个数随问题的大小呈多项式增长。因此用动态规划算法只需要多项式时间,从而获得较高的解题效率。
    在这里插入图片描述

2.4 备忘录方法

备忘录方法的控制结构与直接递归方法的控制结构相同,区别在于备忘录方法为每个解过的子问题建立了备忘录以备需要时查看,避免了相同子问题的重复求解。

2.4.1伪代码

m->0
private static int lookupChain(int i, int j)
   {
      if (m[i][j] > 0) return m[i][j];
      if (i == j) return 0;
      int u = lookupChain(i+1,j) + p[i-1]*p[i]*p[j];
      s[i][j] = i;
      for (int k = i+1; k < j; k++) {
        int t = lookupChain(i,k) + lookupChain(k+1,j) + p[i-1]*p[k]*p[j];
        if (t < u) {
          u = t; s[i][j] = k;}
        }
      m[i][j] = u;
      return u;
   }

2.5 公共子序列

给定2个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。
设序列X={x1,x2,…,xm}和Y={y1,y2,…,yn}的最长公共子序列为Z={z1,z2,…,zk} ,则

1)若xm=yn,
则zk=xm=yn,且Zk-1是Xm-1和Yn-1的最长公共子序列。

2)若xm≠yn,
则Z是
Xm-1和Y的最长公共子序列,X和Yn-1的最长公共子序列,
中较长的序列
最长公共子序列👇
在这里插入图片描述
c表示最长匹配数

2.5.1公共子序列例子

若给定序列X={x1,x2,…,xm},则另一序列Z={z1,z2,…,zk},是X的子序列是指存在一个严格递增下标序列{i1,i2,…,ik}使得对于所有j=1,2,…,k有:zj=xij。

例,假设
序列 X = {A,B,C,B,D,A,B},
序列 Y = { B,C, D, B},
则Z是X的子序列,相应的递增下标序列为{2,3,5,7}。
在这里插入图片描述

🦄3.习题

3.1 矩阵相乘

  1. 矩阵A[mn],B[nt]相乘时,按照传统乘法,一共需要进行多少次元素间的相乘?
    mnt

  2. 设m[i,j]表示乘积Ai…Aj中所需最少的元素乘法数量,
    易知:m[4,5]=1000,m[5,6]=4000
    那么,m[4,6]=[填空1]
    在这里插入图片描述
    1)m[4,5] +(A45)A6 =1000 + 52020 =3000

  3. 设m[i,j]表示乘积Ai…Aj中所需最少的元素乘法数量,
    已知:m[3,4]=750,m[3,5]=2500,
    m[4,5]=1000,m[4,6]=3000,m[5,6]=4000
    那么,m[3,6]=[填空1]
    在这里插入图片描述
    m[3,3] +m[4,6] + 15520 =0+3000+1500 =4500

  4. 最优值
    在这里插入图片描述

🦄4.书后习题

3-1、3-4、3-2

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SGBM算法动态规划部分是指SGM算法(Semi-Global Matching)的实现。在SGBM算法,首先通过计算代价图来获取初始的视差图。然后,利用动态规划的思想对初始视差图进行优化,以得到更准确的视差图。 动态规划是一种优化问题的常用方法,它通过将问题分解为问题,并利用问题的最优解来求解整个问题的最优解。在SGBM算法动态规划被用于对每个像素的视差值进行优化。 具体来说,SGBM算法动态规划部分包括以下几个步骤: 1. 定义代价函数:根据图像的亮度差异等因素,定义一个代价函数来衡量不同视差值的匹配程度。 2. 计算代价图:对于每个像素,计算其与邻域像素的代价值,并将这些代价值组成一个代价图。 3. 动态规划优化:利用动态规划的思想,从左到右和从上到下遍历代价图,通过比较当前像素与其左侧和上方像素的代价值,选择最小的代价值作为当前像素的最优视差值。 4. 反向传播:从右下角开始,从右到左和从下到上遍历代价图,通过比较当前像素与其右侧和下方像素的代价值,进一步优化当前像素的最优视差值。 5. 视差平滑:为了进一步提高视差图的质量,可以对最终的视差图进行平滑处理,以减少噪声和不连续性。 通过以上步骤,SGBM算法能够对初始视差图进行优化,得到更准确的视差图。这样可以提高立体匹配的效果,使得物体的深度信息更加准确可靠。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

司六米希

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值