算法设计与分析 第2版 第7章-贪心法.ppt

算法设计与分析 第2版 第7章-贪心法.ppt

  1. 1、本文档共99页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
求在最优调度下总时间,用f1累计M1上的执行时间(初始时f1=0);f2累计M2上的执行时间(初始时f2=0),最终f2即为最优调度下的消耗总时间。 对于最优调度方案best,用i扫描best的元素,f1和f2的计算如下: f1=f1+a[best[i]] f2=max{f1,f2}+b[best[i]] f1=f2=0 作业3:f1=0+4=4,f2=max{4,0}+14=18 作业1:f1=4+5=9,f2=max{9,18}+6=24 作业4:f1=9+8=17,f2=max{17,24}+7=31 作业2:f1=17+12=29,f2=max{29,31}+2=33 其实现采用如下结构体数组c: struct NodeType { int no; //作业序号 bool group; //1代表第一组N1,0代表第二组N2 int time; //a,b的最小时间 bool operator(const NodeType s) const { return times.time; //用于按time递增排序 } }; 如 //问题表示 int n=4; int a[N]={5,12,4,8}; //对应M1的时间 int b[N]={6,2,14,7}; //对应M2的时间 struct NodeType { int no; //作业序号 bool group; //1代表第一组N1,0代表第二组N2 int time; //a,b的最小时间 bool operator(const NodeType s) const { return times.time; //按time递增排序 } }; //求解结果表示 int best[N]; //最优调度序列 int solve() //求解流水作业调度问题 { int i,j,k; NodeType c[N]; for(i=0;in;i++) //n个作业中,求出每个作业的最小加工时间 { c[i].no=i; c[i].group=(a[i]=b[i]); //a[i]=b[i]对应第1组N1,a[i]b[i]对应第0组N2 c[i].time=a[i]=b[i]?a[i]:b[i]; //第1组存放a[i],第0组存放b[i] } sort(c,c+n); //c元素按time递增排序 void main() { printf(求解结果\n); printf( 总时间: %d\n,solve()); printf( 调度方案: ); for(int i=0;in;i++) printf(%d ,best[i]+1); printf(\n); } 求解结果 总时间: 33 调度方案: 3 1 4 2 【算法分析】算法的主要时间花费在排序上,所以时间复杂度为O(nlog2n)。比采用回溯法和分枝限界法求解更高效。 * * void solve() //求解多机调度问题 { NodeType e; if (n=m) { printf(为每一个作业分配一台机器\n); return; } sort(A,A+n); //按t递减排序 priority_queueNodeType qu; //小根堆 for (int i=0;im;i++) //先分配m个作业,每台机器一个作业 { A[i].mno=i+1; //作业对应的机器编号 printf( 给机器%d分配作业%d,执行时间为%2d,占用时间段:[%d,%d]\n, A[i].mno,A[i].no,A[i].t,0,A[i].t); qu.push(A[i]); } for (int j=m;jn;j++) //分配余下作业 { e=qu.top(); qu.pop(); //出队e printf( 给机器%d分配作业%d,执行时间为%2d,占用时间段:[%d,%d]\n, e.mno,A[j].no,A[j].t,e.t,e.t+A[j].t); e.t+=A[j].t; qu.push(e); //e进队 } } 【算法分析】排序的时间复杂度为O(nlog2n),两次for循环的时间合起来为O(n),所以本算法的时间复杂度为O(nlog2n

文档评论(0)

dllkxy + 关注
实名认证
内容提供者

本文库主要涉及建筑、教育等资料,有问题可以联系解决哦

版权声明书
用户编号:5213302032000001

1亿VIP精品文档

相关文档