任務(wù)調(diào)度問題:在單處理器上具有期限和懲罰的單位時(shí)間任務(wù)調(diào)度問題;平衡樹問題:實(shí)現(xiàn)3種樹中的兩種:紅黑樹狞悲,AVL樹火欧,Treap樹。
任務(wù)調(diào)度問題
任務(wù)調(diào)度問題就是給定一個(gè)有窮單位時(shí)間任務(wù)的集合S振劳,集合S中的每個(gè)任務(wù)都有一個(gè)截止期限di和超時(shí)懲罰wi椎组,需要找出集合S的一個(gè)調(diào)度,使得因任務(wù)誤期所導(dǎo)致的總懲罰最小历恐,這個(gè)調(diào)度也稱為S的一個(gè)最優(yōu)調(diào)度寸癌。
問題描述:
在單處理器上具有期限和懲罰的單位時(shí)間任務(wù)調(diào)度問題(課本P239)
實(shí)驗(yàn)要求:
(1)實(shí)現(xiàn)這個(gè)問題的貪心算法
(2)將每個(gè) wi 替換為max{m1,m2…mn}—wi,運(yùn)行算法比較結(jié)果夹供。
解題思路:
1.先將任務(wù)按照時(shí)間懲罰遞減順序進(jìn)行排序灵份,
2.然后用貪心的思想,盡量把懲罰重的任務(wù)先放入待完成隊(duì)列中哮洽。
代碼
#include<iostream>
#include <algorithm>
#include<ctime>
#define n 6
using namespace std;
typedef struct {
int id;//第幾個(gè)任務(wù)
int d;//任務(wù)的期限
int w;//罰
}tesk;
bool cmpW(tesk t1, tesk t2) {
return t1.w>t2.w;
}
bool cmpD(tesk t1, tesk t2) {
return t1.d<t2.d;
}
void InitNum(tesk t[]) {
srand((unsigned)time(NULL));
for (int i = 0; i < n; i++) {
t[i].id = i + 1;
t[i].d = rand() % n + 1;
t[i].w = rand() % 30;
}
}
void copy(tesk &t1, tesk &t2) {
t1.id = t2.id;
t1.d = t2.d;
t1.w = t2.w;
}
int greedy(tesk a[], tesk ta[], int &ans) {
int num = 0, i, j;//當(dāng)前已經(jīng)完成的任務(wù)數(shù)量
sort(ta, ta + n, cmpW);
int fla[9999];
memset(fla, 0, sizeof(fla));
for (i = 0; i<n; i++) {
for (j = ta[i].d; j>0; j--) {
if (fla[j] == 0) {
fla[j] = 1;
break;
}
}
if (j>0) {
copy(a[num++], ta[i]);
ans -= ta[i].w;
}
}
return num;
}
int main() {
tesk ta[n], a[n], tb[n], b[n];
printf("%s", "正在生成隨機(jī)數(shù)據(jù)\n");
InitNum(ta);
for (int i = 0; i < n; i++) {
copy(tb[i], ta[i]);
}
printf("%s", "生成的數(shù)據(jù)為\n");
int max_w = -1, sum_w = 0;
for (int i = 0; i < n; i++) {
printf("ID: %d填渠,任務(wù)的期限: %d,任務(wù)的懲罰:%d\n", ta[i].id, ta[i].d, ta[i].w);
sum_w += ta[i].w;
if (max_w < ta[i].w) {
max_w = ta[i].w;
}
}
int k = greedy(a, ta, sum_w);
printf("任務(wù)懲罰為:%d\n", sum_w);
sort(a, a + k, cmpD);
printf("將完成執(zhí)行的任務(wù)按照時(shí)間遞增順序排列輸出:\n");
for (int i = 0; i<k; i++) {
printf("ID:%d鸟辅,期限:%d氛什,懲罰:%d\n", a[i].id, a[i].d, a[i].w);
}
sort(a, a + k, cmpW);
printf("將完成的任務(wù)按懲罰排序;\n");
for (int i = 0; i<k; i++) {
printf("ID:%d匪凉,期限:%d枪眉,懲罰:%d\n", a[i].id, a[i].d, a[i].w);
}
printf("若將每個(gè)wi替換為max{m1,m2...mn}—wi,新的數(shù)據(jù)為\n");
for (int i = 0; i<n; i++) {
tb[i].w = max_w - tb[i].w;
printf("ID:%d再层,期限:%d贸铜,懲罰:%d\n", tb[i].id, tb[i].d, tb[i].w);
sum_w += tb[i].w;
}
k = greedy(b, tb, sum_w);
printf("任務(wù)懲罰為:%d\n", sum_w);
sort(b, b + k, cmpD);
printf("將完成執(zhí)行的任務(wù)按照時(shí)間遞增順序排列輸出:\n");
for (int i = 0; i<k; i++) {
printf("ID:%d,期限:%d聂受,懲罰:%d\n", b[i].id, b[i].d, b[i].w);
}
sort(b, b + k, cmpW);
printf("將完成的任務(wù)按懲罰排序蒿秦;\n");
for (int i = 0; i<k; i++) {
printf("ID:%d,期限:%d蛋济,懲罰:%d\n", b[i].id, b[i].d, b[i].w);
}
}
實(shí)驗(yàn)截圖
實(shí)現(xiàn)3種樹
實(shí)現(xiàn)3種樹中的兩種:紅黑樹棍鳖,AVL樹(課本P177),Treap樹
紅黑樹
性質(zhì)
- 根節(jié)點(diǎn)是黑色的
- 每個(gè)節(jié)點(diǎn)或紅或黑
- 每個(gè)葉節(jié)點(diǎn)都是黑色的
- 紅節(jié)點(diǎn)的兩個(gè)子節(jié)點(diǎn)都是黑色