算法——贪心算法

来源:互联网 发布:91kge网络在线ktv 编辑:程序博客网 时间:2024/06/08 22:51

定义:

    在每一步都做出当时看起来的最佳选择,也就是说,它总是做出局部最优选择,不从整体上考虑最优选择。

基本思想:

    将问题的求解过程看作是一系列选择,每次选择一个输入,每次选择都是当前状态下的最好选择(局部最优解)。每作一次选择后,所求问题会简化为一个规模更小的子问题。从而通过每一步的最优解逐步达到整体的最优解。

适用问题:

    贪心选择:整体的最优解可通过一系列局部最优解达到。每次的选择可以依赖以前作出的选择,但不能依赖于后面的选择。

    最优化子结构:问题的整体最优解中包含着它的子问题的最优解。

活动选择问题:

   设有n个活动的集合,其中每个活动都要求使用同一资源,如教室等,而在同一时间内只有一个活动能使用这一资源。每个活i都有一个要求使用该资源的起始时间和一个结束时间。如果选择了活动i,则它在半开时间区间内占用资源。若区间与区间不相交,则称活动i与活动j是相容的。也就是说,当时,活动i与活动j相容。

    由于输入的活动以其完成时间的非减序排列,所以迭代贪心算法GREEDY_ACTIVITY_SELECTOR每次总是选择具有最早完成时间的相容活动加入集合A中。直观上,按这种方法选择相容活动为未安排活动留下尽可能多的时间。也就是说,该算法的贪心选择的意义是使剩余的可安排时间段极大化,以便安排尽可能多的相容活动。

   算法GREEDY_ACTIVITY_SELECTOR的效率极高。当输入的活动已按结束时间的非减序排列,算法只需O(n)的时间安排n个活动,使最多的活动能相容地使用公共资源。如果所给出的活动未按非减序排列,可以用O(nlogn)的时间重排。

GREEDY_ACTIVITY_SELECTOR(s,f)1n = s.length2A = {a1}3k = 14for m=2 to n5if s[m]>=f[k]6A=A U {am}7k=m6return A

下面给出活动选择问题的例子:

贪心算法的执行过程:

贪心选择:选择活动集合S中最早结束的活动,因为它剩下的资源可供它之后尽量多的活动使用。


0 0