a(lecture_09)搜索入门080427_第1页
a(lecture_09)搜索入门080427_第2页
a(lecture_09)搜索入门080427_第3页
a(lecture_09)搜索入门080427_第4页
a(lecture_09)搜索入门080427_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、ACM程序设计程序设计杭州电子科技大学 刘春英2022-1-102上周,上周,你你 了吗?了吗?参赛2022-1-103每周一星(每周一星(8):):gaojie 2022-1-104第九讲第九讲一招制敌之搜索题一招制敌之搜索题2022-1-105根据“信息学初学者之家”网站的统计,Ural(俄罗斯的Ural州立大学的简称 ,有名的Ural Online Problem Set 就是该校的系统)的题目类型大概呈如下的分布:搜索 动态规划 贪心 构造 图论约10% 约15% 约5% 约5% 约10%计算几何 纯数学题 数据结构 其它 约5% 约20% 约5% 约25% 统计信息:统计信息:202

2、2-1-106摘自摘自ACMACM竞赛之新人向导竞赛之新人向导 “算法中最基本和常用最基本和常用的是搜索,这里要说的是,有些初学者在学习这些搜索基本算法是不太注意剪枝,这是十分不可取的,因为所有搜索的题目给你的测试用例都不会有很大的规模,你往往察觉不出程序运行的时间问题,但是真正的测试数据一定能过滤出那些没有剪枝的算法。实际上参赛选手基本上都会使用常用的搜索算法,题目的区分度往往就是建立在诸如剪枝之类的优化上了。 ”引言引言2022-1-107什么是搜索算法呢?什么是搜索算法呢?搜索算法是利用计算机的高性能来有目的地穷举一个问题的部分或所有的可能情况,从而求出问题的解的一种方法。搜索过程实际上

3、是根据初始条件和扩展规则构造一棵解答树并寻找符合目标状态的节点的过程。2022-1-108预热一下:二分查找预热一下:二分查找2 3 4 5 6 8 12 20 32 45 65 74 86 95 100headmidtail2022-1-109查找示意图:查找示意图:A1A15A1A7A9A15A1A3A5A7A1A1A3A32022-1-1010思考:思考:n1 1、在一百万个元素里查找某个、在一百万个元素里查找某个元素大约需要比较多少次?元素大约需要比较多少次?n2 2、时间复杂度:、时间复杂度:O(logN)O(logN)2022-1-1011举例分析举例分析从简单的字符串搜索讲起从简

4、单的字符串搜索讲起2022-1-1012Sample InputSample Input2 23 3ABCDABCDBCDFFBCDFFBRCDBRCD2 2roseroseorchidorchidSample OutputSample Output2 22 2HDOJ_1238 HDOJ_1238 SubstringsSubstrings 2022-1-1013题目分析:题目分析:n这是一道入门级别的搜索题,基本思想这是一道入门级别的搜索题,基本思想比较简单,但是如果用比较简单,但是如果用最朴素的算法最朴素的算法,可能会超时如何降低算法的复杂度呢?可能会超时如何降低算法的复杂度呢?n下面的算

5、法如何:下面的算法如何:n先将字符串按长度从短到长排序,枚举先将字符串按长度从短到长排序,枚举最短的字符串的子串,判断是否都是别最短的字符串的子串,判断是否都是别的字符串的子串,求出最大长度即可。的字符串的子串,求出最大长度即可。2022-1-1014说明:说明:本题除了可以练习基本搜索算法,也是练习字符串处理的好题目,题中用到的相关知识点有:n求反串n求子串n字符串查找n求字符串长度强烈推荐!强烈推荐!2022-1-1015再来一道数值型搜索题再来一道数值型搜索题2022-1-1016Sample InputSample Input5 1 299999 999 9991680 5 16197

6、0 1 12002 4 110 0 0Sample OutputSample Output2 2313 31323 7343 4337 53HDOJ_1239 HDOJ_1239 2022-1-1017获取有用信息获取有用信息na.a.给定整数给定整数m,a,b(4 m = 100000 and m,a,b(4 m = 100000 and 1 = a = b = 1000)1 = a = b = 1000)nb.b.需要找到两个数需要找到两个数( (不妨设为不妨设为p,q)p,q)满足以下满足以下条件:条件: p,qp,q均为质数;均为质数; p p* *q=m;q=m; a/b = p/q

7、 = 1; a/b = p/q = 1;nc.c.输出所有满足以上条件的输出所有满足以上条件的p,qp,q中乘积最大中乘积最大的一对的一对p,qp,q2022-1-1018算法分析算法分析n1.典型的搜索从所有可能的p,q中寻找满足条件的一对n2.p,q的要求p,q均为质数,且p=q=100000;n3.按上述思想流程应为:a.从1100000中搜出质数b.两层循环,试遍所有的组合(p,q可能相等)c.每种组合去判断是否符合条件,如是,将p*q与当前最大值比较,判断,保存2022-1-1019面临的问题:面临的问题:n超时!n从1100000的质数运算约为1e+8,而这只是准备工作。n因此,如

8、不加以分析简化此题无法在规定时间内出解2022-1-1020深入分析:深入分析:np,qp,q的范围其实可在的范围其实可在250000(why?)250000(why?)n然而,这是最小的范围吗?然而,这是最小的范围吗?n考虑大于考虑大于1000010000的某个质数,不妨设为的某个质数,不妨设为Q Q,另一个,另一个质数为质数为P P,则:,则:n如果如果P10P10,P/Q0.001P/Q10P10,P P* *Q100000Q100000n而考虑到而考虑到a,ba,b的取值范围的取值范围(1=a=b=1000)(1=a=b=1000)n可知可知min(a/b)=0.001min(a/b)

