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

关于分治法&动态规划&贪心法,有一个共同的特性,就是原问题要划分为子问题,通过子问题进行求解。以下对这三者进行比较

分治法

求解过程

原问题分解——>求解子问题——>合并子问题——>得到原问题的解

  • 难点在于如何分解,如何合并
  • 一般采用递归
  • 在分解过程中与动态规划不一样的是,每一个原问题的分解方式是固定的。二动态规划法的分解方式可以又多种
  • 自顶向下划分子问题,向上合并

在这里插入图片描述

代表问题

动态规划法

由子问题的解,在当前问题的约束下作出最优选择。直到求解到原问题的解,问题规模由小到大。

  • 具有最优子结构性质:一个问题的最优解包含其子问题的最优解。

求解过程

分析最优子结构性质——>设计递推函数——>解决子问题——>构造最优解

  • 难点在于如何分析最优子结构性质和递推函数的设计
  • 最优子结构性质:原问题的最优解包含子问题的最优解,子问题的最优解可以推导出原问题的最优解
  • 根据所有的子问题来推导原问题的解
  • 自底向上
  • 注意,最优子结构性质需要反证法证明
    在这里插入图片描述

代表问题

贪心法

根据当前状态一个问题集合,作出局部最优的选择,解决作出选择后产生的子问题。自顶向下。

  • 贪心选择性质:所求问题的整体最优解可以由一系列的局部最优选择达到。
  • 最优子结构性质:一个问题的最优解包含其子问题的最优解。

贪心选择性质是指,所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。在动态规划算法中,每步所做的选择往往依赖于相关子问题的解。因而只有在解出相关子问题后,才能做出选择。而在贪心算法中,仅在当前状态下做出最好选择,即局部最优选择。再去解做出这个选择后产生的相应的子问题。贪心算法所做的贪心选择可以依赖以往所做过的选择,但决不依赖将来所做的选择,也不依赖子问题的解。正是由于这种差别,动态规划算法通常以自底向上的方式解各子问题,贪心算法则通常以自顶向下的方式进行,以迭代的方式做出相继的贪心选择,每做一次贪心选择,就将所求问题简化为规模更小的子问题对于一个具体问题。

求解过程

选择或设计贪心策略——>贪心解子问题——>步步为营得一可行解——>判断并证明最优

  • 需要证明贪心选择性质,最优子结构性质,局部最优到整体最优的证明
  • 不需要推导全部子问题,只需要分解得到一部分子问题
  • 自顶向下
  • 要确定一个问题是否具有贪心选择性质,必须证明每步所做的贪心选择最终导致问题的整体最优解,通常可以用类似于证明活动安排问题的贪心选择性质时所采用的方法来证明。首先考察问题的一个整体最优解,并证明可修改这个最优解,使其以贪心选择开始。做了贪心选择后,原问题简化为规模更小的类似子问题。然后用数学归纳法证明,通过每一步做贪心选择,最终可得到问题的整体最优解。其中,证明贪心选择后的问题简化为规模更小的类似子问题的关键在于,利用该问题的最优子结构性质
    在这里插入图片描述

代表问题

  • 活动安排问题

动态规划法和分支法的异同

  • 动态规划算法与分治法类似,其基本思想是将待求解问题分解成若干子问题,先求解子问题,再结合这些子问题的解得到原问题的解。

  • 与分治法不同的是,适合用动态规划法求解的问题经分解得到的子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,以致最后解决原问题需要耗费指数级时间。然而,不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次。如果能够保存已解决的子问题的答案,在需要时再找出已求得的答案,这样可以避免大量的重复计算,从而得到多项式时间算法。为了达到此目的,可以用一个表来记录所有己解决的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思想。具体的动态规划算法多种多样,但它们具有相同的填表格式动态规划算法适用于解最优化问题,通常可按以下4个步骤设计:
    ①找出最优解的性质,并刻画其结构特征:
    ②递归地定义最优值:
    ③以自底向上的方式计算最优值:
    ④根据计算最优值时得到的信息,构造最优解。

  • 步骤①~③是动态规划算法的基本步骤。在只需要求出最优值的情形下,步骤④可以省略若需要求出问题的最优解,则必须执行步骤④。此时,在步骤③中计算最优值时,通常需记录更多的信息,以便在步骤④中,根据所记录的信息,快速构造出一个最优解。
    下面以具体的例子来说明如何运用动态规划算法的设计思想,并分析可用动态规划算法求解的问题所应具备的一般特征。

贪心算法与动态规划算法的差异

贪心算法和动态规划算法都要求问题具有最优子结构性质,这是两类算法的一个共同点。但是,对于具有最优子结构的问题应该选用贪心算法还是动态规划算法来求解?是否能用动态规划算法求解的问题也能用贪心算法来求解?

  • 在动态规划算法中,每步所做的选择往往依赖于相关子问题的解。因而只有在解出相关子问题后,才能做出选择。
  • 在贪心算法中,仅在当前状态下做出最好选择,即局部最优选择。再去解做出这个选择后产生的相应的子问题。贪心算法所做的贪心选择可以依赖以往所做过的选择,但决不依赖将来所做的选择,也不依赖子问题的解。
原创文章 236 获赞 430 访问量 7万+

猜你喜欢

转载自blog.csdn.net/weixin_44307065/article/details/106028741