【算法-分治策略应用】循环赛日程表问题.pdfVIP

【算法-分治策略应用】循环赛日程表问题.pdf

  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、Divid 将原始问题划分或者归结为规模较⼩的⼦问题(多数情况下是划分成2个) 2、Conquer 递归或迭代求解每个⼦问题 3、Combin 将⼦问题的解综合得到原问题的解 注意: 1、⼦问题与原始问题性质完全⼀样 2、⼦问题之间可彼此独⽴地求解 3、递归停⽌时⼦问题可直接求解 ⽐较典型的应⽤例⼦是“归并排序法”和“快速排序法”,详细可以参考屈婉玲等编著的《算法设计与分析》(第2版)P26和P37,此处不 再赘述。 ⼆、题⽬分析和建模 1. 问题描述 k 设有n=2 个选⼿要进⾏⽐赛,设计的⽐赛⽇程表需要满⾜以下要求: 1)每个选⼿必须与其他n-1个选⼿各赛⼀次; 2)每个选⼿⼀天只能赛⼀次; 3)整场循环赛⼀共进⾏n-1天。 2. 题⽬建模 将⽐赛⽇程表设计成n⾏×n-1列的⼀个表,表中第i⾏第j列的元素表⽰第i个选⼿在第j天所遇到的选⼿。 (1)⾸先看只有两个选⼿的⽇程表(k=1,n=2,2⾏×1列表格,循环赛进⾏1天): 表1 循环赛⽇程表(2⼈) (2)四个选⼿的⽇程表(k=2,n=4,4⾏×3列表格,循环赛进⾏3天): 2 ⾸先n=2 ,所以应该退化到求解两个2⼈循环赛的问题,⽇程表构建如下: 表1 循环赛⽇程表(2⼈) 表2 循环赛⽇程表(2⼈) 将表2抄在表1右侧构成表1*,将表1抄在表2右侧构成表2*,将表1*与表2*按次序上下拼接,构成表3: 表3 循环赛⽇程表(4⼈) 由于表1和表2中运动员完全不同,拼接之后每⼀⾏和每⼀列都不会存在两个相同号码,也就是说拼接后不会产⽣⼀个选⼿在同⼀天和另外⼀ 个选⼿⽐赛两次的情况,说明这种拼接是合理的。 (3)⼋个选⼿的⽇程表(k=3,n=8,8⾏×7列表格,循环赛进⾏7天) 3 n=2 ,⾸先应该退化到4⼈循环赛问题,再退化到2⼈循环赛问题,4⼈退化到2⼈已在 2)中详细描述,此处只说明如何退化到4⼈问题: 表3 循环赛⽇程表(4⼈) 表4 循环赛⽇程表(4⼈) 拼接⽅法与(2)中相同,构成表5: 表5 循环赛⽇程表(8⼈) 三、算法设计 (1)设计思想: k k k-1 设n=2 采⽤分治策略,将所有参加⽐赛的选⼿分成两部分,n=2 个选⼿的⽐赛⽇程表就可以通过两个n=2 个选⼿的⽐赛⽇程表来决 定。递归执⾏这样的分隔,直到只剩下两个选⼿,可以直接构造⽐赛⽇程表。⽐赛⽇程表就可以通过这样的分治策略来逐步构建。 整个过程可以看作4个部分: k-1 1)求左上⾓⼦表:左上⾓⼦表是前2 个选⼿的⽐赛前半程的⽐赛⽇程。 k-1 k-1 2)求左下⾓⼦表:左下⾓⼦表是剩余2 个选⼿的⽐赛前半程的⽐赛⽇程,这个⼦表中元素等于与左上⾓⼦表对应位置元素加上2 。 3)求右上⾓⼦表:等于左下⾓⼦表。 4)求右下⾓⼦表:等于左上⾓⼦表。 (2)伪代码: 输⼊:选⼿⼈数n设n恰好为2的k次⽅ 输出:⽐赛⽇程表A[1..n,1..n] 1. input n //输⼊选⼿⼈数 2. for i-1 to n //设置运动员的编号,⽐赛⽇程表的第1列为选⼿编号列 3. A[i,1]-i 4. end for 5. Procedure(1,n) //过程调⽤ 6. for i-1 to n 7. for j-1 to n 8. output A[i,j] //输出⽐赛⽇程表 9. end for 10. end for 过程调⽤:Procedure(i,k) //i表⽰起始⾏,k表⽰选⼿⼈数 1. if k=2 then //如果选⼿⼈数为2个,则可以直接处理输出 2. A[i+1,2]-A[i,1] 3. A[i,2]-A[i+1,1] 4. else

文档评论(0)

文库垃圾佬 + 关注
实名认证
文档贡献者

这个人很懒

1亿VIP精品文档

相关文档