提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
算法是对解决一个问题的步骤的描述,对大量的数据处理或者复杂操作都是不可少的。本人目前也是第一次系统的学习算法,在这里谈一下对贪心算法的理解。
一、贪心算法是什么?
贪心算法通过一系列选择来得到问题的解,每一步所做的选择都是当前状态下的局部最优选择,并不是从整体上加以考虑。用贪心算法求解的问题一般具有两个性质:最优子结构性质和贪心选择性质。
最优子结构性质:问题的最优解包含子问题的最优解。
贪心选择性质:问题的每一步做的选择都是当前状态下的局部最优选择,而不是在整体上考虑的。
与动态规划算法不同,动态规划算法是以自底向上(从最小的子问题向原始问题)的方式依赖子问题的解,逐步构造处原始问题的最优解。贪心算法是以自顶向下(从原始问题向逐步产生的子问题)的方式,每一步只做出当前状态的局部最优选择,然后再解做出这个选择后产生的子问题。贪心算法所做的贪心选择可以依赖于以往所做的选择,但是绝不依赖将来所做的选择,也不依赖子问题的解。
二、贪心算法解具体问题
活动安排问题
设n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有要求使用该资源的起始时间si和结束时间fi,且si<fi。若选择了活动i,则它在半开时间区间[si,fi)内占用资源。若区间[si,fi)与区间[sj,fj)不相交,则称活动i与活动j是相容的。即,当si>=fj或sj>=fi时,活动i与活动j相容。活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合。
先对所有活动按结束时间递增排序。
GreedySelect(s[],A[])
{
A[1] = 1; //把第一个问题放入安排中
n = length(s);
j = 1; //标志当前安排中最后一个活动的标号
for(i=2;i<=n;i++)
{
if(si>=fj) //当前要考虑的活动的开始时间大于等于已选活动的最后一个活动的结束时间
{
A[i] = 1;
j = i; //更新为安排中的最后一个活动的标号
}
else
A[i] = 0;
}
return A;
}
总结
提示:这里对文章进行总结:
贪心算法是自顶向下的方式求解问题的,每一步做出当前状态下的最优选择,做出选择后会产生子问题。贪心算法所做的选择可以依赖于以往所做的选择,但是绝不局部依赖于当前的选择和子问题的解(就是不依赖于接下来产生的子问题的解)。