算法复习:动态规划算法
2016-05-29 21:48
218 查看
1、 动态规划算法与分治法类似,基本思想也是将待求解问题分解成若干个子问题,先求解这些子问题,然后从这些子问题的解得到原问题的解。
而它与分治法的区别在于适合动态规划算法求解的问题分解得到的子问题往往不是相互独立的。这个特性导致用分治法解动态规划算法的问题时分解得到的子问题数目很多(注意,这里只是说分解得到的子问题,没说不同子问题),从而最后解决原问题要花费指数时间。 把这些子问题统计得到不同的子问题的数目常常是只有多项式量级的,说明我们在用分治法求解时有些子问题被重复计算了很多次。 保存已解决的子问题的答案,在之后再次遇到这些子问题时就可以直接调用先前保存的答案,这样就避免了大量重复的计算,把指数的时间缩减到了多项式的时间。 达到这个目的的最好办法就是用一张表,记录所有已解决的子问题的答案,不要管该子问题以后是否会用到,,只要它被计算过,就其结果填入表中。
这就是动态规划算法的基本思想,所有的动态规划算法都具有相同的填表格式。
2、动态规划算法适用于求解最优化问题。
最优化问题,就是在满足一定的约束条件下,寻找一组参数值,以使某些最优性度量得到满足,即使系统的某些性能指标达到最大或最小。这是运筹学涉及最多的问题,然而在学过运筹学后我竟然第一时间没反应过来。。。好伤心
动态规划算法通常的设计步骤如下:
1)找出最优解的性质,并刻画其结构特征;
这个性质主要包括两个:
A:最优子结构性质。当问题的最优解包含了其子问题的最优解时,称该问题具有最有子结构性质。利用这个性质可以自底向上递归地从子问题的最优解逐步构造出整个问题的最优解。
B:重叠子问题性质。这就是我们在思想里说到的,递归解动态规划问题时每次产生的子问题并不总是新的问题,有些子问题被反复计算多次,这就是子问题的重叠性质。
一般意义上讲,这两个性质是一个问题可用动态规划算法求解的基本要素。
2)递归的定义最优值;
3)以自底向上的方式计算出最优值;
4)根据计算最优值时得到的信息,构造最优解。
3、动态规划算法的一种变形是备忘录方法,区别在于备忘录方法的递归方式是自顶向下的,而动态规划算法则是自底向上的。这和运筹学中动态规划问题的顺序解法和逆序解法相似。其实最后发现这种思想和运筹学中的动态规划问题思路是一致的,分支限界算法也是,所以复习一下运筹学也许对理解更有帮助。
而它与分治法的区别在于适合动态规划算法求解的问题分解得到的子问题往往不是相互独立的。这个特性导致用分治法解动态规划算法的问题时分解得到的子问题数目很多(注意,这里只是说分解得到的子问题,没说不同子问题),从而最后解决原问题要花费指数时间。 把这些子问题统计得到不同的子问题的数目常常是只有多项式量级的,说明我们在用分治法求解时有些子问题被重复计算了很多次。 保存已解决的子问题的答案,在之后再次遇到这些子问题时就可以直接调用先前保存的答案,这样就避免了大量重复的计算,把指数的时间缩减到了多项式的时间。 达到这个目的的最好办法就是用一张表,记录所有已解决的子问题的答案,不要管该子问题以后是否会用到,,只要它被计算过,就其结果填入表中。
这就是动态规划算法的基本思想,所有的动态规划算法都具有相同的填表格式。
2、动态规划算法适用于求解最优化问题。
最优化问题,就是在满足一定的约束条件下,寻找一组参数值,以使某些最优性度量得到满足,即使系统的某些性能指标达到最大或最小。这是运筹学涉及最多的问题,然而在学过运筹学后我竟然第一时间没反应过来。。。好伤心
动态规划算法通常的设计步骤如下:
1)找出最优解的性质,并刻画其结构特征;
这个性质主要包括两个:
A:最优子结构性质。当问题的最优解包含了其子问题的最优解时,称该问题具有最有子结构性质。利用这个性质可以自底向上递归地从子问题的最优解逐步构造出整个问题的最优解。
B:重叠子问题性质。这就是我们在思想里说到的,递归解动态规划问题时每次产生的子问题并不总是新的问题,有些子问题被反复计算多次,这就是子问题的重叠性质。
一般意义上讲,这两个性质是一个问题可用动态规划算法求解的基本要素。
2)递归的定义最优值;
3)以自底向上的方式计算出最优值;
4)根据计算最优值时得到的信息,构造最优解。
只求最优值时不需要第4)步,若要求最优解,则在计算最有值时,也就是列表时要记录更多的信息。
3、动态规划算法的一种变形是备忘录方法,区别在于备忘录方法的递归方式是自顶向下的,而动态规划算法则是自底向上的。这和运筹学中动态规划问题的顺序解法和逆序解法相似。其实最后发现这种思想和运筹学中的动态规划问题思路是一致的,分支限界算法也是,所以复习一下运筹学也许对理解更有帮助。
相关文章推荐
- Clojure代码风格
- 牛腩视频总结(一)
- Could not execute JDBC batch update和hibernate.dialect' must be set when no Connection available错误
- JAVA学习总结十一
- Spring execution 表达式
- MySQL查询高速缓冲详解
- java之内部类(InnerClass)----非静态内部类、静态内部类、局部内部类、匿名内部类
- VirtualBox 安装 Centos 7 笔记
- js基本Constructor(构造器)
- 人脸识别(通过照片库区别人物)
- poj 1172 Street Race
- vim、g++、gdb及makefile的学习
- SQL Server 2008新特性——策略管理
- SQListe查询数据练习
- 数据存储——SQLite数据库存储2
- Microsoft.AspNet.SignalR 2.2
- 聚类算法分析
- Linux centos通过安装lszrz用CRT实现与Windows互相传文件
- 二叉树的操作 深度广度遍历,二叉树递归和非递归遍历
- asp.net错误页