贪心算法☞活动安排

来源:互联网 发布:sql 注入式攻击 编辑:程序博客网 时间:2024/05/17 23:00


------------------------------------------------------------Sun---------------------------------------------------------------------------


书:计算机算法设计与分析


     1.原理:在对问题求解时,总是做出在当前看来是最好的选择也就是仅是在当前状态下选出最优解。

                动态规划中,每一步所做的选择都依赖于相关子问题的解,只有解出相关子问题的解才能做出选择。

      2.特点:贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题。

                 动态规划常采用自底向上解决子问题。


    对于一个具体的问题,要确定是否具有贪心选择性质,必须证明每一步所做的选择都会导致问题的整体最优解。首先,考察问题的一个整体最优解,并证明可修改这个最优解,使其以贪心选择开始。做了贪心选择之后,原问题简化为规模更小的子问题,然后归纳法证明,通过每一步做的贪心选择最终可得到问题的最优解。其中,简化成子问题的关键在于最优子结构性质。




     3.最优子结构性质:一个问题的最优解包含子问题的最优解

              当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。

     4.贪心算法与动态规划算法差异:

            动态规划和贪心算法都要求问题具有最优子结构性质,通过局部最优解来推导全局最优解。

            区别:

               贪心算法中作出的每步贪心决策都无法改变,因为是由上一步的最优解推导下一步的最优解,上一步之前的最优解则不作保留,贪心算法每一步的最优解一定包含上一步的最优解。

               动态规划算法中全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有最优解。

   

     例:活动安排问题

     该问题要求高效地安排一系列争用某一公共资源的活动。贪心算法提供了一个简单、漂亮的方法使得尽可能多的活动能兼容地使用公共资源。

     问题描述:

     设有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相容。活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合。 

    求解思路:

     将活动按照结束时间进行从小到大排序。然后用i代表第i个活动,s[i]代表第i个活动开始时间,f[i]代表第i个活动的结束时间。按照从小到大排序,挑选出结束时间尽量早的活动,并且满足后一个活动的起始时间晚于前一个活动的结束时间,全部找出这些活动就是最大的相容活动子集合。事实上系统一次检查活动i是否与当前已选择的所有活动相容。若相容活动i加入已选择活动的集合中,否则,不选择活动i,而继续下一活动与集合A中活动的相容性。若活动i与之相容,则i成为最近加入集合A的活动,并取代活动j的位置。


  !!!活动的结束时间由小到大排列,此时T(n)=O(n);否则需要排序,此时T(n)=O(nlgn);


代码:

template<class Type>
void GreedySelector(int n, Type s[], Type f[], bool A[])
{
    A[1]=true;
    int j = 1;                       //记录最近一次加入A中的活动

    for (int i=2;i<=n;i++)    //依次检查活动i是否与当前已选择的活动相容
    {
        if (s[i]>=f[j])              //相容则把活动加入已选择的集合A中
        {
            A[i]=true;
            j=i;                       //当前活动i取代最近加入A中的活动j
        }
        else
        {
            A[i]=false;
        }
    }
}



0 0