算法设计赛程问题.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
算法设计赛程问题

计算机算法设计与分析 一.赛程问题 1.赛程表的制定... … … 陈 2得分排序… … … … 姜 3场地和裁判的分配… … 张凤4重播选择… … … … 许玲 刘 5选出最优球员… … … 吴美2011-12-23 二.结论 三.参考资料 一.赛程问题 1.赛程表的制定 问题的背景 设有n=2^k个球队要进行球赛。现要设计一个满足以下要求的比赛日程表: 每个球队必须与其他n-1个选手各赛一次; 每个球队一天只能赛一次; 循环赛一共进行n-1天。 提出问题 每支球队不可以一天赛两场,在整场赛事前,先制定赛程表。避免重复。 c.解决问题 任何可以用计算机求解的问题所需的计算时间都与其规模有关。问题的规模越小,解题所需的计算时间往往也越短,从而也较容易处理。分治法的设计思想,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。如果原问题可分割成k个子问题,1k=n,且这些子问题都可解,并可利用这些子问题的解求出原问题的解,那么这种分治法就可行的。由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供方便。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而而其规模去不断缩小,最终使子问题缩小到很容易求出其解。 分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解这些子问题,然后将各子问题的解合并到原问题的解。 在用分治法设计算法时,最好是子问题的规模大致相同。即将一个问题分成大小相等的k个子问题的处理方法是行之有效的。一个分治法将规模为n的问题分成k个规模为n/m的子问题去解。 按分治策略,可以将所有的球队分成两半,n个球队的比赛日程表就可以通过为n/2个球队设计的比赛日程表来决定。递归的用这种一分为二的策略对球队进行分割,直到只剩下两只球队时,比赛日程表的制定就变得简单了。 算法描述如下 void Table(int k ,int* *a) { int n=1; for(int i =1;i=k;i++) n*=2; for(int i=1;i=n;i++) a[1][i]=i; int m=1; for(int s=1;s=k;s++){ n/=2; for(int t=1;t=n;t++) for(int i=m+1;i=2*m;i++) for(int j=m+1;j=2*m;j++){ a[i][j+(t-1)*m*2]=a[i-m][j+(t-1)*m*2-m]; a[i][j+(t-1)*m*2-m]=a[i-m][j+(t-1)*m*2];} m*=2; } } 2.分数排序 问题的背景 比赛胜一场得5分,负一场得0分,平一场得2分。每天更新赛后各球队的得分情况,根据最新得分总和,进行排名。 提出问题 排序的算法很多,我们从算法的平均时间复杂度、最坏时间复杂度以及算法所需的辅助存储空间三方面出发,对各种排序方法加以比较。找出最为合适的算法。就平均时间性能而言,快速排序是所有排序方法中最好的。 解决问题 快速排序的基本思想是:从待排序记录序列中选取一个记录,其关键字设为k1,然后将其余关键字小于k1的记录移到前面,而将关键字大于k1的记录移到后面,结果将待排序记录序列分为两个子表,最后将关键字为k1的记录插到其分界线的位置处。这个过程称为一趟快速排序。通过一次划分后,就以关键字为k1的记录为分界线,将待排序的序列分成了俩个子表,且前面子表中所有记录的关键字均不大于k1,而后面子表中的所有记录的关键字均不小于k1。对分割后的子表继续按上述原则进行分割,直到所有子表的表长不超过1为止,此时待排序记录序列就变成了一个有序表。算法描述如下: void QKSort(RecordType r[], int low, int high) { if(lowhigh) { pos=QKPass(r, low, high); QKSort(r, low, pos-1); QKSort(r, pos+1, high); } } int QKPass(RecordType r[], int left, int right) { x=r[left]; low=left; high=right; while(lowhigh) { while(lowhigh r[right].key=x.key) high--; if(lowhigh) { r[l

文档评论(0)

zhanghc + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档