贪心算法
概念:简单来说,贪心算法就是贪心,在求解的时候步步贪心,步步求得最优解,直至结束时求得想要的最优解。因此贪心算法起初考虑的并非整体,而是局部的最优解。如果一个问题可以同时用几种方法解决,贪心算法应该是最好的选择之一。
因为我们使用贪心算法,每次都得到其子问题的最优解,所以这里引入最优子结构的概念:
当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用贪心算法或动态规划算法求解的关键特征。
利用贪心策略解题,需要解决两个问题:
(1)该题是否适合于用贪心策略求解;
(2)如何选择贪心标准,以得到问题的最优/较优解。
贪心算法的基本流程(模型):
//A是问题的输入集合即候选集合
Greedy(A)
{
S={ }; //初始解集合为空集
while (not solution(S)) //集合S没有构成问题的一个解
{
x = select(A); //在候选集合A中做贪心选择
if feasible(S, x) //判断集合S中加入x后的解是否可行
S = S+{x};
A = A-{x};
}
return S;
}
(1)候选集合A:问题的最终解均取自于候选集合A。
(2)解集合S:解集合S不断扩展,直到构成满足问题的完整解。
(3)解决函数solution:检查解集合S是否构成问题的完整解。
(4)选择函数select:贪心策略,这是贪心算法的关键。它指出哪个候选对象最有希望构成问题的解,选择函数通常和目标函数有关。
(5)可行函数feasible:解集合扩展后是否满足约束条件。
贪心算法问题应用:
背包问题,最优装载问题
删数问题
多处最优服务次序问题
Moving tables
均分纸牌
整数区间
看守仓库
Gone fishing(普通贪心实现)(贪心与优先队列)
对于例题,将会在下次博客中进行部分介绍。