Ⅰ原理
目的:
寻找最优解。从当前状态出发,根据局部状态(而非全局的最优决策)进行“选择”,在满足约束条件的前提下,使目标函数的增速达到极值,选择一个能够最快达到要求的输入元素。根据一系列选择得到的解,每一次选择都是那时状态的最佳解。事实上,最后得到的将不是全局的最优解。
两个性质
贪婪选择:
每次选择将会简化为子问题,而且问题最终的方案仅依赖于每次选择而不是将来的选择。
最优子结构:
当一个问题的最优解包含其子问题的最优解时,称其具有最优子结构。
Ⅱ应用思路
1.建立数学描述,用方程写出约束条件。解将是一个集合。
2.将待求解的问题划分为若干子问题,理清彼此间的嵌套关系。
3.选择一个贪婪选择策略。只有当局部的最优策略能够产生全局最优解时才可使用贪婪算法。(可先选择几个实际情况分析是否适用贪婪算法。一定注意判断问题是否适用贪婪算法,找到的解是否是最优解。)
4.对每一个子问题求解,并将全部的解写作原来问题的一个解。
5.对所得的解进行算法分析。包括算法复杂度分析,证明是贪婪选择(假设一个最优解,并证明可修改这个解使其以贪婪算法开始)。证明最优子结构(第一次选择后转化为怎样的子问题,子问题的最优解是否包含在问题的解中)。
Ⅲ实现框架
greedy (A,n)
{
solution = ¦µ;
for (int i = 1;i <= n;i++)
{
x = select(A);
if (feasible (solution,x))
solution = union (solution,x);
}
return solution;
}
Ⅳ例子
背包(可分与不可分),货郎担,最优装载,活动安排,多机调度。
数据结构中:单源点最短路径,最小生成树(prim,kruskal),Huffman编码。