搜索入门081210

上传人:re****.1 文档编号:568907856 上传时间:2024-07-27 格式:PPT 页数:35 大小:213KB
返回 下载 相关 举报
搜索入门081210_第1页
第1页 / 共35页
搜索入门081210_第2页
第2页 / 共35页
搜索入门081210_第3页
第3页 / 共35页
搜索入门081210_第4页
第4页 / 共35页
搜索入门081210_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《搜索入门081210》由会员分享,可在线阅读,更多相关《搜索入门081210(35页珍藏版)》请在金锄头文库上搜索。

1、ACM程序设计程序设计7/27/20241每周一星(每周一星(10):):莫非莫非 7/27/20242第十一讲第十一讲一招制敌之搜索题一招制敌之搜索题7/27/20243根据“信息学初学者之家”网站的统计,Ural(俄罗斯的Ural州立大学的简称 ,有名的Ural Online Problem Set 就是该校的系统)的题目类型大概呈如下的分布:搜索 动态规划 贪心 构造 图论约10% 约15% 约5% 约5% 约10%计算几何 纯数学题 数据结构 其它 约5% 约20% 约5% 约25% 统计信息:统计信息:7/27/20244摘自摘自ACMACM竞赛之新人向导竞赛之新人向导 “算法中最基

2、本和常用最基本和常用的是搜索,这里要说的是,有些初学者在学习这些搜索基本算法是不太注意剪枝,这是十分不可取的,因为所有搜索的题目给你的测试用例都不会有很大的规模,你往往察觉不出程序运行的时间问题,但是真正的测试数据一定能过滤出那些没有剪枝的算法。实际上参赛选手基本上都会使用常用的搜索算法,题目的区分度往往就是建立在诸如剪枝之类的优化上了。 ”引言引言7/27/20245什么是搜索算法呢?什么是搜索算法呢?搜索算法是利用计算机的高性能来有目的地穷举一个问题的部分或所有的可能情况,从而求出问题的解的一种方法。搜索过程实际上是根据初始条件和扩展规则构造一棵解答树并寻找符合目标状态的节点的过程。7/2

3、7/20246预热一下:二分查找预热一下:二分查找2 3 4 5 6 8 12 20 32 45 65 74 86 95 100headmidtail7/27/20247查找示意图:查找示意图:A1A15A1A7A9A15A1A3A5A7A1A1A3A37/27/20248思考:思考:n1 1、在一百万个元素里查找某个、在一百万个元素里查找某个元素大约需要比较多少次?元素大约需要比较多少次?n2 2、时间复杂度:、时间复杂度:O(logN)O(logN)7/27/20249举例分析举例分析从简单的字符串搜索讲起从简单的字符串搜索讲起7/27/202410Sample Input23ABCDBC

4、DFFBRCD2roseorchidSample Output22HDOJ_1238 Substrings 7/27/202411题目分析:题目分析:n这是一道入门级别的搜索题,基本思想这是一道入门级别的搜索题,基本思想比较简单,但是如果用比较简单,但是如果用最朴素的算法最朴素的算法,可能会超时如何降低算法的复杂度呢?可能会超时如何降低算法的复杂度呢?n下面的算法如何:下面的算法如何:n先将字符串按长度从短到长排序,枚举先将字符串按长度从短到长排序,枚举最短的字符串的子串,判断是否都是别最短的字符串的子串,判断是否都是别的字符串的子串,求出最大长度即可。的字符串的子串,求出最大长度即可。7/2

5、7/202412说明:说明:本题除了可以练习基本搜索算法,也是练习字符串处理的好题目,题中用到的相关知识点有:n求反串n求子串n字符串查找n求字符串长度强烈推荐!强烈推荐!7/27/202413再来一道数值型搜索题再来一道数值型搜索题7/27/202414Sample Input5 1 299999 999 9991680 5 161970 1 12002 4 110 0 0Sample Output2 2313 31323 7343 4337 53HDOJ_1239 7/27/202415获取有用信息获取有用信息na.a.给定整数给定整数m,a,b(4 m = 100000 and m,a,

6、b(4 m = 100000 and 1 = a = b = 1000)1 = a = b = 1000)nb.b.需要找到两个数需要找到两个数( (不妨设为不妨设为p,q)p,q)满足以下满足以下条件:条件: p,qp,q均为质数;均为质数; p*q=m; p*q=m; a/b = p/q = 1; a/b = p/q = 1;nc.c.输出所有满足以上条件的输出所有满足以上条件的p,qp,q中乘积最大中乘积最大的一对的一对p,qp,q7/27/202416算法分析算法分析n1.典型的搜索从所有可能的p,q中寻找满足条件的一对n2.p,q的要求p,q均为质数,且p=q=100000;n3.按

7、上述思想流程应为:a.从1100000中搜出质数b.两层循环,试遍所有的组合(p,q可能相等)c.每种组合去判断是否符合条件,如是,将p*q与当前最大值比较,判断,保存7/27/202417面临的问题:面临的问题:n超时!n从1100000的质数运算约为1e+8,而这只是准备工作。n因此,如不加以分析简化此题无法在规定时间内出解7/27/202418深入分析:深入分析:np,qp,q的范围其实可在的范围其实可在250000(why?)250000(why?)n然而,这是最小的范围吗?然而,这是最小的范围吗?n考虑大于考虑大于1000010000的某个质数,不妨设为的某个质数,不妨设为Q Q,另

