短作业优先(SJF, Shortest Job First)又称为“短进程优先”SPN(Shortest Process Next);是对FCFS算法的改进,其目标是减少平均周转时间。
短作业优先调度算法基于这样一种思想:
运行时间短的优先调度;
如果运行时间相同则调度最先发起请求的进程。
等待时间:一个进程从发起请求到开始执行的时间间隔。
现在有n个进程请求cpu,每个进程用一个二元组表示:(p,q),p代表该进程发起请求的时间,p代表需要占用cpu的时间。
短作业优先调度算法基于这样一种思想:
运行时间短的优先调度;
如果运行时间相同则调度最先发起请求的进程。
等待时间:一个进程从发起请求到开始执行的时间间隔。
现在有n个进程请求cpu,每个进程用一个二元组表示:(p,q),p代表该进程发起请求的时间,p代表需要占用cpu的时间。
请计算n个进程的平均等待时间。
import java.text.DecimalFormat;
import java.util.*;
public class Main {
/**
* @param args
*/
static class task{
int begin;
int end;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
while(in.hasNext()){
int n=in.nextInt();
List<task> list=new ArrayList<task>();
for(int i=0;i<n;i++){
task t=new task();
t.begin=in.nextInt();
t.end=in.nextInt();
list.add(t);
}
Collections.sort(list, new Comparator<task>(){
@Override
public int compare(task o1, task o2) {
// TODO Auto-generated method stub
return o1.begin-o2.begin;
}
});
Collections.sort(list, new Comparator<task>(){
@Override
public int compare(task o1, task o2) {
// TODO Auto-generated method stub
if(o1.begin==o2.begin) return o1.end-o2.end;
else return 0;
}
});
int t=list.get(0).begin;
double s=0;
for(int j=0;j<list.size();j++){
if(t>=list.get(j).begin)
s+=(t-list.get(j).begin);
t+=list.get(j).end;
}
//double a=0;
DecimalFormat df = new DecimalFormat( "0.0000");
System.out.println(df.format(s/n));
}
}
}