计算机算法学习笔记-动态规划

学习笔记:

2018、5、18:·

第五章动态规划:

算法设计要素:问题建模的优化目标函数 约束条件; 怎么划分子问题,边界如何界定; 问题的优化函数值和子问题的优化值有什么关系递推关系是什么;  是否满足优化原则; 最小子问题怎么界定他的优化函数值也就是初值是多少。

例子:矩阵链相乘: 确定矩阵乘法顺序,使得元素相乘的总次数最少 

i行j列乘j行k列 运算次数=ijk

蛮力算法:Ω(2^2n/n^3/2)

动态规划算法: 划分子问题 得到最少次数的划分法划分成两段,每段再按照这种方法递推到最小的矩阵

设计思想:多阶段决策,每一步处理一个子问题,界定子问题的边界; 递推方程和初值;看是否满足优化原则

时间复杂度分析:2^n-1 动态递归算法的实现效率不高, 同一子问题重复出现

动态规划算法的迭代实现:从最小的子问题算起,考虑计算顺序,以保证后面用到的值前面已经算好,把结果存起来,还要标记每一步的决策,追踪解  时间复杂度  O(n^3)  需要设计备忘录和标记函数

递归实现:时间复杂度高,空间小 迭代相反

怎么么估计动态规划时间复杂度: 备忘录的各项计算量之和+追踪解的工作量

--------------------------------------------------

投资问题:m元钱,n项投资 求最大收益

子问题界定:两个参数:一个是k个项目,另一个是投资总钱数Fk(x)表示x投给k个项目的最大收益,多步判断:p<x投给前k-1个项目的最大收益Fk-1(p),确定x元钱都给前k个项目的方案

递推方程:Fk(x)=max{fk(xk)+Fk-1(x-xk)}:最大化在最后一个项目投xk元的情况下的收益和前K-1次的最大收益的和 记录下最大收益函数和每一次对最后一项投资的钱数,这样的话就能倒退回去找到每一项的投资数,因为没一项记录的都是最后一项的投资数,所以就可以把对每一项的投资数剥离开来。但那是有个问题就是你必须得把所有的度列出来,否则根本没法追踪啊,这样时间复杂度肯定高:O(nm^2) ,但是也比蛮力算法好的多

-------------------------------------------------------------

背包问题: n中物品,重量和价值为w,v max总w

线性规划问题 整数规划问题

子问题界定:k表示物品 y表示总重

递推方程:Fk(y) =max{Fk-1(y),Fk(y-wk)+vk}

标记函数和追踪解都是用表查到的

时间复杂度: O(nb) 伪多项式时间算法:不是输入规模的多项式,b是整数,表达b需要logb位,输入规模以n,logb为参数。

背包问题推广: 物品数受限; 多背包问题; 二维背包问题;

子问题界定有2个参数, 列出递推方程和边界条件; 自底向上计算设计备忘录;标记算法和追踪算法的设计

问题:背包问题这么复杂还要自己求表格,这么麻烦有什么应用

----------------------------------------------------------------------------

最长公共子序列:

两个序列:X Y各有m n个元素

蛮力算法:O(n2^m)

动态规划:

子问题界定:两个参数,类似棋盘的格子 三种可能移动的方式 得到递推方程

标记函数:三种不同的移动方向

追踪解 伪码

时空复杂度: mn同级

第六章 动态规划2

动态规划的应用:图像压缩 最大子段和 最优二叉检索树 RNA二级结构预测 序列对比

图像压缩:

存储黑白图像:0-25灰度值,为8位二进制数的灰度值序列。每个像素占8位,总共为8n

变位压缩:分为m段 段头记录像素和每个像素占的位数 11位 总占位数=位数*像素位数+11*总段数

EG:约束条件:每一段像素个数<=256,某一段占用的空间

三种分法及其时间复杂度

子问题界定与计算顺序:子问题前边界为1,后边界为i  优化函数值S[i]为最优分段存储为数,

递推方程:Sm是最后分段,S[i]=min{S[i-j]+j*b[i-j+1]}+11 b[i-j+1,i]=上取整log(maxpk+1)<=8 就是先用第二个十字吧最后一段的最大位数求出来,然后用递推方程:总存储位数=除了最后一段的总的最有存储位数+最后一段的存储位数+段头11

eg:  6 为长度 O(n)

关键:递推方程和初值 子问题的界定 标记函数和解的追踪 时间复杂度计算

最大字段和:

算法1:蛮力算法 O(n^3)

算法2:分支策略 O(nlogn)

算法3 :动态算法 优化函数可以和原始函数不一样 时间复杂度为O(n)

动态规划算法:子问题的界定 列优化函数的递推方程和边界条件 (不一定是原问题的优化函数) 自底向上计算,设计备忘录 如何根据动态规划的解找原问题的解 时间复杂度估计

最优二叉检索树:

二叉检索树: 通过把元素存在一个二叉树的结点上,查找数是否在树上

初始 和树根比较,小于根元素的话,进入左子树,大于的话,进入右子树,相等就停止,直到树叶结点算法停止

概率分布:

输入给定一个序列 得到S的存取概率分布 在其中的用b表示,在间隙的用a表示

问题:二叉树应该怎么样组织,使得检索的平均次数最少

eg: 计算的时候分开算 在树上的和不在树上的

平均比较次数计算 数据结点比较次数=层数+1 空隙结点比较次数=层数

问题:给定数据集和概率存取分布 找到一颗最优二叉检索树

算法: 

什么参数界定边界子问题 怎么递推和初值  计算顺序 标记函数的设定 时间复杂度分析 

子问题划分 其实就是照着原问题缩小规模 

怎么规约子问题:分成两个子问题 

子问题概率之和:所有在结点上的概率之和+在间隙上的概率之和

递推方程:两个部分的平均比较次数最小值+子问题概率之和  求解之后的这个解只是其中一个结点的结果,所以需要对所有的结果取min

计算复杂性估计 O(n^2)个子问题 每种都要对不同的k进行计算,k=O(n),每次计算为常数时间 

时间复杂性:O(n^3)  空间复杂度: O(n^2)

划分子问题,以数据节点作为树根 定义优化函数就是把递推方程和边界条件写出来 自顶向上计算 设计备忘录,就是把存取函数的值记录下来 标记函数记录下构成最优二叉搜索树或子树时候根的位置 把k记录下来。

RNA二级结构的预测 

输入一级结构 预测二级结构 求具有最多匹配机对数的二级结构

匹配原则:不能交叉配对 或者出现尖角

用最后一个碱基找到一个配对,用不能交叉的原则分成两个子对,然后就可以进行递归了

时间复杂度:ij组合有O(n^2) 找到匹配O(n) 所以最终O(n^3)

序列比对:

输出相似性有多大 

编辑距离:给定连个序列 通过操作把第一个序列转变成第二个序列 完成这种转换所需的最少操作个数为编辑距离

动态规划算法设计要点:

引入参数来界定子问题的边界,注意子问题的重叠程度; 带参数的优化函数的定义与递推关系,找到初值;判断优化问题是否满足优化原则;考虑优化函数; 备忘录和标记函数;复杂度计算:备忘录和追踪解之和:备忘录看有多少项目看递推方程计算这个项需要查找哪些值遍历范围 或者用伪码看有多少循环,而每个循环中有多少个变量运算 

  

发布了37 篇原创文章 · 获赞 17 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Cherylzzx/article/details/80359799
今日推荐