带有期限的作业排序要解决的是操作系统中单机、无资源约束且每个作业可在等量时间内完成的作业调度问题,形式化描述为: ①只能在一台机器上处理n个作业,每个作业i=1,...,n均可在单位时间内完成; ②每个作业i都有一个期限值di>0,(di是整数); ③当且仅当作业i在它的截止期限前被完成时获得pi>0的效益; 问题的可行解是这n个作业的一个子集合J。J中的每个作业都能在各自的截止期限之前完成,产生一个作业效益之和∑pi。具有最大效益值的可行解就是最优解。 要求用更快的作业排序算法(利用集合树方法)实现。给出具体c语言代码
时间: 2024-02-28 13:57:20 浏览: 135
带期限的作业排序算法的实现
5星 · 资源好评率100%
以下是使用集合树方法实现带有期限的作业排序问题的C语言代码。假设作业的期限和效益都存储在一个结构体数组中,其中deadline和profit分别表示期限和效益。
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_JOBS 1000
struct job {
int deadline;
int profit;
};
struct set {
int parent;
int size;
};
int find(struct set *sets, int i) {
if (sets[i].parent != i) {
sets[i].parent = find(sets, sets[i].parent);
}
return sets[i].parent;
}
void union_sets(struct set *sets, int x, int y) {
int root_x = find(sets, x);
int root_y = find(sets, y);
if (root_x == root_y) {
return;
}
if (sets[root_x].size < sets[root_y].size) {
sets[root_x].parent = root_y;
sets[root_y].size += sets[root_x].size;
} else {
sets[root_y].parent = root_x;
sets[root_x].size += sets[root_y].size;
}
}
int cmp_jobs(const void *a, const void *b) {
struct job *job_a = (struct job *) a;
struct job *job_b = (struct job *) b;
return job_b->profit - job_a->profit;
}
int schedule_jobs(struct job *jobs, int n) {
struct set sets[MAX_JOBS+1];
int i, j, max_profit = 0;
for (i = 1; i <= n; i++) {
sets[i].parent = i;
sets[i].size = 1;
}
qsort(jobs, n, sizeof(struct job), cmp_jobs);
for (i = 0; i < n; i++) {
int slot = find(sets, jobs[i].deadline);
if (slot > 0) {
union_sets(sets, slot, slot-1);
max_profit += jobs[i].profit;
}
}
return max_profit;
}
int main() {
struct job jobs[] = {{4, 70}, {1, 80}, {1, 30}, {1, 100}};
int n = sizeof(jobs) / sizeof(jobs[0]);
int max_profit = schedule_jobs(jobs, n);
printf("Max profit: %d\n", max_profit);
return 0;
}
```
在这个实现中,使用了一个结构体数组来存储作业的期限和效益。使用了一个结构体数组来存储集合树中每个元素的父节点和大小。使用了一个cmp_jobs函数来比较作业的效益,使用qsort函数对作业进行排序。在schedule_jobs函数中,首先初始化集合树,然后对作业按照效益从大到小排序。然后依次将每个作业加入到集合树中,如果该作业的期限已过,则放弃该作业。如果该作业能够在期限之前完成,则将它加入到截止期限最早的未满集合中,并将该集合与前一个集合合并。最后返回最大效益值。
注意:这段代码可能存在错误或不完善之处,仅供参考。
阅读全文