分治、动态规划,备忘录的区别

最近学算法分析,遇到一个很头疼的问题,分治,动态规划,备忘录搞不清,遇到问题不知道应该用什么样的方法合适,查阅很多资料后根据我的理解整理一下。
分治:分治算法对问题进行分解时所遵循的原则是将待求解问题分解为若干个规模较小、相互独立且与原问题相同的子问题(不包含公共的子问题)。

动态规划:对问题进行分解时所遵循的原则是将待求解问题分解为若干个规模较小、相互关联的与原问题类似的子问题(包含公共的子问题),采用记录表的方法来保存所有已解决问题的答案,而在需要的时候再找出已求得的答案,避免大量的重复计算。与分治法类似,动态规划法 也是把问题一层一层地分解为规模逐渐减小的同类型的子问题。动态规划法与分治法的一个重要的不同点在于,用分治法分解后得到的子问题通常都是相互独立的, 而用动态规划法分解后得到的子问题很多都是重复的。因此,对重复出现的子问题,只是在第一次遇到时才进行计算,然后把计算所得的结果保存起来;当再次遇到该子问题时,就直接引用已保存的结果,而不再重新求解。
备忘录:是动态规划算法的变形,它通过分治思想对原问题进行分解,以存储子问题的解的方式解决冗余计算,并采用自顶向下的递归方式获取问题的最终解。与动态规划算法的不同之处是动态规划算法的递归方式是自底向上递归求解,而备忘录方法的递归方式是自顶向下递归求解。
怎么选择
当一个问题的所有子问题都至少要解一次时,使用动态规划算法。
当子问题空间中的部分子问题不需要求解时,使用备忘录方法。
自底向上与顶向下
自底向上:从初始的已知状态出发,逐步向外拓展,达到最终目的的过程。
自顶向下:从最终状态开始,找到可以达到该状态的前一个状态,如果前一个状态还没有被处理,就先去处理该状态。如果还不明白请参考http://www.360doc.com/content/16/0906/13/30724179_588796415.shtml

你可能感兴趣的:(算法分析与设计)