Expm 7_2区间调度问题

Posted 薰衣草

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Expm 7_2区间调度问题相关的知识,希望对你有一定的参考价值。

 

【问题描述】

给定n个活动,其中的每个活动ai包含一个起始时间si与结束时间fi。设计与实现算法从n个活动中找出一个最大的相互兼容的活动子集S。

要求:分别设计动态规划与贪心算法求解该问题。其中,对贪心算法分别给出递归与迭代两个版本的实现。

 

技术分享图片
 1 package org.xiu68.exp.exp7;
 2 
 3 public class Task{
 4     public int startTime;    //开始时间
 5     public int endTime;        //结束时间
 6     
 7     public Task(int startTime,int endTime){
 8         this.startTime=startTime;
 9         this.endTime=endTime;
10     }
11 }
View Code

 

技术分享图片
 1 package org.xiu68.exp.exp7;
 2 
 3 import java.util.ArrayList;
 4 
 5 public class Exp7_2_1 {
 6     public static void main(String[] args) {
 7         // TODO Auto-generated method stub
 8         ArrayList<Task> tasks=new ArrayList<>();
 9         tasks.add(new Task(1,5));
10         tasks.add(new Task(2,4));
11         tasks.add(new Task(3,6));
12         tasks.add(new Task(5,8));
13         intervalSchedule(tasks);
14     }
15 
16     public static void intervalSchedule(ArrayList<Task> tasks){
17         //按结束时间从小到大进行排序
18         tasks.sort((t1,t2)->{
19             if(t1.endTime<=t2.endTime)
20                 return -1;
21             else
22                 return 1;
23         });
24         
25         Task[] t = new Task[tasks.size()];
26         tasks.toArray(t);
27         int result = 0;
28         if(t.length>=1){
29             result=1+intervalRecuisive(t, 0, t.length-1);
30         }
31         System.out.println("最大区间个数为: "+result);
32     }
33     public static int intervalRecuisive(Task[] task,int i,int j){
34         int m=i+1;
35         //下一个任务与前面的任务不兼容
36         while(m<=j && task[m].startTime<task[i].endTime)
37             m++;
38         //已经没有任务与前面任务兼容
39         if(m<=j)
40             return 1+intervalRecuisive(task, m, j);
41         else
42             return 0;
43     }
44 }
View Code

 

技术分享图片
 1 package org.xiu68.exp.exp7;
 2 
 3 import java.util.ArrayList;
 4 
 5 public class Exp7_2_2 {
 6 
 7     //区间调度的迭代版本(最大区间个数)
 8     public static void main(String[] args) {
 9         // TODO Auto-generated method stub
10         ArrayList<Task> tasks=new ArrayList<>();
11         tasks.add(new Task(6,9));
12         tasks.add(new Task(6,7));
13         tasks.add(new Task(5,6));
14         tasks.add(new Task(4,5));
15         intervalSchedule(tasks);
16     }
17     
18     public static void intervalSchedule(ArrayList<Task> tasks){
19         //按结束时间从小到大进行排序
20         tasks.sort((t1,t2)->{
21             if(t1.endTime<=t2.endTime)
22                 return -1;
23             else
24                 return 1;
25         });
26         
27         int result=0,end=0;
28         for(int i=0;i<tasks.size();i++){        //每次选择结束时间最早的任务
29             if(tasks.get(i).startTime>=end){        //如果任务之间相互兼容
30                 result+=1;
31                 end=tasks.get(i).endTime;
32             }
33         }
34         System.out.println("最大区间个数为: "+result);
35     }
36 }
View Code

 

以上是关于Expm 7_2区间调度问题的主要内容,如果未能解决你的问题,请参考以下文章

Expm 7_1树中的最大独立集问题

Expm 9_1 有向图中环的判断问题

Expm 9_2 有向图的强连通分量问题

Expm 3_2 寻找最邻近的点对

Expm 9_3 无向图的双连通分量问题

白书 区间调度问题