林希德necklace解题报告.pdfVIP

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

《Necklace解题报告》

金陵中学林希德

模型抽象

给定有向图G,顶点出度皆为1。从一指定顶点Start出发,沿有向边行走,最终必然落

6

入一个环,现在就问你该环长度多少?提示:行走能够到达的顶点不超过10。

常规做法是记录每一个遍历过的顶点并赋予它们时间标号,当再次遍历相同顶点的时候

就可以根据时间标号直接输出环的长度。常规做法的前提是顶点易于表达,但本题的量

65

高达10×10×byte,无论借助怎样高效的压缩电脑都不能承受重负,所以须另

辟它径,寻找无需保存necklace的算法。

如果已知A是环内顶点,那么保存A,然后沿A行走,当再次回到A时环的长度便顺

理成章地被求解出来,同时空间复杂度仅为两条necklace的量。于是,问题点集中在

如何找到环内顶点A。

算法1

66

“行走能够到达的顶点不超过10”是个非常有利的条件,它实际告诉我们第10步时

踏入的顶点已经遍历过。有且仅有环内顶点可以被多次遍历,所以很自然地,让一条

6步后所在地点一定是环内顶点。

狗从Start出发连续奔跑10

6

假设S是Start到环内顶点的最短距离,而T是环的长度,那么当S、T远小于10时,

算法1在环内转圈做了很多无用功。为避免上述缺陷,我们想出了——

算法2

安排一只狗和一只猫从指定顶点出发,猫每秒跑一步、狗每秒跑两步,当狗追上猫的时

候,猫狗所在点A一定是环内顶点,并且狗追猫的时间Step是T的整数倍。这个道理不难明

白,故这里不详细证明。

算法2亦有它的缺陷,就是复杂度常数因子较大,并且当Step非质数时,猫还需要从

A出发狂命奔跑T步来测试环的准确长度。当然,如果猫跑了T/a(a是T的最小质因子)

步后还没有遇上停留在点A的狗,那么猫没必要接着跑下去,因为环长一定是T。

如果v=Run(u)表示从u出发向前一步到达v的过程,那么算法1需要调用Run()函数

3T(S≤T)

6

恰好10+T次,算法2需要调用Run()函数最多T/a+次。两算法各有千秋,

您可能关注的文档

文档评论(0)

199****9598 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档