C++使用vector事先SJF
时间: 2024-02-09 16:04:00 浏览: 33
根据提供的引用内容,没有找到关于C++使用vector实现SJF的相关信息。SJF(Shortest Job First)是一种调度算法,用于在多道程序环境下,按照作业的执行时间长短来安排作业的执行顺序。vector是C++ STL中的一个容器,用于存储动态数组。它可以在运行时动态增加或减少元素,因此可以用于存储作业的执行时间等信息。但是,如何使用vector实现SJF需要根据具体的应用场景进行设计和实现。
相关问题
使用c++ 结构体,实现sjf短作业优先调度算法
好的,让我向您解释一下如何使用C结构体来实现SJF短作业优先调度算法。
首先,我们需要定义一个结构体来表示每个作业的信息,包括作业的名称、到达时间、服务时间和等待时间。结构体可以定义如下:
```c
struct job {
char name[10];
int arrive_time;
int service_time;
int waiting_time;
};
```
然后,我们可以创建一个作业数组来存储所有的作业信息,并按照到达时间的顺序对它们进行排序。这可以通过一个输入函数来实现,如下所示:
```c
void input_jobs(struct job jobs[], int n) {
int i;
for (i = 0; i < n; i++) {
printf("请输入第 %d 个作业的名称、到达时间和服务时间: ", i + 1);
scanf("%s %d %d", &jobs[i].name, &jobs[i].arrive_time, &jobs[i].service_time);
}
// 按照到达时间排序
qsort(jobs, n, sizeof(struct job), cmp_by_arrive_time);
}
```
在这个函数中,我们让用户逐个输入每个作业的名称、到达时间和服务时间,并按照到达时间进行排序。我们还需要定义一个函数 cmp_by_arrive_time() 来比较两个作业的到达时间:
```c
int cmp_by_arrive_time(const void *a, const void *b) {
const struct job *j1 = (const struct job *)a;
const struct job *j2 = (const struct job *)b;
return j1->arrive_time - j2->arrive_time;
}
```
接下来,我们可以实现SJF短作业优先调度算法。该算法基于服务时间来决定下一个要执行的作业。我们使用一个指针来指向当前时间点正在执行的作业,并将其初始化为 NULL。然后,我们遍历作业数组,如果遇到了一个到达时间小于等于当前时间并且服务时间比当前作业更短的作业,就将当前指针指向该作业。最后,我们更新当前时间,将等待时间和运行时间都累加到总和中,并输出结果。
完整的代码如下所示:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct job {
char name[10];
int arrive_time;
int service_time;
int waiting_time;
};
void input_jobs(struct job jobs[], int n);
int cmp_by_arrive_time(const void *a, const void *b);
int main() {
int n, i, current_time = 0, total_waiting_time = 0, total_service_time = 0;
struct job *current_job = NULL;
struct job *jobs;
printf("请输入作业个数: ");
scanf("%d", &n);
jobs = malloc(n * sizeof(struct job));
input_jobs(jobs, n);
for (i = 0; i < n; i++) {
if (current_job != NULL && current_time < jobs[i].arrive_time && total_service_time != 0) {
// 暂停执行当前作业,更新等待时间和当前时间
current_job->waiting_time += (jobs[i].arrive_time - current_time);
total_waiting_time += (jobs[i].arrive_time - current_time);
current_time = jobs[i].arrive_time;
}
if (current_job == NULL || jobs[i].service_time < current_job->service_time) {
// 切换到更短的作业
current_job = &jobs[i];
}
current_job->service_time--;
total_service_time++;
if (current_job->service_time == 0) {
// 当前作业执行完毕,更新当前时间
current_time += 1;
current_job = NULL;
}
}
printf("\n作业执行结果如下:\n");
for (i = 0; i < n; i++) {
printf("作业名称:%s,等待时间:%d\n", jobs[i].name, jobs[i].waiting_time);
}
printf("平均等待时间:%f\n", (float)total_waiting_time / n);
free(jobs);
return 0;
}
void input_jobs(struct job jobs[], int n) {
int i;
for (i = 0; i < n; i++) {
printf("请输入第 %d 个作业的名称、到达时间和服务时间: ", i + 1);
scanf("%s %d %d", &jobs[i].name, &jobs[i].arrive_time, &jobs[i].service_time);
}
// 按照到达时间排序
qsort(jobs, n, sizeof(struct job), cmp_by_arrive_time);
}
int cmp_by_arrive_time(const void *a, const void *b) {
const struct job *j1 = (const struct job *)a;
const struct job *j2 = (const struct job *)b;
return j1->arrive_time - j2->arrive_time;
}
```
希望这可以帮助您更好地理解如何使用C结构体来实现SJF短作业优先调度算法。
sjf调度算法c++
以下是一个使用C++实现的SJF调度算法的示例:
```c++
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct Process {
int id; // 进程ID
int arrival_time; // 到达时间
int burst_time; // 运行时间
};
bool cmp(Process a, Process b) {
return a.burst_time < b.burst_time;
}
void SJF(vector<Process>& processes) {
sort(processes.begin(), processes.end(), cmp); // 按照运行时间排序
int n = processes.size();
int total_time = 0; // 总运行时间
int total_wait_time = 0; // 总等待时间
for (int i = 0; i < n; i++) {
total_time += processes[i].burst_time;
total_wait_time += total_time - processes[i].arrival_time - processes[i].burst_time;
}
double avg_wait_time = (double)total_wait_time / n; // 平均等待时间
cout << "平均等待时间:" << avg_wait_time << endl;
}
int main() {
vector<Process> processes = {{1,0, 6}, {2, 2, 4}, {3, 4, 2}, {4, 5, 1}, {5, 6, 3}};
SJF(processes);
return 0;
}
```