1. 程式人生 > >最短作業優先排程演算法(SJF演算法)的C++實現

最短作業優先排程演算法(SJF演算法)的C++實現

題目要求:

在作業排程中,該演算法每次從後備作業佇列中挑選估計服務時間最短的一個或幾個作業,將他們調入記憶體,分配必要的資源,建立程序並放入就緒佇列。與在程序排程中的原理類似。假設有n項作業位於就緒佇列中,這些作業的請求時間用陣列requestTimes按照提交時間的先後順序儲存,對應的作業服務時間(也稱持續時間)用陣列durations儲存。當每個作業被完成後,接下來優先選擇服務時間(持續時間)短的,如果多個服務時間一樣,則優先選擇請求時間最先的。採用SJF演算法,計算n項作業的平均等待時間。所有要執行的任務的請求時間必須在上一個任務完成的時間內。假設0<= n <= 100。

測試用例:

requestTimes = {0, 2, 4, 5};

durations = {7, 4, 1, 4};

可以理解為一定首先執行第一個任務,請求時間為0,執行了7個時間單位;

接下來在服務時間最短的中選擇,顯然是任務3,請求時間為4,執行1個時間單位;

再接下來發現2和4這兩個任務服務時間一樣短,則優先選擇請求時間最先的,顯然是選擇任務2,執行4個時間單位

最後是任務4(並且只有任務4了),請求時間為5,執行4個時間單位

等待時間:任務1是0,任務3是3,任務2是5,任務4是7,所以平均等待時間是4。

int findmin_duration(vector<int> &a,int *b,int end_time, int n)
{
	int min = INT_MAX;
	int pos = 0;
	for (int i = 1; i < n; i++)
	{
		if (a[i] < min && b[i] <= end_time)
		{
			min = a[i];
			pos = i;
		}
	}
	a[pos] = INT_MAX;
	return pos;
}

float average_wait_time(int *requestTimes, int *durations, int n)
{
	vector<int> durate(n,0);
	vector<int> startTime(n, 0);
	vector<int> endTime(n, 0);
	vector<int> waitTime(n, 0);
	int i;
	for (i = 0; i < n; i++)
		durate[i] = durations[i];
	startTime[0] = requestTimes[0];
	endTime[0] = durations[0] + startTime[0];
	waitTime[0] = startTime[0] - requestTimes[0];
	int minIndex = 0;
	int lastIndex = minIndex;
	for (i = 1; i < n; i++)
	{
		minIndex = findmin_duration(durate, requestTimes, endTime[lastIndex], n);
		startTime[minIndex] =  endTime[lastIndex];
		endTime[minIndex] = durations[minIndex] + startTime[minIndex];
		waitTime[minIndex] = startTime[minIndex] - requestTimes[minIndex];
		lastIndex = minIndex;
	}

	int s = 0;
	for (i = 0; i < n; i++)
		s += waitTime[i];
	float avageTime = (float)s / (float)n;
	return avageTime;
}
int main(int argc, char* argv[])
{
	int requestTimes[4] = { 0, 1, 3, 9 };
	int durations[4] = { 2, 1, 7, 5 };
	//int requestTimes[] = { 0, 2, 4, 5 };
	//int durations[] = { 7, 4, 1, 4 };
	cout << average_wait_time(requestTimes, durations, 4) << endl;
	getchar();
	return 0;
}