title: 算法设计与分析–第三章
date: 2022-10-06 12:51:08
tags:
- 算法设计
- 期末复习
大二下学期课程–算法设计与分析复习第三章
针对老师的ppt精简内容中的知识点,仅具参考
第三章 动态规划
- 动态规划(DynamicProgramming)技术已经广泛应用于许多组合优化问题的算法设计中,比如图的多起点与多终点的最短路径问题、矩阵链的乘法问题、最大效益投资问题、背包问题、最长公共子序列问题、图像压缩问题、最大子段和问题、最优二分检索树问题、RNA的最优二级结构问题等。
- 组合优化问题的解分布在搜索空间中,其中满足约束条件的解称为可行解,而在可行解中使得目标函数达到最小(或最大)值的解称为最优解,比如货郎问题需要找到最短的旅行路线,是极小化问题:而背包问题需要找到一组能够放人背包并且使背包价值达到最大的物品,是极大化问题。所谓求解组合优化问题就是找到该问题的最优解。
- 动态规划技术把求解过程变成一个多步判断的过程,每一步都对应于某个子问题。算法细心地划分子问题的边界,从小的子问题开始,逐层向上求解。通过子问题之间的依赖关系,有效利用前面己经得到的结果,最大限度减少重复工作,以提高算法效率。将许多时间复杂度为指数级别的算法优化为多项式级别。动态规划技术需要较大的存储空间来存储子问题的中间结果。
典例一 多起点多终点问题
算法一:蛮力算法
穷举所有路径输出最小值,时间复杂度:O(m*2^n),其中m为起点个数,n为路网层数
算法二:动态规划
从终点往起点推:
-
第一步:从以C(i)为起点到T(j)终点的最短路径;如F(Ci)=min{C1T1,C1T2}=C1T1=2
-
第二步:从以B(i)为起点到T(j)为终点的最短路径;如F(B(1))=B1C1+F(C1) = 9 + 2 = 11
F(B(2)) = min{B2C1+F(C1),B2C2+F(C2)}
即当2 < i < 5 时,F(Bi) = min{BiCi-1 + F(Ci-1) , BiCi + F(Ci) }处理边界:当 i = 1或i = 5时:
F(B1) = B1C1 + F(C1)
F(B5) = B5C4 + F(C4) -
类似得到:
F(Aj) = min{AjBk + F(Bk)}
F(Si) = min{SiAj + F(Aj)}
时间复杂度:O(m * n),其中m是每次节点数,n是层数
动态规划基本思想
- 求解的问题是多阶段决策(优化)问题;求解过程是多步判断,从小到大依次求解每个子问题,最后求解的子问题就是原始问题。
- 子问题目标函数的最小值之间存在依赖关系,将子问题的解记录下来,以备后面求解时使用。其中关于子问题目标函数的最小值之间的依赖关系是最关键的。
- 优化原则:一个最优决策序列的任何子序列本身一定是相对于子序列的初始和结束状态的最优的决策序列。
典例二 矩阵链的乘法问题
实例:P=<10,100,5,50>
A1:10×100,A2:100×5,A3:5×50,
乘法次序
(41A2)A3 = 10×100×5+10×5×50=7500
A1(A2A3) = 10×100×50+100×5×50=75000
工作量相差达到10倍之多
矩阵链的乘法问题是:给定向量P,确定一种乘法次序,使得基本运算的总次数达到最少。
算法一:蛮力算法
枚举所有可能的情况,找到最小运算次序
算法的时间复杂度为指数级别。
算法二:动态规划
例子:
P = {30 , 35 , 15 , 5 , 10 , 20 }
矩阵链 : A1 A2 A3 A4 A5
- 当规模为 1 时:
m[1,1] = 0
m[2,2] = 0
m[3,3] = 0
m[4,4] = 0
m[5,5] = 0 - 当规模为 2 时:
m[1,2] = 30 * 35 * 15
m[2,3] = 35 * 15 * 5
m[3,4] = 15 * 5 * 10
m[4,5] = 5 * 10 * 20 - 当规模为 3 时:
m[1,3] = min {m[1,2] + 30 * 15 * 5 ,m[2,3] + 30 * 35 * 5 }
m[2,4] = min{m[2,3] + 35 * 5 * 10 , m[3,4] + 35 * 15 * 10 }
m[3,5] = min{m[3,4] + 15 * 10 * 20 ,m[4,5] + 15 * 5 * 20 } - 当规模为 4 时:
m[1,4] = min{m[2,4] + 30 * 35 * 10 ,m[1,2] + m[3,4] + 30 * 15 * 10,m[1,3] + 30 * 5 * 10 }
m[2,5] = min{m[2.3] + m[4,5] + 35 * 5 * 20,m[3,5] + 35 * 15 * 20,m[2,4] + 35 * 10 * 20 } - 当规模为 5 时:即原问题
m[1,5] = min{m[2,5] + 30 * 35 * 20,m[1,2] + m[3,5] + 30 * 15 * 20,m[1,3] + m[4,5] + 30 * 5 * 20,m[1,4] + 30 * 10 * 20}
MatrixChain(P,n)
输入:矩阵链A的输入为向量P=<P1,P2,P3,....>,其中1≤i≤j≤n
输出:计算A的所需最小乘法运算次数m[,和最后一次运算的位置s[i,j]
1.令所有的m[i,初值为0,s[i,引初值为i
2.for r←-2 to n do ∥r为当前计算的链长(子问题规模)
3. for i←1 to n-+1 do //n-+1为最后一个链的前边界
4. j←i+r-1 ∥计算前边界为i,长为r链的后边界j
5. m[i,j]1←m[i+1,j]+p(i-1)*pi*pj //划分为A;(A+1…A),*为普通乘法
6. s[i,j]←i //记录分割位置
7. for k←i+1 to i-1 do
8. t←m[i,k]+m[k+1,j]+p(i-1)*pi*pj //划分位置(A.A)(Ak+1…A)
9. if t<m[i,j] //用更好的值替换
10. then m[i,j] ← t
11. s[i,j]←k
- 用递归实现动态规划算法求解矩阵链相乘最佳运算次序的算法时间复杂度是指数级
- 用迭代实现动态规划算法求解矩阵链相乘最佳运算次序的算法时间复杂度是多项式级
动态规划算法的基本要素
- 最优子结构:设计动态规划算法的第一步通常是要刻画最优解的结构。当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。
- 重叠子问题:可用动态规划算法求解的问题应具备的另一基本要素是子问题的重叠性质。在用递归算法自顶向下解此问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算。动态规划算法正是利用了这种子问题的重叠性质,对每个子问题只解一次,然后将其解保存在一个表格中(备忘录),当再次需要解此子问题时,只是简单地用常数时问查看一下结果。
动态规划算法设计步骤
- 划分子问题
用参数表达子问题的边界,将问题求解转变成多步判断的过程。 - 确定优化函数
以该函数的极大(或极小)作为判断的依据,确定是否满足优化原则。 - 列出关于优化函数的递推方程(或不等式)和边界条件。
- 考虑是否需要设立标记函数。
- 自底向上计算,以备忘录方法(表格)存储中间结果。
- 根据备忘录(和标记函数)通过追溯给出最优解。
典例三 背包问题
典例四 最长公共子序列
[外链图片转存中…(img-qYNUgdcf-1696847845216)]
典例五 图像压缩
-
问题分析
-
一般来说,在一幅图片中许多连续区域中像点的灰度值是接近的.比如有些交通标志图片,大片的区域是白的,可能少量区域有颜色,而且是比较单调的颜色.
-
对这样的图片可以采用分段存储的方法:对灰度值较小的段的像素采用比较少的位数,比如2位;对灰度值较大的段的像素采用较多的位数,比如8位,这样就可能减少空间的占用,这就是变位压缩技术的基本想法。
-
变位压缩技术技术节省了空间,但在读取图像时带来了新的问题.在每个像素8位的存储方法中,读取图像时每8位就是一个像素的灰度值,不会出错但是对于分段压缩的图像,看起来就是一个长长的0-1序列.当读取这个序列时,怎么知道每段的划分位置及每段像素占用的二进制位数呢?这里需要对段的划分和段中像素使用的二进制位数(要求同一段内不同像素用的存储位数都一样)给出明确的信息。为此,我们对每个段给出两个整数值
一个表示该段含有的像素个数
一个表示每个像素所占用的二进制位数. -
比如第段,有个像素,每个像素用b位.由于某些技术要求,规定每段像素总数不超过256,即≤256.于是可以用8位来表示[(8位二进制数恰好有256个值).此外,由于每个灰度值在0~255之间,表达每个灰度值所用二进制数的位数b[不超过8,于是记录b[i]还需要3个二进制位
-
对每段来说,这额外的11位作为段头信息.从直觉上来说,分段越多,每段内部像素所占用的位数会减少,但过多的段头会消耗较多的二进制位.相反,分段越少,段内像素的空间消耗会增加,但是段头消耗少
-
[外链图片转存中…(img-zeNuefDC-1696847845219)]
S[5] = 50
S[6] = 57
典例六 最大子段和
实例:<-2,11,-4,13,-5,-2>
解:最大子段和a2+a3+a4=20
[外链图片转存中…(img-9T6vRmTe-1696847845220)]
三种算法:
- 蛮力(暴力)时间复杂度:O(n^3)
- 分治时间复杂度:O(nlogn)
- 动态规划时间复杂度:O(n)
典例七 最优二叉检索树
最优二分检索树:在给定存取概率分布下平均比较次数最少的二分检索树。
- 一个实例
[外链图片转存中…(img-KmYzZIJj-1696847845221)]
[外链图片转存中…(img-qlwB02hp-1696847845222)]