Yin的笔记本

vuePress-theme-reco Howard Yin    2021 - 2025
Yin的笔记本 Yin的笔记本

Choose mode

  • dark
  • auto
  • light
Home
Category
  • CNCF
  • Docker
  • namespaces
  • Kubernetes
  • Kubernetes对象
  • Linux
  • MyIdeas
  • Revolution
  • WebRTC
  • 云计算
  • 人工智能
  • 分布式
  • 图像处理
  • 图形学
  • 微服务
  • 数学
  • OJ笔记
  • 博弈论
  • 形式语言与自动机
  • 数据库
  • 服务器运维
  • 编程语言
  • C
  • Git
  • Go
  • Java
  • JavaScript
  • Python
  • Nvidia
  • Rust
  • Tex
  • Shell
  • Vue
  • 视频编解码
  • 计算机网络
  • SDN
  • 论文笔记
  • 讨论
  • 边缘计算
  • 量子信息技术
Tag
TimeLine
About
查看源码
author-avatar

Howard Yin

303

Article

153

Tag

Home
Category
  • CNCF
  • Docker
  • namespaces
  • Kubernetes
  • Kubernetes对象
  • Linux
  • MyIdeas
  • Revolution
  • WebRTC
  • 云计算
  • 人工智能
  • 分布式
  • 图像处理
  • 图形学
  • 微服务
  • 数学
  • OJ笔记
  • 博弈论
  • 形式语言与自动机
  • 数据库
  • 服务器运维
  • 编程语言
  • C
  • Git
  • Go
  • Java
  • JavaScript
  • Python
  • Nvidia
  • Rust
  • Tex
  • Shell
  • Vue
  • 视频编解码
  • 计算机网络
  • SDN
  • 论文笔记
  • 讨论
  • 边缘计算
  • 量子信息技术
