您的位置:首页 > 其它

动态规划和分治法的初步认识

2016-03-31 17:57 281 查看
动态规划和分治法都是对递归算法的一种运用。动态规划和分治法都是用递归算法将一个问题分割成若干的子问题,对子问题进行求解,通过对子问题的组合来解决一个大问题。

 

分治法:核心思想就是分而治之。将一个问题分解成多个子问题,对每个子问题求解,再将子问题进行叠加,准确的说应该是组合,组合出的解就是最开始那个大问题的解。

分治法所能解决的问题一般具有以下几个特征:
1)
该问题的规模缩小到一定的程度就可以容易地解决
2)
该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。
3)
利用该问题分解出的子问题的解可以合并为该问题的解;
4)
该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
 
快速排序和归并排序都是对分治法的经典应用。它们的思想都是将一个无序的序列进行分割,对分割出的子序列进行排序。快排是利用一个基准点让一侧小于基准点另一侧大于基准点。而归并排序是对两个子序列进行合并,合并规则就是通过比较大小,合并成一个新的有序子序列。为什么要进行分割呢?这是因为排序问题具有最优子结构,当子问题规模足够小的时候非常容易的可以进行求解。依据分治法可以将很复杂的问题变得很简单,而且效率非常高。

 

动态规划:我觉得也是对一个问题进行分割,对子问题进行求解。动态规划是对决策问题的求解方法。既然是决策,那么必然存在好的决策和差的决策,动态规划的目的就行寻找最优的决策。动态规划不光具有子问题,而且还有很多子问题,这些子问题具有重叠性。所以动态规划在求解子问题的同时要进行决策,决策的目的就是要保证求解每一部分的子问题所做出的决策都是最好的。那么将每一步的决策组合的出来的最后决策也就是全局的最优决策。关于重叠子问题,我们解决每一个子问题时都会存在多个决策。那我们在做决策之间就会用到更小的子问题的结果。在选择使用哪种决策的同时必然会对那个更小的子问题进行多次调用。如果我们每次调用都要对子问题进行求解的话就太浪费时间了。这是我们就可以使用记忆化所搜,也就是打表,将更小的子问题保存到表中。当然不用对所有的子问题的解都进行保存,那实在是太多了。我们只保存在那个局面下的最优解即可。就这样一步一步的从最小的子问题开始,做出最优决策,将最优决策保存到表中,然后求解更大的子问题,求解中调用小问题解(已经存到了表中)。最后做出全局的最优决策。

动态规划最经典的应用就是01背包。在有限的空间内获得最大价值的物品。我们可以将这个空间分割成一个不可再分的小空间,再由这个小空间一步一步到最大的空间。如过我每一个小空间拿到的都是最大价值,那我当我把这个空间装满的时候拿到的也一定是最大的价值。

 

再来说一说总体动态规划和分治法。分治法只需要将问题分割,进行求解,然后将解进行组合,无需做其他的事情很简单。而动态规划就要复杂了,也是将问题分割,但是求解子问题的过程还要进行决策,选择最好的,这就不容易了。分治法就是你只管分,分到你能解决,然后在把这些结果组合起来就行了。但是动态规划是你不仅要分,还要在分完后进行决策,选择你要组合那些解。

    以上就是在看完分治法后对于分治法和动态规划的初步认识……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: