- 基本概念
所谓贪心算法,是在对问题求解时,总是做出在当前看来最好的选择。即,不从整体最优上加以考虑,它所做出的仅仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,就是某个状态以前的过程不会影响以后的状态,只与当前的状态有关。
- 理解
贪心策略在解决问题时目光短浅,仅仅依据当前已有的信息就做出选择,并且无论将来的结果如何,都不会做出改变。一句话就是:不求最优,仅仅是每一步的最优解。
- 判断
判断一个问题能否用贪心算法解主要依据:贪心选择性质和最优子结构性质。
- 贪心选择性质:所求问题的整体最优解可以通过一系列局部最优的选择来获得,即通过一系列的逐步局部最优选择来使得最终的选择方案是全局最优的。要确定是否具有贪心选择性质,必须证明每做一步贪心选择是否最终导致问题的整体最优解。(这是和动态规划法的最主要的差别)
- 最优子结构性质:一个问题的整体最优解,包含的子问题的解也是最优的。
- 区分动态规划
动态规划算法通常以自底向上的方式解各子问题,是递归过程。
贪心算法则通常以自顶向下的方式,以迭代的方式做出相继的贪心选择,每做一次贪心选择就将所求问题简化为规模更小的子问题。
PS:递归和迭代:递归就是自己调用自己的过程,迭代就是利用变量的原值推出变量的新值的过程。如果递归是自己调用自己的话,那么迭代就是A不停的调用B。
以二叉树遍历为例:
贪心法是从上到下仅仅进行深度搜索。也就是说它从根节点一口气走到黑,代价取决于子问题的数目,也就是树的高度,每次在当前问题的状态上做出的选择都是1,不进行广度搜索。所以最终得出的解不一定是最优解,有可能是近似最优解。
动态规划算法是在最优子结构的前提下,从树的叶子节点开始向上进行搜索,而且每一步都依据叶子节点当前子问题的状况做出选择,从而做出最优决策。所以他的代价是子问题的个数和可选择的数目。它求出的解一定是最优解。