Tag
TimeLine
About
查看源码
  • 动态规划复习

    • 矩阵连乘
      • 钢条切割
        • 最长公共子序列(LCS)
          • 最优二叉搜索树
            • 流水线作业调度问题
              • 进一步剪枝:Johnson法则

          动态规划复习

          vuePress-theme-reco Howard Yin    2021 - 2025

          动态规划复习


          Howard Yin 2020-12-27 12:21:02 数学算法
          • 最优子结构:原问题的最优解包含子问题的最优解
          • 重叠子问题:用来求解原问题的算法能重复地解相同的子问题而不产生新的子问题

          # 矩阵连乘

          • 两矩阵MiM_iMi​和Mi+1M_{i+1}Mi+1​,维数分别是pi×pi+1p_i\times p_{i+1}pi​×pi+1​和pi+1×pi+2p_{i+1}\times p_{i+2}pi+1​×pi+2​,则Mi⋅Mi+1M_i\cdot M_{i+1}Mi​⋅Mi+1​需要进行pi×pi+1×pi+2p_i\times p_{i+1}\times p_{i+2}pi​×pi+1​×pi+2​次乘法
          • nnn个矩阵连乘M1⋅M2⋅⋯⋅MnM_1\cdot M_2\cdot\dots\cdot M_nM1​⋅M2​⋅⋯⋅Mn​,加括号使得乘法运算次数最少

          设M1⋅M2⋅⋯⋅MnM_1\cdot M_2\cdot\dots\cdot M_nM1​⋅M2​⋅⋯⋅Mn​最少的连乘次数为f(1,n)f(1,n)f(1,n),那么它显然是从所有位置切开分为左右两部分相乘的方案中最优的那一个,即包含子问题的最优解:

          f(i,j)=max{f(i,k−1)+f(k,j)+pipkpj+1∣i<k≤j}f(i,j)=max\{f(i,k-1)+f(k,j)+p_ip_kp_{j+1}|i<k\leq j\} f(i,j)=max{f(i,k−1)+f(k,j)+pi​pk​pj+1​∣i<k≤j}

          对于f(1,n)f(1,n)f(1,n),其重叠子问题的集合为:

          {f(i,j)∣1≤i≤j≤n}\{f(i,j)|1\leq i\leq j\leq n\} {f(i,j)∣1≤i≤j≤n}

          共n(n+1)/2n(n+1)/2n(n+1)/2个,因此空间复杂度为O(n2)O(n^2)O(n2);每个f(i,j)f(i,j)f(i,j)都需要从iii到jjj计算一遍f(i,k−1)+f(k,j)+pipkpj+1f(i,k-1)+f(k,j)+p_ip_kp_{j+1}f(i,k−1)+f(k,j)+pi​pk​pj+1​,因此时间复杂度为O(n3)O(n^3)O(n3)。

          # 钢条切割

          切割销售一段长度为nnn的钢条,对于切出的每个长度iii都有一个销售价格pip_ipi​,问如何切使收益最大。

          若设f(x)f(x)f(x)为长度为nnn钢条切割后的最大收益,那么它包含子问题的最优解:

          f(x)=max{f(x−i)+pi∣1≤i≤x}f(x)=max\{f(x-i)+p_i|1\leq i\leq x\} f(x)=max{f(x−i)+pi​∣1≤i≤x}

          对于f(n)f(n)f(n),其重叠子问题的集合为:

          {f(x)∣1≤x≤n}\{f(x)|1\leq x\leq n\} {f(x)∣1≤x≤n}

          共nnn个,因此时间复杂度为O(n)O(n)O(n)。

          # 最长公共子序列(LCS)

          • X=x1x2…xmX=x_1x_2\dots x_mX=x1​x2​…xm​, 若1≤i1<i2<⋯<ik≤m1\leq i_1<i_2<\dots <i_k\leq m1≤i1​<i2​<⋯<ik​≤m,使Z=z1z2…zk=xi1xi2…xikZ=z_1z_2\dots z_k=x_{i_1}x_{i_2}\dots x_{i_k}Z=z1​z2​…zk​=xi1​​xi2​​…xik​​, 称ZZZ是XXX的子序列
          • ZZZ是序列XXX与YYY的公共子序列:ZZZ既是XXX的子序列又是YYY的子序列

          若设LCS(Xm,Yn)LCS(X_m,Y_n)LCS(Xm​,Yn​)是Xm=x1x2…xmX_m=x_1x_2\dots x_mXm​=x1​x2​…xm​和Yn=y1y2…ynY_n=y_1y_2\dots y_nYn​=y1​y2​…yn​的最长公共子序列,那么它包含子问题的最优解:

          LCS(Xm,Yn)={LCS(Xm−1,Yn−1)+1xm=ynmax{LCS(Xm−1,Yn),LCS(Xm,Yn−1)}xm≠ynLCS(X_m,Y_n)=\left\{\begin{aligned} LCS(X_{m-1},Y_{n-1})+1&&x_m=y_n\\ max\{LCS(X_{m-1},Y_{n}),LCS(X_{m},Y_{n-1})\}&&x_m\not=y_n\\ \end{aligned}\right. LCS(Xm​,Yn​)={LCS(Xm−1​,Yn−1​)+1max{LCS(Xm−1​,Yn​),LCS(Xm​,Yn−1​)}​​xm​=yn​xm​​=yn​​

          对于LCS(Xm,Yn)LCS(X_{m},Y_{n})LCS(Xm​,Yn​),其重叠子问题集合为:

          {LCS(Xi,Yj)∣1≤i≤m,1≤j≤n}\{LCS(X_{i},Y_{j})|1\leq i\leq m,1\leq j\leq n\} {LCS(Xi​,Yj​)∣1≤i≤m,1≤j≤n}

          共mnmnmn个,故时间复杂度为O(mn)O(mn)O(mn)。

          # 最优二叉搜索树

          最优二叉搜索树

          若设w(i,j)=∑k=ijqk+∑k=i+1jpkw(i,j)=\sum_{k=i}^jq_k+\sum_{k=i+1}^{j}p_kw(i,j)=∑k=ij​qk​+∑k=i+1j​pk​

          最优二叉搜索树

          在一个二叉搜索树中,每一条边的权值都是其所连子树的所有元素的权值和,而每下一层搜索长度+1,因此以某个点为根的子树所产生的的平均搜索长度是其左右子树的概率×1\times 1×1加上总的概率×1\times 1×1:

          因此以pk,k∈[i,j]p_k,k\in[i,j]pk​,k∈[i,j]为根的最优二叉树贡献的平均搜索长度c(i,j)c(i,j)c(i,j)为:

          c(i,j)=w(i,j)+c(i,k−1)+c(k,j)c(i,j)=w(i,j)+c(i,k-1)+c(k,j) c(i,j)=w(i,j)+c(i,k−1)+c(k,j)

          要找到这个最优二叉树c(i,j)c(i,j)c(i,j),即是找到最优的根节点kkk,它包含子问题的最优解:

          c(i,j)=w(i,j)+min{c(i,k−1)+c(k,j)∣1<k≤j}c(i,j)=w(i,j)+min\{c(i,k-1)+c(k,j)|1<k\leq j\} c(i,j)=w(i,j)+min{c(i,k−1)+c(k,j)∣1<k≤j}

          最优二叉搜索树 最优二叉搜索树 最优二叉搜索树 最优二叉搜索树 最优二叉搜索树 最优二叉搜索树

          对于c(0,n)c(0,n)c(0,n),它的重叠子问题集合为:

          {c(i,j)∣1≤i≤j≤n}\{c(i,j)|1\leq i\leq j\leq n\} {c(i,j)∣1≤i≤j≤n}

          共n(n+1)/2n(n+1)/2n(n+1)/2个,因此空间复杂度为O(n2)O(n^2)O(n2);每个c(i,j)c(i,j)c(i,j)都需要从iii到jjj计算一遍c(i,k−1)+c(k,j)c(i,k-1)+c(k,j)c(i,k−1)+c(k,j),因此时间复杂度为O(n3)O(n^3)O(n3)。

          # 流水线作业调度问题

          流水线作业调度问题

          显然,在最优方案中:

          • 两台机上上加工次序完全相同
            • 若不然,某个任务需要等待其后执行的任务完成第二道工序才能执行,时间更长
          • 第一道工序是无间断的
            • 第一道工序没有任何依赖,可以一个一个持续执行

          进而,此问题的搜索树是一个排列树,即确定任务的执行次序。

          若设任务集合为SSS,开始执行时第二道工序还在执行其他任务,ttt时间后才能使用,设此情况下的最优调度花费的时间为T(S,t)T(S,t)T(S,t),如果此时最优方案是选择aia_iai​作为第一个执行的任务,那么:

          T(S,t)={ai+T(∁S{i},bi)t≤aiai+T(∁S{i},bi+(t−ai))t>aiT(S,t)=\left\{\begin{aligned} &a_i+T(\complement_S\{i\},b_i)&&t\leq a_i\\ &a_i+T(\complement_S\{i\},b_i+(t-a_i))&&t>a_i\\ \end{aligned}\right.T(S,t)={​ai​+T(∁S​{i},bi​)ai​+T(∁S​{i},bi​+(t−ai​))​​t≤ai​t>ai​​

          进而找最优解T(S,t)T(S,t)T(S,t)就是找最优的aia_iai​的过程,其包含子问题的最优解:

          T(S,t)=ai+min{T(∁S{i},bi+max{t−ai,0})∣i∈S}T(S,t)=a_i+min\{T(\complement_S\{i\},b_i+max\{t-a_i,0\})|i\in S\} T(S,t)=ai​+min{T(∁S​{i},bi​+max{t−ai​,0})∣i∈S}

          重叠子问题的集合为:

          {T(S,t∁NS)∣S⊆N}\{T(S,t_{\complement_NS})|S\subseteq N\} {T(S,t∁N​S​)∣S⊆N}

          相当于把NNN的每个非空子集都计算一次,共∑k=1nCnk=2n−1\sum_{k=1}^nC_n^k=2^n-1∑k=1n​Cnk​=2n−1个,每次计算都要把SSS中的任务全扫一遍,时间复杂度O(n2n−1)O(n2^n-1)O(n2n−1)。

          # 进一步剪枝:Johnson法则

          假定在T(S,t)T(S,t)T(S,t)中,前两个被执行的任务是aia_iai​和aja_jaj​,那么:

          T(S,t)=ai+min{T(∁S{i},bi+max{t−ai,0})∣i∈S}=ai+T(∁S{i},ti)ti=bi+max{t−ai,0}=ai+aj+T(∁S{i,j},tij)tij=bj+max{ti−aj,0}\begin{aligned} T(S,t)&=a_i+min\{T(\complement_S\{i\},b_i+max\{t-a_i,0\})|i\in S\}&\\ &=a_i+T(\complement_S\{i\},t_i)&t_i=b_i+max\{t-a_i,0\}\\ &=a_i+a_j+T(\complement_S\{i,j\},t_{ij})&t_{ij}=b_j+max\{t_i-a_j,0\}\\ \end{aligned} T(S,t)​=ai​+min{T(∁S​{i},bi​+max{t−ai​,0})∣i∈S}=ai​+T(∁S​{i},ti​)=ai​+aj​+T(∁S​{i,j},tij​)​ti​=bi​+max{t−ai​,0}tij​=bj​+max{ti​−aj​,0}​

          而其中:

          tij=bj+max{ti−aj,0}=bj+max{bi+max{t−ai,0}−aj,0}=bj+bi−aj+max{max{t−ai,0},aj−bi}=bj+bi−aj+max{t−ai,0,aj−bi}=bj+bi−aj−ai+max{t,ai,ai+aj−bi}\begin{aligned} t_{ij}&=b_j+max\{t_i-a_j,0\}\\ &=b_j+max\{b_i+max\{t-a_i,0\}-a_j,0\}\\ &=b_j+b_i-a_j+max\{max\{t-a_i,0\},a_j-b_i\}\\ &=b_j+b_i-a_j+max\{t-a_i,0,a_j-b_i\}\\ &=b_j+b_i-a_j-a_i+max\{t,a_i,a_i+a_j-b_i\}\\ \end{aligned} tij​​=bj​+max{ti​−aj​,0}=bj​+max{bi​+max{t−ai​,0}−aj​,0}=bj​+bi​−aj​+max{max{t−ai​,0},aj​−bi​}=bj​+bi​−aj​+max{t−ai​,0,aj​−bi​}=bj​+bi​−aj​−ai​+max{t,ai​,ai​+aj​−bi​}​

          可以证明对于最优方案中的所有相邻任务ai,aja_i,a_jai​,aj​,min{bi,aj}≥min{bj,ai}min\{b_i,a_j\}\geq min\{b_j,a_i\}min{bi​,aj​}≥min{bj​,ai​}必然成立:

          反证法,若min{bi,aj}<min{bj,ai}min\{b_i,a_j\}<min\{b_j,a_i\}min{bi​,aj​}<min{bj​,ai​}

          min{bi,aj}<min{bj,ai}−min{bi,aj}>−min{bj,ai}max{−bi,−aj}>max{−bj,−ai}ai+aj+max{−bi,−aj}>ai+aj+max{−bj,−ai}max{ai+aj−bi,ai}>max{ai+aj−bj,aj}max{t,ai+aj−bi,ai}≥max{t,ai+aj−bj,aj}max{t,ai+aj−bi,ai}≥max{t,ai+aj−bj,aj}tij≥tji\begin{aligned} min\{b_i,a_j\}&<min\{b_j,a_i\}\\ -min\{b_i,a_j\}&>-min\{b_j,a_i\}\\ max\{-b_i,-a_j\}&>max\{-b_j,-a_i\}\\ a_i+a_j+max\{-b_i,-a_j\}&>a_i+a_j+max\{-b_j,-a_i\}\\ max\{a_i+a_j-b_i,a_i\}&>max\{a_i+a_j-b_j,a_j\}\\ max\{t,a_i+a_j-b_i,a_i\}&\geq max\{t,a_i+a_j-b_j,a_j\}\\ max\{t,a_i+a_j-b_i,a_i\}&\geq max\{t,a_i+a_j-b_j,a_j\}\\ t_{ij}&\geq t_{ji} \end{aligned} min{bi​,aj​}−min{bi​,aj​}max{−bi​,−aj​}ai​+aj​+max{−bi​,−aj​}max{ai​+aj​−bi​,ai​}max{t,ai​+aj​−bi​,ai​}max{t,ai​+aj​−bi​,ai​}tij​​<min{bj​,ai​}>−min{bj​,ai​}>max{−bj​,−ai​}>ai​+aj​+max{−bj​,−ai​}>max{ai​+aj​−bj​,aj​}≥max{t,ai​+aj​−bj​,aj​}≥max{t,ai​+aj​−bj​,aj​}≥tji​​

          即如果不满足min{bi,aj}≥min{bj,ai}min\{b_i,a_j\}\geq min\{b_j,a_i\}min{bi​,aj​}≥min{bj​,ai​},将ai,aja_i,a_jai​,aj​交换位置后更节约时间,进而T(S,t)T(S,t)T(S,t)也不是最优方案。

          因此,在最优方案中必然有min{bi,aj}≥min{bj,ai}min\{b_i,a_j\}\geq min\{b_j,a_i\}min{bi​,aj​}≥min{bj​,ai​}成立。

          这个不等式给我们带来了一个剪枝方法:已选择的前一个任务为iii,已知ai,bia_i,b_iai​,bi​,那么后一个任务jjj只能在满足min{bi,aj}≥min{bj,ai}min\{b_i,a_j\}\geq min\{b_j,a_i\}min{bi​,aj​}≥min{bj​,ai​}的任务中选。进而·能通过剪枝降低算法复杂度。

          帮助我们改善此页面!
          创建于: 2020-12-27 12:21:22

          更新于: 2020-12-27 12:21:22