之前发过的几个经典算法 :Dijkstra Prim Kruskal 都属于贪心算法。
贪心算法的思想是: 在每一个阶段,可以认为所做的决定是最好的,而不考虑将来的后果,总是做出在当前看来是最好的选择。
这也就是说贪心算法并不从整体最优上加以考虑,它所做出的选择 只是在某种意义上的局部最优选择。
例如 贪心只可以解决背包问题,而不可以解决 0-1背包问题。
我们可以把贪心总结成一句话“眼下能够拿到的就拿”。
下面介绍一些经典的贪心算法(在这里我们只注重算法,对于类只做简单的封装,也不会用到泛型)
|
|
贪心算法的基本要素:
- 贪心选择性质
是指所求的问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到,这是贪心可行的第一要素,也是其与动规算法的主要区别,在动规中 每步所做的选择往往依赖于相关子问题的解,只有在解出相关子问题后才能做出选择,而贪心则是仅在当前状态下做出的最好选择,即局部最优解。
一个问题是否具有贪心选择性质必须要证明每一步所做的贪心选择最终导致问题的整体最优解,做了贪心选择后,原问题简化为规模更小的类似子问题 - 最优子结构性质
当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。,证明贪心选择后的问题简化为规模更小的类似子问题的关键在于利用该问题的最优子结构性质。
拿活动安排来说,按照结束时间排序,则f[1]为最早结束的,我们选择活动1,那在这之后呢,我们应该是在除去活动1之外的活动里选择结束时间最早的(即在子问题中寻找最优解)。
对于整个问题的最优解包含子问题的最优解,就说明它具有最优子结构性质。
|
|
最优装载问题和 背包问题基本一样,不赘述。
|
|
|
|
|
|
再加上之前的Dijkstra Prim Kruskal ,和多会场安排问题,都属于贪心的经典题目,贪心专题完.