社区
数据结构与算法
帖子详情
求用最小堆实现机器调度问题
tjuwudi
2008-03-21 03:53:39
如题,所有的任务执行完成使所用的机器数最少,要求用最小堆实现,麻烦附上思路和源代码,谢谢!
Sample Input
3//3个任务
3 5//开始时间和结束时间
1 4
4 5
Sample Output
2//最少用两台机器
...全文
273
7
打赏
收藏
求用最小堆实现机器调度问题
如题,所有的任务执行完成使所用的机器数最少,要求用最小堆实现,麻烦附上思路和源代码,谢谢! Sample Input 3//3个任务 3 5//开始时间和结束时间 1 4 4 5 Sample Output 2//最少用两台机器
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xero_123
2010-09-05
打赏
举报
回复
不知道楼主为什么要求最最小堆来实现,但是我认为这个很类似编程之美里面的,面试安排的问题,总体思路就是,当前俺开始时间先后顺序排序,之后每次遇到一个开始时间则资源数目加一,每次遇到一个结束时间点则资源数目减一个,这样在整个过程中的最大资源数字就是所求,
qq120848369
2010-05-22
打赏
举报
回复
想用最小堆实现贪心策略么.
最小堆就不要自己写了,这个工作应该学数据结构时候做.
现在,你可以用STL里的priority_queue 来实现.
每次取一个开始时间最早的(堆顶),判断与前一次决定的活动的结束时间的关系,不重叠就决定它,冲突了就再取一个.
cmy0209
2010-05-22
打赏
举报
回复
没写完
cmy0209
2010-05-22
打赏
举报
回复
#include"stdio.h"
#include"malloc.h"
struct machinenode{
int ID; //机器号
int avail //机器可用时刻
};
struct jobnode{
int ID; //作业号
int time; //处理时间
};
typedef struct{
int key;
}Dui;
int rn(int n){
int i,r[20];
printf("输入%d个作业的信息:",n);
for(i=1;i<=n;i++)
scanf("%d",&r[i]);
return r;
}
int rm(int m){
int i,r[20];
printf("输入%d台机器的编号:",m);
for(i=1;i<=m;i++)
scanf("%d",&r[i]);
return r;
}
void siftB(Dui r[],int k,int m){ //大根堆的调整算法
int j,i;
i=k;j=2*i;
while(j<=m){
if(j<m&&r[j].key<r[j+1].key) j++;
//比较左右孩子的大小,使j为较大的孩子的下标
if(r[i].key<r[j].key){
r[i]<->r[j]; //较大的孩子与根交换
i=j;j=2*i;
}
else break;
}
}
void creatheapB(Dui r[],int m){ //建大根堆
for(i=n/2;i>=1;--i) //自第n/2个元素开始筛选
siftB(r,i,n);
}
void siftL(Dui r[],int k,int m){ //小根堆的调整算法
int j,i;
i=k;j=2*i;
while(j<=m){
if(j<m&&r[j].key>r[j+1].key) j++;
//比较左右孩子的大小,使j为较小的孩子的下标
if(r[i].key>r[j].key){
r[i]<->r[j]; //较小的孩子与根交换
i=j;j=2*i;
}
else break;
}
}
void creatheapL(Dui r[],int m){ //建小根堆
for(i=n/2;i>=1;--i) //自第n/2个元素开始筛选
siftL(r,i,n);
}
void heapsort(Dui r[],int n){ //堆排序
int i;
for(i=n/2;i>=1;i--) sift(r,i,n);
for(i=n;i>1;i--){
r[1]<->r[i];
sift(r,1,i-1);
}
}
void judeg(int m,int n){
int i,rn[20],rm[20];
rn=rn(n);
rm=rm(m);
if(n<=m){
for(i=2;i<=n;i++)
if(rn[1]<rn[i])
rn[1]=rn[i];
printf("最短时间为:%d",rn[1]);
}
else{
creatheapB(rn,n);
creatheapL(rm,m);
}
}
void main(){
int m,n;
printf("输入机器数m和作业数n:");
scanf("%d%d",&m,&n);
judge(m,n);
}
knowledge_Is_Life
2008-05-01
打赏
举报
回复
lz要干嘛?
meiZiNick
2008-04-30
打赏
举报
回复
不明LZ在说什么
大王派我去巡山
2008-03-21
打赏
举报
回复
这个很像“会场分配”问题,贪心算法可以解决。
首先为第一台机器分配任务,每一步选择的都是和前面的任务不冲突同时结束时间最早的任务;
排完第一台机器之后,如果还有任务剩下来,那再按照同样的方式为第二台机器排任务;
如果还有剩余,再为第三台机器排任务;
……
所有任务派完之后,最少用到几台机器的数量也出来了。
最小堆按照结束时间来判定,结束时间早的放在上层。每次从堆中取的都是结束时间最早的任务,如果该任务和这台机器前面的任务不发生冲突,那么就把这个任务排给这台机器;如果产生冲突,则把这个任务留给下一台机器。
4.7--贪心--多机
调度问题
(
最小堆
)
最小堆
,
最小堆
,多机调度贪心问题
机器
调度问题
[问题描述] 有m台
机器
处理n个作业,设作业i的处理时间为ti,则对n个作业进行
机器
分配,设计算法进行合理调度,使得m台
机器
上处理n个作业所需要...(1)这是一个多
机器
调度最优解问题。输入:n个不同处理时间的作业...
贪心算法——多机
调度问题
设有n个独立的作业,由m台相同的
机器
进行加工处理。任何作业可以在任何一台
机器
上面加工处理,但未完工之前不允许中断处理。...多机
调度问题
是在有限的
机器
里通过选择来使任务完成所需的时间最短。
机器
调度算法的C++
实现
与优化
在信息技术飞速发展的今天,
机器
调度问题
作为计算机科学中一个重要且活跃的研究领域,已深入到各种计算任务的高效执行中。
机器
调度问题
的核心在于如何合理安排和调度计算资源,以满足不同场景下的性能要求。无论是在...
贪心算法解决多机
调度问题
——C++
实现
贪心算法解决多机
调度问题
——C++
实现
数据结构与算法
33,027
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章