国家集训队208论文集非完美算法初探——任.doc

国家集训队208论文集非完美算法初探——任.doc

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
国家集训队208论文集非完美算法初探——任

非完美算法的应用 ——河北唐山一中 任一恒 在平时的练习和考试中,我们都是尽量设计出完全正确的算法来解决问题。可是,实际中很多问题都是不能完美解决的,还有很多问题完美解决所需要的时间空间是根本无法接受的,所以,非完美的算法在实际中有着很广的应用。随着竞赛的题目越来越接近时际,以按优劣计分的题目为代表的考察非完美算法的题目越来越多,本文将讨论一些常用的非完美算法,希望给读者一些启发。 贪心算法 贪心算法的基本思路是从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到某算法中的某一步不能再继续前进时,算法停止。这样我们就得到了一个解,但是我们无法保证解是最优的。下面我们来看看贪心算法的表现。 例题1 NOI2007 追捕盗贼 某国家要追捕一个大盗,该国家的城市网络是一棵树,现在要你通过在某城市空降警察,让警察从某城市移动到有道路连接的城市,收回某警察来达到捕捉到盗贼的目的。用到的警察越少越好。 这道题的标准算法用到了很多高等知识,而且实现也是相当复杂的,在限定的时间内完美的解决这道题可以说是不能完成的任务,那么我们贪心算法在这道题上的表现如何呢? 我们不妨将原树想象为一棵有根的树,先在根结点空降一个警察,然后再次在根结点空降一个警察,让这个警察走向某棵子树,对这棵子树重复上面的过程,这样一棵子树一棵子树的排除,直到整棵树被排除。这里可以采取一个十分有效的优化就是在只剩一棵子树的时候,不用再安排新的警察,直接让一直守在根结点的那个警察走过去即可。所以不妨安排需要警察最多的那颗子树最后走,这样可以使结果得到很大优化。由于结点数不超过1000,所以我们可以枚举每个结点为根结点,找出其中需要警察最少的那个。 这个算法虽然存在着反例,但是由于那个十分有用的优化,可以使结果十分接近标准结果。通过数据试验的结果,有90%的结果和标准算法产生的结果一致,10%不一致的相差也是十分的小。可以说贪心算法在这道题目上发挥的很好。 贪心算法的优点在于实现容易,时间效率高,而其缺点则是在很多时候和标准算法的差距过大,精确度不够。所以我们要尽量优化贪心算法。优化贪心算法主要从两个方面来着手:1、多和完美算法结合,可以通过在部分使用完美算法而总体使用贪心的方法,通过贪心来结合若干部分的最优结果,尽量的接近真正最优的结果;2、贪心权值的选择,一个贪心算法的关键就是所选的策略,所以在选择权值时我们要尽可能的包含更多的能对全局产生影响的信息,使最终解能更加接近最优解。 二、随机算法 和上面的贪心算法相同,随机算法也是使用较多的一种算法。下面我们看。 如果没有度数的限制,那么这道题就是一个十分简单的最小生成树,有了这道题之后我们应该如何处理呢?我们不妨在考虑每个点连出的边选取不超过b的前提下用kruskal算法计算出一棵生成树。然后,能对结果产生优化的变化必然是用一条由度数已经达到b的点连出的一条边和某条边替换另一条由该度数达到b的点连出的边和另一条边。所以我们不妨随机一个度数达到b的点,它的一条被选中的边和未被选中的边交换,然后添加一条边,这时图中产生了一个环,在环中删除长度最长的边,如果结果比之前更优则保留结果。实践证明,此方法对于该题目能产生十分优秀的结果。 其实,随机算法很少单独应用,更多时候是和其它算法相结合,来使我们的非完美算法产生更加优秀的解。 三、抽样测试法 抽样,即从统计总体中,任意抽出一部分单位作为样本,并以其结果推算总体的相应指标。在某些问题中,需要让我们检查一系列测试元s,如果s中的某个测试元满足了某个条件,那么则说s满足了某个性质。在大度数情况下,我们需要将s中的测试元一个一个的进行验证,才能确定s是否满足该性质。但是如果s满足如下性质,要不s中不含满足条件的测试元,要不满足某条件的测试元很多,则可以直接选取几个具有代表性的测试元进行测试,通过这几个测试元来确定s是否满足该性质。 例题3 SPOJ919 Prime Checker 存在一个数列,第一项为1,以后各项根据公式ai=(ai-1+1234567890) mod 231推出,问这个数列的各项是否为质数。如果是质数的就输出0,是合数的就输出1,在时间限制内输出的越多,得到的分数越多。 看到这个题目,我们首先想到的是最为朴素的做法,先求出1-100000的素数表,然后对于每个数ai,用1-trunc(sqrt(ai))间质数去除这个数,如果某个质数能够整除ai,则ai为合数,如果均不能整除,则ai为质数。这种方法实现起来无疑是十分简便的,但是由于复杂度较高,所以在时间限制内仅能完成200000多一点的数。 下面我们来看一个使用抽样测试法的质数判断方法。对于一个整数n,设n-1=d*2^s(d是奇数),对于给定的基底a,如果存在a^d=1(mod n)或者对于0=

文档评论(0)

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

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

1亿VIP精品文档

相关文档