搜索问题中的常见优化技巧-read.docVIP

  1. 1、本文档共10页,可阅读全部内容。
  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文档。上传文档
查看更多
搜索问题中的常见优化技巧-read

信息学竞赛中搜索问题的常见优化技巧 重庆一中 黄晓愉 【摘要】结合例题分析归纳了信息学竞赛中解决搜索问题所常用的思考方法与解题方法,从深度优先搜索和广度优先搜索两个方面探讨了提高程序效率的适用技巧。 【关键词】1信息学;2搜索顺序;3搜索对象;4Hash表 5剪枝。 在信息学竞赛中解决搜索问题通常采用两种方法进行,即:深度优先搜索和广度优先搜索。 一、深度优先搜索的优化技巧 我们在做题的时候,经常遇到这类题目——给出约束条件,求一种满足约束条件的方案,这类问题我们叫它“约束满足”问题。对于约束满足问题,我们通常可以从搜索的顺序和搜索的对象入手,进而提高程序的效率。 搜索的顺序及对象:   在解决约束满足问题的时候,题目给出的约束条件越强,对于搜索中的剪枝就越有利。之所以深度优先搜索的效率在很大程度上优于穷举,就是因为它在搜索过程中很好的利用了题目中的约束条件进行剪枝,达到提高程序效率的目的。 显然,在同样的一棵搜索树中,越在接近根接点的位置利用约束条件剪枝效果就越好。如何在搜索中最大化的利用题目的约束条件为我们提供剪枝的依据,是提高深度优先搜索效率的一个很重要的地方。而不同的搜索顺序和搜索对象就直接影响到我们对于题目约束条件的运用。 下面,我们就从搜索的顺序和搜索的对象两方面来探讨一下不同的方法对程序效率的影响。 (1)搜索顺序的选择: 我们先来看一道比较简单的题目: (zju1937) 已知一个数列a0,a1......am其中 a0 = 1 am = n a0 a1 a2 ... am-1 am 对于每个k(1=k=m),ak=ai+aj (0 = i, j = k-1)i与j可以相等n的值,要求m的最小值(并不要求输出),及这个(可能存在多个数列,只输出任一个满足条件的就可以了)。ak=ai+aj(0=i,jk),所以我们在搜索的过程中可以采用由小到大搜索数列的每一项的搜索顺序进行试算。在一般搜索的时候我们习惯于从小到大依次搜索每个数的取值,但是在这到题目中按照这样的顺序搜索编程运算其结果(效率)十分不理想: N 10 20 30 40 50 60 70 80 90 100 200 300 400 500 用时 0.03 0.01 0.03 0.05 0.20 0.34 1.80 1.80 8.91 10.1 Too long Too long Too long Too long 由于题目要求的是m的最小值,也就是需要我们尽快得到数n,所以每次构造的数应当是尽可能大的数,根据题目的这个特性,我们将搜索顺序改为从大到小搜索每个数,新程序的效率如下: N 10 20 30 40 50 60 70 80 90 100 200 300 400 500 用时 0.01 0.01 0.01 0.01 0.01 0.01 0.03 0.01 0.03 0.03 0.13 1.48 1.5 22.88   显然,后一种搜索顺序得到的程序效率大大地优于第一种搜索顺序得到的程序。 当然,这道题还有很大的优化余地,但是搜索顺序这种思想在搜索的题目中是广泛运用的。也许大家会觉得这种单一的运用搜索顺序来优化程序的方法很普通,但是这种看似简单的方法在考试中出现得也不少,例如IOI2000中的BLOCK,只要将木块从大到小经过旋转和反转后,依次放入进行搜索,对于比赛中的数据就可以得到满分。最近的一次出现是NOI2005中的智慧珠,同样的只是将珠子从大到小进行搜索,不加任何其他剪枝就可以在比赛中获得90分。 可见,选择合适的搜索顺序对于提高程序的效率是编程设计最有效的技巧之一,运用良好的搜索顺序来对搜索题目进行优化是一个性价比很高的算法。 (2)搜索对象的选择: 让我们再来看看下面一道题:(USACO-weight) 已知原数列a1,a2……an中前1项,前2项,前3项……前n项的和,以及后1项,后2项,后3项……后n项的和,但是所有的数据都已经被打乱了顺序,还知道数列中的数存在集合S中,求原数列。当存在多组可能数列的时候求左边的数最小的数列。 其中n=1000,S∈{1..500} 例如,假如原数列为1 1 5 2 5,S={1,2,4,5}那么知道的值就是 (1 2 7 9 14 5 7 12 13 14) 1 = 1 5 = 5 2 = 1+1 7 = 2+5 7 = 1+1+5 12 = 5+2+5 9 = 1+1+5+2 13 = 1+5+2+5 14 = 1+1+5+2+5 14 = 1+1+5+2+5 分析 因为题目中的S∈{1..500},

文档评论(0)

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

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

1亿VIP精品文档

相关文档