社区
数据结构与算法
帖子详情
求用最小堆实现机器调度问题
tjuwudi
2008-03-21 03:53:39
如题,所有的任务执行完成使所用的机器数最少,要求用最小堆实现,麻烦附上思路和源代码,谢谢!
Sample Input
3//3个任务
3 5//开始时间和结束时间
1 4
4 5
Sample Output
2//最少用两台机器
...全文
270
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)一台
机器
同一时刻只能处理一个作业; (2)一个作业不能同时在两台
机器
上处理; (3)作业i一旦运行,需要连续ti个时间单位。 [
实现
提示] (1)这是一个多
机器
调度最优解问题。输入:n个不同处理时间的作业...
贪心算法——多机
调度问题
设有n个独立的作业,由m台相同的
机器
进行加工处理。任何作业可以在任何一台
机器
上面加工处理,但未完工之前不允许中断处理。任何作业不能拆分成更小的作业。要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台
机器
加工处理完成。该类问题采用最长时间优先原则,将作业所需时间从大到小排序后依次分配给
机器
中当前工作时间最短的那台
机器
。多机
调度问题
是在有限的
机器
里通过选择来使任务完成所需的时间最短。
贪心算法解决多机
调度问题
——C++
实现
贪心算法解决多机
调度问题
——C++
实现
机器
调度算法的C++
实现
与优化
在信息技术飞速发展的今天,
机器
调度问题
作为计算机科学中一个重要且活跃的研究领域,已深入到各种计算任务的高效执行中。
机器
调度问题
的核心在于如何合理安排和调度计算资源,以满足不同场景下的性能要求。无论是在传统服务器环境中还是在新兴的云计算平台中,
机器
调度都扮演着至关重要的角色。本文将从
机器
调度问题
的基本概念出发,探讨其在实际应用场景中的重要性,以及如何通过不同的调度目标和策略来优化计算任务的执行效率。我们将首先对
机器
调度问题
进行一个基础的介绍,解释什么是
调度问题
,它在计算资源管理中的作用以及相关的术语。
数据结构与算法
33,028
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章