分治、动态规划、贪心算法的比较

本文深入探讨了分治、动态规划和贪心算法的共性和差异。分治策略涉及将问题分解为子问题,然后递归解决并合并结果。动态规划同样依赖于子问题,但通过保存和重用子问题的解来避免重复计算,尤其适用于存在重叠子问题的情况。贪心算法则在每一步选择局部最优解,以期望达到全局最优。三种算法都要求问题具有特定结构,如最优子结构。理解这些算法的适用场景和特性对于优化问题解决至关重要。
摘要由CSDN通过智能技术生成

最近学习了这三种算法的思想,发现这三者之间有相似也有不同,总结一篇博客。

一:三种算法的联系

分治、动态规划、贪心算法都是把一个大的问题给分解成子问题,通过解决子问题来最终解决原问题的。

具体的来说:

  • 分治:主要分为三个步骤递归的解决问题。

    • divide:将问题划分为一些子问题,形式相同,规模更小
    • conquer:递归的求解子问题,当子问题足够小进入基本情况(base case),停止递归,返回到上一层递归。
    • combine:返回递归调用的过程,逐步将子问题的解组合成原问题的解

    分治问题的核心是写出递归式!通过递归式我们可以写出代码并且利用主定理计算时间复杂度。
    T ( n ) = { T ( 1 ) x=0 a T ( n / b ) + f ( n ) x>0 T(n)=\begin{cases} T(1)& \text{x=0}\\ aT(n/b)+f(n)& \text{x>0} \end{cases} T(n)={T(1)aT(n/b)+f(n)x=0x>0
    递归式的含义是将主问题分解成a个子问题,每个子问题的规模是原来的1/b。

    • 主定理:Master Methods

      在这里插入图片描述

      主 定 理 主 要 比 较 的 是 f ( n ) 与 n l o g b a 的 渐 进 大 小 , 即 f ( n ) = n 2 < n 3 主定理主要比较的是f(n)与n^{log_b^a}的渐进大小,即f(n)=n^2<n^3 f(n)nlogbaf(n)=n2<n3

  • 动态规划:与分治相似,都是通过组合子问题来求解原问题。解决的问题需要有最优子结构的性质。核心思想是写出Bellman方程(状态转移方程),利用填表查表解决重叠子问题的情况。具体实现时分为top-down与bottom-top两种方案。

    • 自顶向下:按照自然的递归的思想,解决原问题就先解决子问题,一点点向下到base case
    • 自底向上:分析完原理后纯粹的填表,利用子问题的解计算出更高一级的子问题。
  • 贪心:其核心为选择一个合适的贪心选择性质(贪心规则),通过做出子问题的局部最优选择来构造全局最优解。因为有子问题的局部最优解,所以贪心算法解决的问题也必须有最优子结构性质

二:三种算法的区别

动态规划算法与分治算法最大的区别在于:动态规划算法在递归中会反复求解相同的子问题,而不是一直产生新的子问题——重叠子问题。而分治算法在递归的每一步都在产生全新的子问题。对于重叠子问题,我们采用填表查表的方式来减少重复计算的时间,这就是动态规划的填表查表思想。

贪心算法与动态规划算法求解的问题都需要有最优子结构,而贪心算法的限制更严格,只在某些问题上可以使用贪心策略,得出最优解后更是需要严格的证明(反证,数学归纳)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sunburst7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值