程序排程演算法 短作業優先 SJF
阿新 • • 發佈:2019-02-18
問題描述
短作業優先(SJF, Shortest Job First)又稱為“短程序優先”SPN(Shortest Process Next);是對FCFS演算法的改進,其目標是減少平均週轉時間。
短作業優先排程演算法基於這樣一種思想:
執行時間短的優先排程;
如果執行時間相同則排程最先發起請求的程序。
PS:本題題面描述有誤,但原題如此,不宜修改,實際優先順序如下:
1)接到任務的時間;
2) 如果接收時間相同則排程 執行時間最短的任務。
等待時間:一個程序從發起請求到開始執行的時間間隔。
現在有n個程序請求cpu,每個程序用一個二元組表示:(p,q),p代表該程序發起請求的時間,p代表需要佔用cpu的時間。
請計算n個程序的平均等待時間。
輸入描述:
輸入包含多組測試資料。
對於每組測試資料,第一行為一個整數n。
然後有n行,每行兩個整數,代表上述的二元組(p,q).
保證:
2<=n<=2000,1<=p<=300,1<=q<=100.
輸出描述:
對於每組資料,輸出一個浮點數,代表平均等待時間,請保留4位有效數字
輸入例子:
4
1 4
1 3
1 5
2 1
輸出例子:
5.2500
筆記
注意,問題描述和可以通過的程式碼的邏輯是相反的,詳見評論。
其實這是一個自定義排序的問題。需要先對到達時間排序,再對執行時間排序。
得到排序後的序列之後就可以確定等待時間了。在這裡要注意,設定當前時間為now,如果now大於當前程序的準備時間,證明當前可以執行這個任務。否則當前不可以執行這個任務。需要在程式設計中體現這個問題。
程式碼
//
// main.cpp
// SJF
//
// Created by SteveWong on 8/4/16.
// Copyright © 2016 SteveWong. All rights reserved.
//
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct cmp
{
bool operator() (vector<int> a, vector<int> b)
{
if (a[0] == b[0])
return a[1] < b[1];
else
return a[0] < b[0];
}
};
int main(int argc, const char * argv[]) {
// insert code here...
//std::cout << "Hello, World!\n";
int len;
while (cin >> len)
{
vector<vector<int>> jobs;
for (int i = 0; i < len; i++)
{
int p, q;
cin >> p >> q;
vector<int> tmp = {p, q};
jobs.push_back(tmp);
}
sort(jobs.begin(), jobs.end(), cmp());
int res = 0;
int now = jobs[0][0] + jobs[0][1];
for (int i = 1; i < len; i++)
{
if (now > jobs[i][0]) //當前可以執行
{
res += (now - jobs[i][0]);
now += jobs[i][1];
}
else //當前還不可以執行
{
res += 0;
now = jobs[i][0] + jobs[i][1];
}
}
printf("%.4f\n", double(res) / len);
}
return 0;
}