没有合适的资源?快使用搜索试试~ 我知道了~
计算机算法基础贪心算法带有限期的作业问题
4星 · 超过85%的资源 需积分: 42 26 下载量 3 浏览量
2008-12-20
09:34:31
上传
评论 2
收藏 5KB TXT 举报
温馨提示
试读
6页
计算机算法基础贪心算法带有限期的作业问题,计算机算法基础
资源推荐
资源详情
资源评论
算法设计思想:如果J是作业的可行子集,那么可以使用下述规则来确定这些作业中的每一个作业的处理时间:若还没给作业i分配处理时间,则分配给它时间片[a-1,a],其中a应尽量取最大且时间片[a-1,a]是空的。此规则就是尽可能推迟对作业i的处理。于是,在将作业一个一个地装配到J中时,不必为接纳新作业而去移动J中那些已分配了时间片的作业。如果正被考虑的新作业不存在像上面那样定义的a,这个作业就不能计人J。各作业的效益值放在P[ ]中,并按效益值非增次序排列,期限值放在D[ ]中,F[ ]用于存放最大期限值,J[ ]用于存放最优解,Q[ ]用于存放作业的调度次序。
算法描述:
line procedure FJS(D,n,b,j, k)
//找最优解J=J(1),…J(K)//
//D(1),…..,D(n)是期限值,n>=1.作业已按//P(1)>=P(2)>=….P(n)被排序,//b=min{n,max{D(i)}}//
integer b,i,k,n,j ,l,D(n),J(n),F(0:b),p(0:b)
for i=1to n do //将树置初值//
F(i)ßi;p(i)ß-1
repeat
Kß0 //初始化J//
for iß1 to n do //使用贪心规则//
jß FIND(min(n,D(i) ))
if F(j)不为0 then kßk+1;J(K)ßi //选择作业 i//
lßFIND(F(j)-1); call UNION(l,j)
F(j)ßF(1)
endif
repeat
end FJS
算法分析:此算法的时间复杂度为:O(na(2n,n))(Ackerman函数的逆函数。);
它用于F和P的空间至多为2n个字节。
完整的代码(C语言):
#include<stdio.h>
#include<malloc.h>
int FIND(int *parent,int i)
{//查找含有元素i的树根,使用压缩规则去压缩由i到根j的所有结点
int j,k,t;
算法描述:
line procedure FJS(D,n,b,j, k)
//找最优解J=J(1),…J(K)//
//D(1),…..,D(n)是期限值,n>=1.作业已按//P(1)>=P(2)>=….P(n)被排序,//b=min{n,max{D(i)}}//
integer b,i,k,n,j ,l,D(n),J(n),F(0:b),p(0:b)
for i=1to n do //将树置初值//
F(i)ßi;p(i)ß-1
repeat
Kß0 //初始化J//
for iß1 to n do //使用贪心规则//
jß FIND(min(n,D(i) ))
if F(j)不为0 then kßk+1;J(K)ßi //选择作业 i//
lßFIND(F(j)-1); call UNION(l,j)
F(j)ßF(1)
endif
repeat
end FJS
算法分析:此算法的时间复杂度为:O(na(2n,n))(Ackerman函数的逆函数。);
它用于F和P的空间至多为2n个字节。
完整的代码(C语言):
#include<stdio.h>
#include<malloc.h>
int FIND(int *parent,int i)
{//查找含有元素i的树根,使用压缩规则去压缩由i到根j的所有结点
int j,k,t;
j=i;
while(parent[j]>0) j=parent[j];//找根
k=i;
while(k!=j){//压缩由i到根j的结点
t=parent[k];
parent[k]=j;
k=t;
}
return j;
}
void UNION(int *parent,int i,int j)
{//使用加权规则合并根为i和j的两个集合
int x;
x=parent[i]+parent[j];
if(parent[i]>parent[j]){//i的结点少
parent[i]=j;
parent[j]=x;
}
else{//j的结点少
parent[j]=i;
parent[i]=x;
}
}
int MIN(int n,int m)
{//求n和m的最小值
if(n>m) return m;
else return n;
}
while(parent[j]>0) j=parent[j];//找根
k=i;
while(k!=j){//压缩由i到根j的结点
t=parent[k];
parent[k]=j;
k=t;
}
return j;
}
void UNION(int *parent,int i,int j)
{//使用加权规则合并根为i和j的两个集合
int x;
x=parent[i]+parent[j];
if(parent[i]>parent[j]){//i的结点少
parent[i]=j;
parent[j]=x;
}
else{//j的结点少
parent[j]=i;
parent[i]=x;
}
}
int MIN(int n,int m)
{//求n和m的最小值
if(n>m) return m;
else return n;
}
剩余5页未读,继续阅读
资源评论
- sue9009132012-11-13不错 有用的资源 对于贪心算法有帮助
ggggwanghuan
- 粉丝: 1
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功