一、面向的问题
问题
在问题的解空间中,搜索满足约束方程并使用目标函数达极值的解向量(集合中寻找最优子集)。
这类问题具有以下特点:
- 由初始输入构成的解空间;
- 约束方程,确定可行解;
- 目标函数(优化目标),确定最优解;
算法设计
适用贪心算法的问题有两个主要性质
- 贪心选择性:全局最优解,可以由一系列局部最优选择来达到;每次选择得到一个局部最优解,并把问题转化为一个规模更小的类似子问题。
- 最优子结构:指一个问题的最优解中包含其子问题的最优解。
使用贪心算法第一步,是证明问题具有“最优子结构性质”,从而贪心算法收敛;
二、问题的解决
算法伪代码
greedy(A, n) { solution = Q; for (i=1;i<n;i++){ x = select(A); if (feasible(solution, x)) solution = union(solution, x); } return solution; }
包含了三种行为:
- select
- feasible
- union
三、典型例子
背包问题等
Dijkstra最短路径