9、=0.001n同时,要求:同时,要求: p p* *q=m=100000q=m=0;i-)for (i=num-1;i=0;i-) for (j=i;j=num-1;j+)for (j=i;jm | ajIf ( ajm | aj* *aim | ( (double)ai/aj)m | ( (double)ai/aj)10 -1或或1-0 1-0 必然是奇数步必然是奇数步 n 0-0 0-0 走走1-1 1-1 必然是偶数步必然是偶数步 结论:结论:所以当遇到从 0 走向 0 但是要求时间是奇数的,或者, 从 1 走向 0 但是要求时间是偶数的 都可以直接判断不可达!2022-1-1027这个

10、题目没问这个题目没问题了吧?题了吧?2022-1-1028思考:思考:n求某给定时间求某给定时间以内能否以内能否找到出口找到出口n找到出口的最短时间找到出口的最短时间n条件变为可以停留条件变为可以停留2022-1-1029四、深度优先搜索四、深度优先搜索基本思想:基本思想:从初始状态S开始,利用规则生成搜索树下一层任一个结点,检查是否出现目标状态G,若未出现,以此状态利用规则生成再下一层任一个任一个结点,再检查是否为目标节点G,若未出现,继续以上操作过程,一直进行到叶节点(即不能再生成新状态节点),当它仍不是目标状态G时,回溯到上一层结果,取另一可能扩展搜索的分支。生成新状态节点。若仍不是目标

11、状态,就按该分支一直扩展到叶节点,若仍不是目标,采用相同的回溯办法回退到上层节点,扩展可能的分支生成新状态,一直进行下去,直到找到目标状态G为止。2022-1-1030DFSDFS算法算法(1 1)把起始节点)把起始节点S S线放到线放到OPENOPEN表中。表中。(2 2)如果)如果OPENOPEN是空表,则失败退出,否则继续。是空表,则失败退出,否则继续。(3 3)从)从OPENOPEN表中取最前面的节点表中取最前面的节点nodenode移到移到CLOSED CLOSED 表中。表中。(4 4)若)若nodenode节点是叶结点(若没有后继节点),节点是叶结点(若没有后继节点),则转向(则

12、转向(2 2)。)。(5 5)扩展)扩展nodenode的后继节点,的后继节点,产生全部后继节点,产生全部后继节点,并把他们放在并把他们放在OPENOPEN表的前面表的前面。各后继结点指针指。各后继结点指针指向向nodenode节点。节点。(6 6)若后继节点中某一个是目标节点,则找到一)若后继节点中某一个是目标节点,则找到一个解,成功退出。否则转向(个解,成功退出。否则转向(2 2)循环。)循环。2022-1-1031三、广度优先搜索三、广度优先搜索基本思想基本思想:从初始状态S开始,利用规则,生成所有可能的状态。构成树的下一层节点,检查是否出现目标状态G,若未出现,就对该层所有状态节点,分

13、别顺序利用规则。生成再下一层的所有状态节点,对这一层的所有状态节点检查是否出现G,若未出现,继续按上面思想生成再下一层的所有状态节点,这样一层一层往下展开。直到出现目标状态为止。2022-1-1032BFS算法:算法:(1)把起始节点S线放到OPEN表中(2)如果OPEN是空表,则失败退出,否则继续。(3)在OPEN表中取最前面的节点node移到CLOSED 表中。(4)扩展node节点。若没有后继(即叶节点),则转向(2)循环。(5)把node的所有后继节点放在OPEN表的末端。各后继结点指针指向node节点。(6)若后继节点中某一个是目标节点,则找到一个解,成功退出。否则转向(2)循环。2

14、022-1-1033小结:小结:广度和深度优先搜索有一个很大的缺陷广度和深度优先搜索有一个很大的缺陷, ,就是他们都是在一个给定的状态空间中就是他们都是在一个给定的状态空间中穷举。这在状态空间不大的情况下是很穷举。这在状态空间不大的情况下是很合适的算法,可是当状态空间十分大,合适的算法,可是当状态空间十分大,且不预测的情况下就不可取了。他的效且不预测的情况下就不可取了。他的效率实在太低,甚至不可完成。率实在太低,甚至不可完成。所以,在这里再次强调所以,在这里再次强调“剪枝剪枝”!2022-1-1034附录:推荐搜索题:附录:推荐搜索题:n1010、1240、1241、1242n1072、 12

15、53 、 1312、1372(以上题目类似于1010)n1238、1239、1015、1016n1401、1515、15482022-1-1035附附:参考源码(参考源码(HDOJ_1010HDOJ_1010)n附录:hdoj_1010月下版n# include n# include n# include nchar map99; nint n,m,t,di,dj; nbool escape; nint dir42=0,-1,0,1,1,0,-1,0; nvoid dfs(int si,int sj,int cnt) n int i,temp; n if(sin|sjm|si=0|sj=0) return; n if(cnt=t&si=di&sj=dj) escape=1;n if(escape) return; n n temp=(t-cnt)-abs(si-di)-abs(sj-dj); n if(temp0|temp&1) return; n for(i=0;inmt)n n if(n=0&m=0&t=0) break; n int wall=0;n for(i=1;i=n;i+) n for(j=1;jmapij; n if(mapij=S) si=i; sj=j; n else if(mapij=D) di=i; dj=j; n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论