动态规划,贪心,分治算法的区别

以下摘自《算法笔记》
在区别它们之前我们先明确两个概念:
1.什么是重叠子问题?
如果一个问题可以被分解为若干子问题,并且这些子问题会重复出现,那么就称这个问题为重叠子问题。
2.什么是最优子结构?
如果一个问题的最优解可以由其他子问题的最优解有效的构造出来,那么这个问题拥有最优子问题。

动态规划与分治的区别:
分治和动态规划都是将问题分解为子问题,然后合并子问题的解得到原问题的解。但是不同的是,分治法分解出的子问题是不重叠的,因此分治法解决的问题不拥有重叠子问题,而动态规划解决的问题具有拥有重叠子问题。

贪心与动态规划:
贪心和动态规划都要求原问题必须拥有最优子结构。二者的区别在于 ,贪心法采用的计算方式类似于“自顶向下”,但是并不等待子问题求解完毕后再选择使用哪一个,而是通过一种策略直接选择一个子问题去求解,没被选择的子问题就不去求解了,直接抛弃。也就是说它只在上一步选择的基础上继续选择,因此整个过程以一种单链的流水方式进行,显然这种所谓“最优选择”的正确性需要用归纳法证明。而动态规划不管是采用自底向上还是自顶向下的计算方式,都是从边界开始向上得到目标问题的解。也就是说,它总是考虑所有的子问题,并选择继承能得到最优结果的那个,对暂时没有继承的子问题,由于重叠子问题的存在,后期可能再次考虑它们,一次还有机会成为全局最优的一部分,不需要放弃。
由此可以看出贪心是一种壮士断腕的决策,只要进行了选择就不后悔;动态规划则是要看哪个选择笑到了最后,暂时的领先说明不了什么。

发布了21 篇原创文章 · 获赞 1 · 访问量 311

猜你喜欢

转载自blog.csdn.net/qq_44722533/article/details/100173931