1.背包问题:
①最优装载问题:把物体重量从小到大排列,依次选择每一个物体,仅仅顾眼前,却能得到最优解。
②部分背包问题:把物体的“价值除以重量的值”从小到大排序,一次选择每一个物体(贪心仅仅能对一个变量贪心。这是一种巧妙的转换)。
③乘船问题:仅仅让眼前的浪费最少。
(注意是让什么最少。是让浪费最少!
)
2.区间相关问题(排序:排左边还是右边?):
①选择不相交区间:
②区间选点问题:
③区间覆盖问题:
3.定义:
在对问题求解时,总是做出在当前看来是最好的选择。
也就是说。不从总体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。
其核心是依据题意选取一种量度标准。然后将这多个输入排成这样的量度标准所要求的顺序,按这样的顺序一次输入一个量。
假设这个输入和当前已构成在这样的量度意义下的部分最佳解加在一起不能产生一个可行解,则不把此输入加到这部分解中。一般和排序结合使用。排序排的关键变量的选取是重中之重。
初看起来,这些量度标准似乎都是可取的。但实际上,用当中的大多数量度标准作贪婪处理所得到该量度意义下的最优解并非问题的最优解,而是次优解。因此,选择能产生问题最优解的最优量度标准是使用贪婪算法的核心。
⑵有一个函数来检查一个候选对象的集合是否提供了问题的解答。
该函数不考虑此时的解决方法是否最优。
⑶另一个函数检查是否一个候选对象的集合是可行的。也即是否可能往该集合上加入很多其它的候选对象以获得一个解。
和上一个函数一样,此时不考虑解决方法的最优性。
⑷选择函数能够指出哪一个剩余的候选对象最有希望构成问题的解。
⑸最后。目标函数给出解的值。
⑹为了解决这个问题。须要寻找一个构成解的候选对象集合,它能够优化目标函数。贪婪算法一步一步的进行。起初。算法选出的候选对象的集合为空。接下来的每一步中。依据选择函数,算法从剩余候选对象中选出最有希望构成解的对象。假设集合中加上该对象后不可行,那么该对象就被丢弃并不再考虑。否则就加到集合里。
每一次都扩充集合,并检查该集合是否构成解。假设贪婪算法正确工作,那么找到的第一个解一般是最优的。
所谓贪心选择性质是指所求问题的总体最优解能够通过一系列局部最优的选择。换句话说。当考虑做何种选择的时候,我们仅仅考虑对当前问题最佳的选择而不考虑子问题的结果。这是贪心算法可行的第一个基本要素。对于一个详细问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择终于导致问题的总体最优解。
当一个问题的最优解包括其子问题的最优解时,称此问题具有最优子结构性质。
问题的最优子结构性质是该问题可用贪心算法求解的关键特征。
每次取权值最小的两颗子树合并成一颗新树,并又一次放到集合中。
新树的权值等于两棵子树权值之和。