两个概念:
重叠子问题:如果一个问题可以被分为若干个子问题,且这些子问题会重复出现,那么就称这个问题拥有重叠子问题
最优子结构:如果一个问题的最优解可以由其子问题的最优解有效地构造出来,那么称这个问题拥有最优子结构
三者各自特点:
分治:(分而治之),将原问题划分成若干个规模较小而结构与原问题相同或相似的子问题,然后分别解决这些子问题,最后合并子问题的解,即可得到原问题的解。分治必须拥有子问题,但一定是不重叠的子问题,且该问题不一定是最优化问题
贪心:解决最优化问题,并希望由局部最优策略来推得全局最优结果。贪心算法适用的问题必须满足最优子结构
动态规划:一个问题必须拥有重叠子问题和最优子结构,才能使用动态规划去解决
两两区别
分治与动规:分治和动态规划都是将问题分解为子问题,然后合并子问题的解得到原问题的解。但是不同的是,分治法分解出的子问题是不重叠的,因此分治法解决的问题不拥有(或者并不用在意)重叠子问题,而动态规划解决的问题拥有重叠子问题(例如归并排序和快速排序都是分别处理左序列和右序列,然后将左序列和右序列合并,过程中都不出现子问题,是分治)。此外,分治法解决的问题不一定是最优化问题,而动规解决的问题一定是最优化问题。
贪心与动规:贪心和动规都要求原问题必须拥有最优子结构。二者区别在于贪心采用的方式类似于“自顶向下”(每次最优-》全局最优),但是并不是等待子问题求解完毕后再选择使用哪一个。而是通过一种策略直接选择一个子问题去求解,没有被选择的子问题就不去求解,直接抛弃。也就是说,他总是只在上一步选择的基础上继续选择,因此整个过程以一种单链的流水方式进行,显然这种所谓的“最优选择”的正确性要用归纳法证明。| 而动规不管是采用自底向上还是自顶向下的方式,都是从边界开始向上得到目标问题的解。也就是说,它总是会考虑所有的子问题,并选择继承能得到最优结果的那个,对暂时没被继承的子问题,由于重叠子问题的存在,后期可能会再次考虑它们,因此还有机会成为全局最优的一部分,不需要放弃。 所以贪心是一种壮士断腕的决策,只要进行了选择,就不后悔;动规则要看哪个选择笑到了最后,暂时的领先说明不了什么。