相同点:
分治法和动态规划都是通过将问题分解成子问题,通过子问题的求解,实现对整个问题的求解。
区别:
1. 子问题关系:
分治法中划分出的子问题是完全相互独立的,子问题求解的之间无相互依赖关系,不相互影响。
动态规划中划分出的子问题不是相互独立的,不同子问题通常包含一些公共子问题(公共子问题通常是子问题的组成部分),通过公共子问题的求解实现子问题的求解,子问题再通过对比和选择,求解出整个问题。
2. 共用程度:
分治法划分出的子问题通常具有“相似”的结构,因此可以用相同的“算法思想”解决。由于只是思想相同,但结果并不通用,所以用自顶向下的递归过程来求解。
动态规划分出的子问题通常具有“相同”的子问题,因此可以用相同的“中间结果”解决。在动态规划中通常会保留子问题的计算结果,供其他求解过程重用,而且为了提高重用程度,会使用自底向上的求解过程,而不直接使用相对费时的递归过程。
3.使用场景(自我总结):
分治法通常用于针对 不同的输入条件,按照要求进行加工。
动态规划通常是针对 固定的输入条件,通过执行时的动态选择,求解得到最值。这和动态规划的“最优子结构”和“重叠子问题”特点有一定的关系。
贪心算法可以看成是动态规划的一种减少执行过程中选择分支的近似算法。贪心算法在执行中求解最优时,利用贪心策略进行“直观或理论支持”的选择,而不是简单地max(所有选择),这可以减少选择分支的计算和判断,减小复杂度。代价就是有时候贪心算法得到的不是最优解,而是近似优解。