贪心算法
特性
做出的是局部最优的,但不一定是整体最优。
往往比动态规划效率高,虽然可能求不到最优解,可能会求得最优解的近似解。
性质
贪心选择性质
整体最优解可通过一系列局部的最优选择来达到
是自顶向下的(与动态规划相反)
最优子结构性质
与动态规划相同
要证明贪心算法的正确性就要证明是否满足这两个性质
例子
-
背包问题
固定的重量条件下,装下的物品尽可能总价值最大。
不是0-1背包,是可以装的数量x(0<=x<=1)。
这样的背包的贪心策略是每次选择单位价值最大的物品装进去。
-
活动安排问题
对于共享一个资源的一系列活动,要在固定时间内,尽量安排多的活动。
把活动按结束时间从早到晚排序,策略是每次选择结束时间最早的且与上一个选中的活动兼容的活动。
-
最优装载
要求:在固定总重量的条件下,不同重量的系列箱子,装尽可能多的箱子。
策略:每次选择最轻的箱子。
-
单源最短路径
要求:求图中对于给定源点v,它到其它点的最短路径
策略:每次选择不在已选择集合并且到源点距离最近的点
-
最小生成树MST
MST性质:图分裂成两个集合,则这两个集合的最小连通的边一定会出现在最小生成树
-
Prim——最近顶点
每次选择在两个集合(已选择集合和未选择集合)之间的最短边
-
Kruskal
每次选择所有边的最短边。
-
多机调度
要求:m个机器尽可能短的时间内完成n个作业
策略:最长作业优先