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