社区
数据结构与算法
帖子详情
求用最小堆实现机器调度问题
tjuwudi
2008-03-21 03:53:39
如题,所有的任务执行完成使所用的机器数最少,要求用最小堆实现,麻烦附上思路和源代码,谢谢!
Sample Input
3//3个任务
3 5//开始时间和结束时间
1 4
4 5
Sample Output
2//最少用两台机器
...全文
309
7
打赏
收藏
求用最小堆实现机器调度问题
如题,所有的任务执行完成使所用的机器数最少,要求用最小堆实现,麻烦附上思路和源代码,谢谢! Sample Input 3//3个任务 3 5//开始时间和结束时间 1 4 4 5 Sample Output 2//最少用两台机器
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
这个很像“会场分配”问题,贪心算法可以解决。
首先为第一台机器分配任务,每一步选择的都是和前面的任务不冲突同时结束时间最早的任务;
排完第一台机器之后,如果还有任务剩下来,那再按照同样的方式为第二台机器排任务;
如果还有剩余,再为第三台机器排任务;
……
所有任务派完之后,最少用到几台机器的数量也出来了。
最小堆按照结束时间来判定,结束时间早的放在上层。每次从堆中取的都是结束时间最早的任务,如果该任务和这台机器前面的任务不发生冲突,那么就把这个任务排给这台机器;如果产生冲突,则把这个任务留给下一台机器。
批处理作业调度【回溯算法】
博客围绕作业
调度问题
展开,给定n个作业需在两台
机器
上按顺序处理,目标是找到使完成时间和最小的最佳调度方案。问题解空间树是排列树,通过实例分析计算不同调度顺序的完成时间和,确定最佳方案,并强调了判断作业在
机器
2上处理开始时间的方法。
机器
调度问题
该博客聚焦
机器
调度问题
,旨在确定如何调度能让m台
机器
运行n个作业的时间最短。采用最长处理时间优先(LPT)调度策略,作业按所需处理时间递减排列,
机器
按空闲到来时刻生成递增序列,还提及了测试函数与结果。
贪心算法——求解流水作业
调度问题
本文探讨了由两台
机器
组成的流水线作业
调度问题
,通过Johnson贪心算法确定N个作业的最优加工顺序,以
实现
最小化总加工时间的目标。文章详细解析了算法步骤,并提供了具体示例与代码
实现
。
基于堆优化算法的柔性车间
调度问题
求解
本文围绕基于堆优化算法的柔性车间
调度问题
求解展开。介绍了柔性作业车间
调度问题
(FJSP),它是经典组合优化问题,目标是使所有作业完成时间最小化,包含
机器
选择和工序排序子问题,还给出约束条件。阐述堆优化算法,用Brandimarte数据集测试,并给出Matlab代码。
贪心算法之多机
调度问题
本文介绍了一种解决多机
调度问题
的贪心算法,该问题是NP完全问题,旨在通过最长处理时间作业优先策略
实现
近似求解。文章提供了一个具体的实例,包括源代码,展示了如何通过贪心策略分配任务给多台
机器
以达到较短的总处理时间。
数据结构与算法
33,025
社区成员
35,335
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章