1.贪心算法
贪心点
:贪心算法即贪心选择策略(判断怎么选择才能做到每一次选择达到局部最优,即找到贪心点)排序
:贪心问题一般都涉及到排序(Comparable、Comparator),通常可能会涉及到两个选择属性自定义排序选择
:在排好序进行选择时,通常会选择满足可行解中最小的解,将更大的可行解保留用于解决之后的选择(既做到了局部最优,又有保留的将更有利的的解留到了后续选择中,做到了贪心)辅助
:常利用数组记录进行局部选择时满足可行解的个数或顺序位置
2.动态规划
- 1.
动态规划算法一般都有下面两种实现方式
,前者称为递归版本,后者称为迭代版本,且两个版本是可以相互转换的。
- 1.直接自顶向下实现递归式,并将中间结果保存,这叫备忘录法;
- 2.按照递归式自底向上地迭代,将结果保存在某个数据结构中求解。
- 2.一般求解思路
1.原问题分解为子问题
- 把原问题分解为若干个子问题,子问题和原问题地形式相同或类似,只是规模变小了。当子问题都解决时,原问题也就解决了。
- 子问题一旦求出就立即保存(重叠子问题性质),所以每个问题只需被求解一次
2.确定状态
- 在动态规划问题中,常常将和子问题相关的各个变量的一组取值称之为一个“状态”,经常碰到的情况是,k个整形变量能构成一种状态(如数字三角形问题中的行号和列号)。如果k个整形变量取值范围分别是N1、N2、N3…Nk,那么,我们经常会用一个k维数组 array[N1][N2][N3]…[Nk]来存储各个状态的值,而此值就是当前状态下子问题的解; 并且,此值未必是一个整形或浮点数,可能需要一个结构才能表示的,那么array数组就是一个结构数组。
3.确定一些初始状态(边界状态)的值
- 动态规划问题中经常采用递推实现,可以初始化最底层状态下的值。
4.确定状态转移方程
- 定义出什么是“状态”,以及在该“状态”下的值后,就要找出不同状态之下如何迁移——即如何从一个或多个“值”(已知的状态),求解出另一个“状态”下的值(“人人为我” 递推型) 状态的迁移可以用递推公式表示,此递推公式被称为:“状态转移方程”
3.贪心与动规区别联系
-
1.概念
-
贪心算法
基本思想:贪心算法并不从整体最优上加以考虑,它所做的选择只是在某种意义上的局部最优解。
基本要素:最优子结构性质
和贪心选择性质
。 -
动态规划
基本思想:将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
基本要素:最优子结构性质
和重叠子问题性质
、无后效性
无后效性
: 当前若干个值一旦确定后,此后过程的演变只与这若干个状态的值有关,和之前采用那种手段或经过哪条路径演变到当前若干个状态无关。 -
区别联系
-
共同点:两者都具有
最优子结构性质
-
不同点:
1.动态规划
算法中,每步所做的选择往往依赖于相关子问题的解,因而只有在解出相关子问题时才能做出选择。
贪心算法
,仅在当前状态下做出最好选择,即局部最优选择,然后再去解做出这个选择后产生的相应的子问题,对后续子问题继续选择从而达到全局最优。
2.动态规划算法通常以自底向上
的方式解各子问题,而贪心算法则通常自顶向下
的方式进行。