8、一个,另一个质数为质数为P P,则:,则:n如果如果P10P10,P/Q0.001P/Q10P10,P*Q100000P*Q100000n而考虑到而考虑到a,ba,b的取值范围的取值范围(1=a=b=1000)(1=a=b=1000)n可知可知min(a/b)=0.001min(a/b)=0.001n同时,要求:同时,要求: p*q=m=100000 p*q=m=0;i-) for (j=i;jm | aj*aim | ( (double)ai/aj)1 0 -1或或1-0 1-0 必然是奇数步必然是奇数步 n 0-0 0-0 走走1-1 1-1 必然是偶数步必然是偶数步 结论:结论:所以当遇

9、到从 0 走向 0 但是要求时间是奇数的,或者, 从 1 走向 0 但是要求时间是偶数的 都可以直接判断不可达!7/27/202425这个题目没问这个题目没问题了吧?题了吧?7/27/202426思考:思考:n求某给定时间求某给定时间以内能否以内能否找到出口找到出口n找到出口的最短时间找到出口的最短时间n条件变为可以停留条件变为可以停留7/27/202427四、深度优先搜索四、深度优先搜索基本思想:基本思想:从初始状态S开始,利用规则生成搜索树下一层任一个结点,检查是否出现目标状态G,若未出现,以此状态利用规则生成再下一层任一个任一个结点,再检查是否为目标节点G,若未出现,继续以上操作过程,一

10、直进行到叶节点(即不能再生成新状态节点),当它仍不是目标状态G时,回溯到上一层结果,取另一可能扩展搜索的分支。生成新状态节点。若仍不是目标状态,就按该分支一直扩展到叶节点,若仍不是目标,采用相同的回溯办法回退到上层节点,扩展可能的分支生成新状态,一直进行下去,直到找到目标状态G为止。7/27/202428DFS算法算法(1 1)把起始节点)把起始节点S S线放到线放到OPENOPEN表中。表中。(2 2)如果)如果OPENOPEN是空表,则失败退出,否则继续。是空表,则失败退出,否则继续。(3 3)从)从OPENOPEN表中取最前面的节点表中取最前面的节点nodenode移到移到CLOSED

11、CLOSED 表中。表中。(4 4)若)若nodenode节点是叶结点(若没有后继节点),则节点是叶结点(若没有后继节点),则转向(转向(2 2)。)。(5 5)扩展)扩展nodenode的后继节点,的后继节点,产生全部后继节点,并产生全部后继节点,并把他们放在把他们放在OPENOPEN表的前面表的前面。各后继结点指针指向。各后继结点指针指向nodenode节点。节点。(6 6)若后继节点中某一个是目标节点,则找到一个)若后继节点中某一个是目标节点,则找到一个解,成功退出。否则转向(解,成功退出。否则转向(2 2)循环。)循环。7/27/202429三、广度优先搜索三、广度优先搜索基本思想基本

12、思想:从初始状态S开始,利用规则,生成所有可能的状态。构成树的下一层节点,检查是否出现目标状态G,若未出现,就对该层所有状态节点,分别顺序利用规则。生成再下一层的所有状态节点,对这一层的所有状态节点检查是否出现G,若未出现,继续按上面思想生成再下一层的所有状态节点,这样一层一层往下展开。直到出现目标状态为止。7/27/202430BFS算法:算法:(1)把起始节点S线放到OPEN表中(2)如果OPEN是空表,则失败退出,否则继续。(3)在OPEN表中取最前面的节点node移到CLOSED 表中。(4)扩展node节点。若没有后继(即叶节点),则转向(2)循环。(5)把node的所有后继节点放在

13、OPEN表的末端。各后继结点指针指向node节点。(6)若后继节点中某一个是目标节点,则找到一个解,成功退出。否则转向(2)循环。7/27/202431小结:小结:广度和深度优先搜索有一个很大的缺陷广度和深度优先搜索有一个很大的缺陷, ,就是他们都是在一个给定的状态空间中就是他们都是在一个给定的状态空间中穷举。这在状态空间不大的情况下是很穷举。这在状态空间不大的情况下是很合适的算法,可是当状态空间十分大,合适的算法,可是当状态空间十分大,且不预测的情况下就不可取了。他的效且不预测的情况下就不可取了。他的效率实在太低,甚至不可完成。率实在太低,甚至不可完成。 所以,在这里再次强调所以,在这里再次

14、强调“剪枝剪枝”!7/27/202432附录:推荐搜索题:附录:推荐搜索题:nACM程序设计练习(11)简单搜索入门 n1010、1240、1241、1242n1072、 1253 、 1312、1372n1238、1239、1015、1016n1401、1515、1548、1597n21417/27/202433附附:参考源码(参考源码(HDOJ_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,-

15、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 else if(mapij=X) wall+; n n if(n*m-wall=t)n n coutNOendl;n continue;n n escape=0; n mapsisj=X;n dfs(si,sj,0); n if(escape) coutYESendl; n else coutNOendl; n n return 0; n 7/27/202434Welcome to HDOJThank You 7/27/202435

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号