算法设计与分析【7】几个重要问题

1、分治法 vs 动态规划

  • 相同点

    这个两个方法都是讲原问题分解为若干个子问题递归或者迭代的求解子问题,通过子问题的解综合得到原问题的解。这两个算法的复杂度往往会受到子问题的影响。

  • 不同点

  1. 子问题不同:分治法的子问题要求是相互独立且与原问题相同,而动态规划的子问题可以是相互重叠的。特别的,在计算子问题时,动态规划法会采用备忘录的方法记录子问题的解,以避免大量重复计算。
  2. 求解方向不同:分治法是自顶向下;动态规划即可自底向上也可自顶向下。
  3. 复杂度:分治法的复杂度是指数级别,因为分治法往往进行了更多重复的运算,导致复杂度很高;而动态规划的独立的子问题复杂度是多项式级别,不独立的子问题多。
  4. 最优性:分治法未必会考虑最优性;动态规划求解的子问题的解都是局部最优。

2、“揹包”问题:动态规划 vs 贪心法

  • 对于0-1揹包问题,应该选择动态规划算法。贪心算法无法得到0-1揹包的最优解,原因是贪心法无法保证将揹包装满,且剩下闲置的揹包空间使得揹包单位重量价值降低了。在考虑0-1揹包问题时,应该比较物品是否选择所导致的最终方案,依此做出最佳选择,这样就会存在一些互相重叠的子问题,这正是动态规划算法求解的一重要特征。
  • 对于揹包问题,应该选择贪心法。因为揹包问题可以只选择物品的一部分,因此可以选择 单位重量价值最高的物品优先装入以保证得到最佳结果。
  • 这两个问题都具有最优子结构性质,但是0-1揹包问题只能用动态规划算法,而揹包问题只能用贪心法。

3、回溯法 vs 分支限界法

1、求解目标:回溯法可以找出满足约束条件下的所有解;分支限界法是找出满足约束条件下的一个解或者是在满足约束条件的解下的某种意义下的最优解
2、 搜索方式不同:回溯法以深度优先方式搜索解空间树;分支限界法以广度优先或者最小消耗优先的方式搜索解空间树。
3、 存储空间要求不同:回溯法所需的额外辅助空间较分支限界法少。
4、解决问题不同:回溯法适合组合解空间问题;分支限界法适合组合优化问题。

4、动态规划 vs 贪心法

  • 相同点
    都具有最优子结构性质
  • 不同点
    1、动态规划一般得到的解为全局最优解,而贪心法一般是局部最优解。
    3、动态规划算法一般是自底向上的方式解子问题,而贪心法一般是自顶向下的方式解各子问题,以迭代的方式做出贪心选择,每一次贪心选择都会将问题简化为更小的子问题。

参考材料

mooc算法分析与设计
课程ppt

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章