您的位置:首页 > 编程语言 > Java开发

Java实现最短作业优化算法 (SJF算法)

2017-05-16 20:30 309 查看
题目描述:

最短作业优先(SJF)是一种调度任务请求的策略。每个任务请求都含有请求时间(即向系统提交请求的时间)和持续时间(即完成任务所需时间)属性。当前任务完成后,SJF策略选择含有最短持续时间的任务执行。如果有多个任务具有相同持续时间,那么选择含有最早请求时间的任务。任务的等待时间为请求时间和实际开始时间的差值(即它等待系统执行所花费的时间)。可以假设,作业到达时,系统一直执行任务,从未空闲。

给定任务的请求时间和持续时间表,设计一个程序,使用短作业优先(SJF)算法计算平均等待时间。

输入:

任务请求时间整数列表 requestTimes

任务持续时间整数列表 durations

输出

返回使用SJF调度计算出的平均等待时间浮点数

测试用例:

input:[0,2,4,5] [7,4,1,4]

output:4.0

input:[0,1,3,9][2,1,7,5]

output:0.5

分析测试用例1:

首先0时刻开始,所以第一个执行的是7.此时time=0-0=0;

然后7时刻,所有的时间都已经到达,这个时候,选择持续时间最短的,执行1,此时time=7-4=3;

然后8时刻,选择最短的持续时间,这里有两个4,选择两个4里面请求时间最早的4,所以应该执行第一个4,这个时候,time=8-2=6;

然后12时刻,选择最后一个4,time=12-5=7;

所以平均等待时间应该是 (0+3+6+7)/4=4.0

分析测试用例2:

input:[0,1,3,9][2,1,7,5]

output:0.5

0时刻,执行2.time=0-0=0;

2时刻,只有1到达了,所以执行1,time=2-1=1;

3时刻,只有7到达了,所以执行7,time=3-3=0;

10时刻,最后一个到达,所以执行5,time=10-9=1;

所以平均等待时间应该是: (0+1+0+1)/4=0.5

所以按照这个想法写代码吧,注意判断边界条件,首先是request和duration的数组是大于等于0,小于等于100的。其次是执行的时间和请求时间都必须是正数,否则直接返回error,最后需要注意返回的是浮点数。

/**

/**
*  @author   LilyLee
* @date     2017年5月16日
* @time     下午4:34:02
* @Version  1.0
* @email    lilylee_1213@foxmail.com
*
*/
public class zhongxinSJF {

public static void main(String[] args) {
//int [] requesttime={0,2,4,5};
//int []durations={7,4,1,4};

int [] requesttime={0,1,3,9};
int []durations={2,1,7,5};
System.out.println(waitTime(requesttime,durations));

}

public static float waitTime(int[] requesttime,int[] durations){
float fin=0.0f;
float wtime=0.0f;
int temptime=0;
int nowtime=0;
int []flag=new int[requesttime.length];
int cy=durations.length-1;
boolean b=true;

//第一个真的要特殊处理,不然后面的判断真的好烦啊。
nowtime=durations[0];
durations[0]=1234567;
requesttime[0]=1324567;

while(b){

for(int i=1;i<durations.length;i++){
if(requesttime[i]>=0&&requesttime[i]<=nowtime){
flag[i]=1;
}
}

int re=findminD(flag,durations,requesttime);
//	System.out.println(durations[re]+ "  "+requesttime[re]);

wtime=nowtime-requesttime[re];
nowtime+=durations[re];
fin+=wtime;
//System.out.println("wtime="+wtime+"nowtime="+nowtime);

//开始没有处理使用过这个问题,因此结果不对,一直在最小的那个数上循环
requesttime[re]=durations[0];
durations[re]=durations[0];

cy--;
if(cy==0){
b=false;
}
}

return (fin/requesttime.length);
}

public static int findminD(int[] flag,int []durations,int[] requesttime){
int min=durations[0];
int minid=0;

/*	for(int k=0;k<durations.length;k++){
if(durations[k]==-1){
durations[k]=1000;
requesttime[k]=1000;
flag[k]=0;
}
}
*/

for(int i=0;i<durations.length;i++){
if(flag[i]!=0){
if(durations[i]<min){
min=durations[i];
minid=i;
}else if(durations[i]==min){
if(requesttime[i]<minid){
min=durations[i];
minid=i;
}
}
}
}

return minid;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  JAVA
相关文章推荐