LintCode 关于贪心算法的总结

来源:互联网 发布:php笔试题 编辑:程序博客网 时间:2024/06/05 17:35

1.在求最优解问题的过程中,依据某种贪心标准,从问题的初始状态出发,直接去求每一步的最优解,通过若干次的贪心选择,最终得出整个问题的最优解,这种求解方法就是贪心算法。
2.从贪心算法的定义可以看出,贪心算法不是从整体上考虑问题,它所做出的选择只是在某种意义上的局部最优解,而由问题自身的特性决定了该题运用贪心算法可以得到最优解。
3.如果一个问题可以同时用几种方法解决,贪心算法应该是最好的选择之一。

4.贪心算法是一种在每一步选择中都采取在当前状态下最好或最优的选择,希望得到结果是最好或最优的算法。
5.贪心算法是一种能够得到某种度量意义下的最优解的分级处理方法,通过一系列的选择得到一个问题的解,而它所做的每一次选择都是当前状态下某种意义的最好选择。即希望通过问题的局部最优解求出整个问题的最优解。

6.这种策略是一种很简洁的方法,对许多问题它能产生整体最优解,但不能保证总是有效,因为它不是对所有问题都能得到整体最优解。
7.利用贪心策略解题,需要解决两个问题:
(1)该题是否适合于用贪心策略求解;
(2)如何选择贪心标准,以得到问题的最优/较优解。

8.贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。
这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。
(1)在动态规划算法中,每步所做的选择往往依赖于相关子问题的解,因而只有在解出相关子问题后,才能做出选择。
(2)在贪心算法中,仅在当前状态下做出最好选择,即局部最优选择,然后再去解出这个选择后产生的相应的子问题。
9.当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。
10.运用贪心策略在每一次转化时都取得了最优解。问题的最优子结构性质是该问题可用贪心算法或动态规划算法求解的关键特征。
11.贪心算法的每一次操作都对结果产生直接影响,而动态规划则不是。
12.贪心算法对每个子问题的解决方案都做出选择,不能回退;动态规划则会根据以前的选择结果对当前进行选择,有回退功能。
13.动态规划主要运用于二维或三维问题,而贪心一般是一维问题。

14.使用贪心算法求解问题应该考虑如下几个方面:
(1)候选集合A:为了构造问题的解决方案,有一个候选集合A作为问题的可能解,即问题的最终解均取自于候选集合A。
(2)解集合S:随着贪心选择的进行,解集合S不断扩展,直到构成满足问题的完整解。
(3)解决函数solution:检查解集合S是否构成问题的完整解。
(4)选择函数select:即贪心策略,这是贪心法的关键,它指出哪个候选对象最有希望构成问题的解,选择函数通常和目标函数有关。
(5)可行函数feasible:检查解集合中加入一个候选对象是否可行,即解集合扩展后是否满足约束条件。

贪心算法的一般流程

//A是问题的输入集合即候选集合
Greedy(A)
{
  S={ };           //初始解集合为空集
  while (not solution(S))  //集合S没有构成问题的一个解
  {
    x = select(A);     //在候选集合A中做贪心选择
    if feasible(S, x)    //判断集合S中加入x后的解是否可行
      S = S+{x};
      A = A-{x};
  }
  return S;

15.原则上来说对于有多种变量的问题来说动态规划能够做出最正,确的解答,但贪心算法对于某些适用于上述规则的问题可以大幅缩短运算。

16.贪心算法是在最短的时间内找出当前一步的最优解,但最终组合到一起时却不一定是最优的。

下面举一个例子

给定一些数组,要求取出的数组相互之间无交且包含的区间范围最大。根据贪心算法,首先按照每个数组的尾部从小到大排序,随后判断下一个数组的头部是否大于当前数组的尾部,若不是的话则这两个数组为符合要求的数组。在数组繁多的情况下这种算法无疑大幅度减少了运算时间,但是一定正确吗?

【200,300】,【1,301】,【400,500】,我们一眼就可以看出,选择后面两个数组包含的区间范围最大,然而根据贪心算法第一个数组可以取到而第二个数组和第一个数组有交因而呗舍弃。当然,这个例子选取的数组较少,若是有很多个数组哪怕最开始选到的数组不是最优的,后面的其他数组反而会因此被选中加入区间中最后得到最大的区间。由此看来,贪心算法依然是解决问题的最快方法,但舍弃了严谨性一味追求greedy(贪婪)却势必在一些时候得到的不是最优的,在时间有限的范围内,贪心算法能找到相对来说最优的结果对我们来说已经足够了。

17.贪心算法不只是一种算法,更是一种思想,让我们看到问题抽丝剥茧看到最里面的一部分,有些像数学函数一样把多个变量都由一个变量的不同函数分别表示,最终只剩下一个变量,贪心算法也是如此。当找到问题的本质时,就能以最短的时间得到最优的结果。


原创粉丝点击