zoukankan      html  css  js  c++  java
  • 1、贪心算法

        贪心算法问题:

            活动安排:

     
                见《算法导论》一书P238.对于活动的安排问题理解:
    .由知Aij表示在活动i的开始后,活动j结束前的活动安排。则由知
    Aij=Aik+ak+Akj.由知
        Aik表示在活动i结束后,活动k开始前的活动数。
        Akj表示在活动k结束后,活动j开始前的活动数。
    因此不包含活动 ak
    • 最早结束活动算法。
    1. /*
    2. 入口参数:
    3. k:第k个活动
    4. len:总的活动
    5. start_time:活动的开始时间
    6. end_time:活动的结束时间
    7. 注释:
    8. 本方法采用贪心算法解决活动安排的问题,有两张表分别表示活动的开始时间和结束时间。
    9. 于是每次都判断活动k是否合适。于是只有当活动m的开始时间大于活动k的结束时间时才
    10. 是合适的。
    11. */
    12. void dynamicPlan(int k,int len,int*start_time,int*end_time){
    13. int m=k+1;
    14. while(m<=len&&start_time[m]<end_time[k]){
    15. m++;
    16. }
    17. if(m<=len){
    18. std::cout<<m<<std::endl;
    19. std::cout<<start_time[m]<<std::endl;
    20. std::cout<<end_time[m]<<std::endl;
    21. std::cout<<std::endl;
    22. dynamicPlan(m,len,start_time,end_time);
    23. }
    24. }
     
    1. int start_time[11]={1,3,0,5,3,5,6,8,8,2,12};
    2. int end_time[11]={4,5,6,7,9,9,10,11,12,14,16};
     
    这是一个简单的数据集。其中Si表示活动的开始时间,fi,表示的是活动的结束时间。但是注意fi是经过排序处理的,否则将出现如下情况。
    如其中有某一活动开始时间为3但是结束时间为11。则明显是不行的。因为在上面的算法中,总是优先执行开始时间较早的那个活动。因此在
    计算前务必对结束时间进行排序。这样。总是那些时间短的优先在前面进行选择。
    • 最晚开始活动的算法
      1. void dynamicPlan_endtime(int k,int len,int*start_time,int*end_time){
      2. int m=k+1;
      3. while(m<=len&&end_time[m]>start_time[k]){
      4. m++;
      5. }
      6. if(m<=len){
      7. std::cout<<m+1<<std::endl;
      8. std::cout<<"start time->"<<start_time[m]<<std::endl;
      9. std::cout<<" end time->"<<end_time[m]<<std::endl;
      10. dynamicPlan_endtime(m,len,start_time,end_time);
      11. }
      12. }
      如上图代码部分,按最晚开始活动的时间算法进行。
      1. int start_time_1[11]={12,8,8,6,5,5,3,3,2,1,0};
      2. int end_time_1[11]={16,14,11,10,7,9,9,5,12,4,6};
      最晚开始活动的一种贪心算法。在上述数组中,己经对活动进行了排序,排序的规则是按活动开始顺序,活动开始晚的排在前面,开始早的排在后面。
      这就后办了,你从后面往前面走。因为是按活动的结束时间进行排序,因此,我们相当于对活动的时间长度进行了考虑,想一下,有个活动它开始得早,但是
      却结束得晚,只要一选中它,则其它的活动就没得选了。因此,在按活动进行排序是必要的。每次取当前活动的开始时间与另上一些活动的结束时间进行比较
      。由于开始时间是进行排过序的。则知开始时间晚的一般来说活动时间不长。然后另外的活动由于是按开始时间从晚到早的排序,则在它向后滑时,它的开始时间晚,结束时间也早。那么它是理想的选择。

    算法对“贪心”的体现

               由知在“最早结束”的算法中,由于我们是首先对活动的结束时间进行了一次排序,由早到晚,因此,我们在后面的选择的时候
    总是优先选择结束时间早的(由于我们是对数组从前往后移),但是同时它的起始时间是大于当前我们活动的结束时间。因此它的活动、
           时间长度相对来说是最短的,也就是局部最优解。
             同理,对“最晚开始”的算法中。我们首先以活动的开始时间按大到小的顺序进行排序。然后从活动后往前开始。优先取活动开始时
           间最晚的。同时我们所选活动的开始时间应该是小于当前活动的结束时间的。则其活动长度相对来说是最优的。因此。贪心地洗择活动
            时间较短的活动。、
     
     
     
     
     





  • 相关阅读:
    班会记录
    CSS之伪元素
    JavaScript之返回顶部
    尝试Hexo
    GitHub之上传文件
    Git之使用
    Git之基本命令
    运行第一个Node.js程序
    go语言圣经 map 章节习题
    go语言圣经第4章JSON部分习题
  • 原文地址:https://www.cnblogs.com/yml435/p/4655582.html
Copyright © 2011-2022 走看看