短作业优先(SJF, Shortest Job First)又称为“短进程优先”SPN(Shortest Process Next);是对FCFS算法的改进,其目标是减少平均周转时间。
短作业优先调度算法基于这样一种思想:
运行时间短的优先调度;
如果运行时间相同则调度最先发起请求的进程。
等待时间:一个进程从发起请求到开始执行的时间间隔。
现在有n个进程请求cpu,每个进程用一个二元组表示:(p,q),p代表该进程发起请求的时间,p代表需要占用cpu的时间。
请计算n个进程的平均等待时间。
输入描述:
输入包含多组测试数据。
对于每组测试数据,第一行为一个整数n。
然后有n行,每行两个整数,代表上述的二元组(p,q).
保证:
2<=n<=2000,1<=p<=300,1<=q<=100.
import java.util.*;
public class Main{
public static class Job implements Comparable{
public int request;
public int cpu;
public int compareTo(Object o) {
// TODO Auto-generated method stub
Job job=(Job)o;
if(job.request==request)
if(cpu<job.cpu) return -1;
else if(cpu>job.cpu) return 1;
else return 0;
else if(request<job.request){
return -1;
}else return 1;
}
}
public float avgWait(int n, ArrayList<Job> jobs){
Collections.sort(jobs);
float wait=0;
int now=jobs.get(0).request;
while(jobs.size()>0){
int i=0,j=0;
Job job=jobs.get(i++);
if(now<=job.request) {now+=job.cpu; jobs.remove(0); continue;}
else{
while(i<jobs.size()){
Job jb=jobs.get(i++);
if(jb.request<=now&&jb.cpu<job.cpu) {
job=jb;
j=i-1;
}
}
wait=wait+now-job.request;
now+=job.cpu;
jobs.remove(j);
}
}
return wait/n;
}
public static void main(String[] args){
Scanner scan=new Scanner(System.in);
while(scan.hasNext()){
int n=scan.nextInt();
ArrayList<Job> jobs=new ArrayList<Job>();
for(int i=0;i<n;i++){
Job job=new Job();
job.request=scan.nextInt();
job.cpu=scan.nextInt();
jobs.add(job);
}
System.out.println((new Main()).avgWait(n,jobs));
}
}
}