《算法导论》笔记(8) 动态规划、贪心法、摊还分析 简述

动态规划的步骤:构造最优解的结构,子问题求解后保存,计算最优解的值。最优解的结构是张表。动态规划的关键就是:1,构造合适的表;2,找到合适的子问题分解原问题。有两种方法计算最优解,一是自顶向下递归求解,保存已知的子问题的解到数组或散列表,需要时在表中查询此解;二是自底向上求解,每个子问题只求解一次,向上合并问题直至最终得到最优解。其实这两个方法没有本质区别,因为方法1是递归定义和保存已知子问题解,本质上也是先分解到最底层然后每个子问题求解保存再向上合并。动态规划算法的运行时间与顶点和边的数量呈线性关系。动态规划算法与分治的区别在于动态规划要求可以划分独立但有重叠的子问题,子问题独立使得问题可以分治求解,而重叠子问题减少了子问题的求解次数,而单纯的分治方法是每次递归产生全新的子问题。

贪心算法比动态规划更高效。每一步都做出局部最佳选择,从而得到全局最优解。步骤是设计一个递归算法,每一步做出一个贪心选择,则只剩下一个子问题,对子问题递归求解。需要证明的是每次贪心选择都是安全的。递归算法通常可以转化为迭代算法。贪心算法与动态规划的区别是,动态规划每个步骤的选择是一个或多个子问题的组合,依赖于子问题的解,而子问题的求解又依赖于更低层的子问题的解,所以先解决较小的子问题,然后扩展到较大的子问题,每上升一层就根据下层子问题的解打散组合重新求解本层的所有子问题,直到最终回到顶部,按照每次递归分解出子问题的个数n得到一张n维的表格;贪心算法可以确定一个当时的最佳选择,并且一定包含于最优解之中。这一点需要证明。

摊还分析。有三种:聚合分析,核算法,势能法。聚合分析:n个操作最坏情况下总时间T(n),每个操作的平均代价是T(n)/n。比如栈操作每次平均代价是1;核算法:某些操作的费用多于或少于其实际代价,费用称为摊还代价。摊还代价与实际代价的差额称为信用。比如栈操作中入栈代价为2出栈为0。势能:预付代价累加以作为整个数据结构的势能,每个操作的摊还代价是实际代价加上势能的增长。有一个例子是表扩张与收缩。策略是超过一半元素则扩张1倍,低于1/4元素则收缩1/2。势函数为2*T.n-T.size,当表中元素超过一半时;或T.size/2-T.n,当表中元素低于一半时。表扩张或收缩时要复制所有元素到新表,一次性付出代价为T.n。插入或删除时实际代价为1,摊还代价为势函数的变化量。插入元素从半满到满,若每次摊还为2,总势能增加了T.size,扩张后复制了size个元素,势能回到0。删除元素从半满到1/4满,每次摊还为2,总势能增加了T.size/2,收缩后复制了size/2个元素,势能也回到0。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值