1、贪心算法、分治法、动态规划之间的区别与联系
分治法:将原问题划分成 n 个规模较小的,并且结构与原问题相似的子问题;递归地解决子问题;然后合并其结果。比如快速排序、归并排序等。分治法能解决的问题,一般具有以下特征:
(1)问题的规模缩小到一定程度就可以解决;
(2)该问题可以分解为若干规模较小的相同问题;
(3)子问题的解可以合并为该问题的解;
(4)子问题是相互独立的。
第(1)个特征绝大多数问题都能满足;第(2)条特征是应用分治法的前提,也是大多数问题满足的;如果不满足第(3)条特征,即问题容易分解,但是很难合并成全局解,那么,就应该考虑贪心算法和动态规划;第(4)条满足与否关系到分治法的效率。如果多个子问题存在公共的子问题,那么分治法也可以用,但是效率低下。此时最好采用动态规划。
动态规划:常用于最优化问题。此类问题中,可能存在多个可行解,每个解对应一个值,而我们希望找到一个最优(最大最小最长等)值得解,则称这样的解为该问题的一个(记住,是一个!因为可能存在多个)最优解。比如说求字符串ABCBDAB 和 BDCABA 的最长公共子序列的长度,这个长度为4,是唯一确定的,但是,BCBA 和 BDAB 都是,所以是不唯一的。
动态规划解决的问题,分解成的子问题往往不是独立的。我们可以利用一个表格来记录所有的已解的子问题的答案。不管这个子问题以后会不会被用到。主要它被计算过,那么,就将它填入表格中,这就是动态规划的基本思路。具体的动态规划算法有很多,但是他们都具有相同的填表格式。
贪心算法:是使所做的选择在当时看起来是最佳的,期望通过所做的局部最优选择来产生一个全局最优解。当然,这种启发式策略并不能总是得到最优解。
贪心算法与动态规划的区别:贪心选择性质(全局最优解可以通过局部最优贪心选择来获得)是不同于动态规划之处。在动态规划中,每一步都要做出选择,但是这些选择依赖于子问题的解。所以,这么一级一级往下推演,最小的子问题是最该被解决的。所以。动态规划问题一般是自底向上,从小到大。而贪心算法所做的当前选择,可能依赖于已经做出的选择,但是不依赖所做出的选择或者子问题的解。因此,贪心策略通常是自顶往下,一个一个做出贪心选择,不断将给定问题实例规约为更小的