纸上得来终觉浅,绝知此事要躬行
贪心、回溯、动态规划可划分为一类,而分治单独一类
前三个都是解决问题的模型,可抽象成多阶段决策最优解,而分治问题尽管大部分也是最优解问题,但是大部分不能抽象成多阶段决策模型
回溯算法是万金油,基本上能用动态规划、贪心解决的问题,都可以用回溯算法解决,其实相当于穷举搜索,但是⌚️复杂度比较高,是指数级别的,只能用来解决小规模数据问题。
动态规划相对比较高效,能用动态规划解决的问题需要满足三个特征:最优子结构、无后效性、重复子问题。对于重复子问题,分治要求分割成子问题不能有重复,而动态规划之所以高效就在于回溯算法实现中存在大量重复子问题。
贪心算法实际上是动态规划的特殊情况。她解决的问题起来更加高效,代码实现也更加简洁,但是她需要满足三个条件:最优子结构、无后效性
、贪心选择性(即选择只当前最优解,不记录之前状态)
总结起来:
- 贪心: 一条路走到黑,就一次机会,只能那边看着顺眼走哪边 ;
- 回溯: 一条路走到黑,无数次重来机会,还怕我走不出去;
- 动态规划: 拥有上帝视角,手握无数平时宇宙的历史存档,同时发展出无数个未来;
- 分治:大问题肢解为小问题,然后再把结果合并