对比
- 贪心(greedy):局部最优(local best),不保证全局最优
- 穷举(exhaustive search)搜索:代价昂贵(prohibitive cost)
动态规划:是二者的综合平衡。因此,这是下一代的杰作。是贪心与穷举所生。
核心思想:可以编写定制的算法,系统的搜索全部的可能解(保证正确性:correctness),并且通过存储结果以避免重复计算(保证效率:efficiency)。
即,设计动态规划的算法,要考虑到这两个方面是否实施,也是验证算法是否完备的依据。
一旦真的理解了动态规划算法,那么它将称为你设计算法的绝招, 将是解决问题的最简洁方案,代码也非常优雅。体现了大道至简的哲学道理。
此外,理解了动态规划以后,很容易自己创造,而不用查书看标准写法,比如AVL树这种结构,不查书,找参考,手写出来很难,很难。
但是,不理解动态规划的思想,这类算法将像魔法一样,令人难以捉摸。
这提高了学习的门槛,一旦进入大门,将跨入新的层次。
缓存 v.s. 重新计算
http://blog.csdn.net/u011240016/article/details/52472315
这篇博客深入总结了基于Cache策略的斐波那契数列的计算方法,以及时间,空间优化的过程。
缓存的策略可以在任何递归算法中实现,但是以下几个常用算法不必实现:快速排序,回溯法,深度优先搜索。
不能用的原因是,我们存的数据被后面的过程查看取用才有价值,不被利用则没有价值。这些算法的参数都是不同的,因此,缓存没有必要,纯属浪费空间。
此外,要平衡缓存的代价与收益。在斐波那契的例子汇总,缓存的空间代价值O(n),解决的是指数问题,因此很值得。
—笔记总结自《算法设计手册》