算法與数据结构讲义三(搜索算法).docVIP

  1. 1、本文档共13页,可阅读全部内容。
  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文档。上传文档
查看更多
算法與数据结构讲义三(搜索算法)

第十三课 搜索算法 12.0 搜索树 12.1 搜索算法的基本原理 12.2 广度优先搜索 12.3 深度优先搜索 12.4 练习 12.0 搜索树 引例:在一个4*4的棋盘上的左下角有一个马,按照国际象棋的规则,将这个马跳到右 * 上角。 分析:首先建立棋盘的坐标,我们以左下角为(1,1),以右上角、 为(4,4)。按照马的移动规则,假定当前马的位置坐标为 (x,y),则移动方法有: (1)x’=x+1; y’=y+2 (2)x’=x+1; y’=y-2; (3)x’=x+2; y’=y+1; (4)x’=x+2; y’=y-1; (5)x’=x-1; y’=y+2; (6)x’=x-1; y’=y-2; (7)x’=x-2; y’=y+1; (8)x’=x-2; y’=y-1 可以建立搜索树如下: 图中表示:由(1,1)可以跳到(2,3)和(3,2)两个点(其它移动规则由于边 界限制无法到达);(2,3)又可以跳到(1,1)、(4,4)、(4,2)、(3,1)四个点,(3,2) 可以跳达(1,1)、(1,3)、(2,4)、(4,4)四个点,……。 搜索树:按照数据元素的产生式规则建立起来的数据元素逻辑关系。 特点:(1)数据之间的逻辑关系为一对多。 (2)每个结点数据的下一级子结点是由该结点的产生式规则生成。 (3)目标结点(答案数据)一定在搜索树中能够出现。 (4)对于数据规模较大的问题,搜索树的结点将是海量的。 (5)搜索树可能是无穷无尽的(因为很多结点回重复出现)。 12.1 搜索算法的基本原理: 从搜索树中可以看出,一个问题从起始状态,通过穷举的方式建立起搜索树后,目标状态一定能在搜索树中出现。因此,只要建立起搜索树,就可以在其中搜索到目标状态(数据、路径、位置等)。 搜索算法要解决的问题: 产生式规则:由当前状态按照问题的需求和限制,生成新的状态的方法集合。 搜索树的生成和存储:一般采用一边生成,一边搜索;存储方法有:集合、栈。 搜索的方法:按行搜索:即从上到下,逐层搜索 双向按行搜索:一边从上往下(起始状态到中间状态),一边从下往上逐 层搜索(从目标状态到中间状态),找到相同的中间状态 即可。 回朔法搜索:优先向更深层结点查找,走不通则换一条路,无法换则退回 到上一层。 搜索状态的减少:在生成搜索树时,对于已搜过的中间状态的再次出现,是否需要 再次加入到树中重新搜索。 12.2 广度优先搜索(bfs) 又称宽度优先搜索,是一种从搜索树的根结点开始,沿着树的宽度遍历树的结点。如果所有节点均被访问,则算法中止。一般用于求从起始状态到目标状态所需的最少步骤数。 算法过程: 1、首先将根结点放入队列中。 2、从队首取出一个结点,按照产生式规则逐个生成新的结点数据,对新数据: 如果如果是目标结点,则结束算法并返回结果。 如果不是目标结点,则检查它是否已在搜索树中出现过,未出现就将它作为尚未检查过的子结点加入到队列的队尾(特殊情况下,也有已出现过的结点重新入队的)。 3、重复步骤2。 4、若队列为空,表示整张图都检查过了,即目标无法达到,结束算法并返回“找 不到目标”的信息。 算法细化: 用哈希数组判断新生成的结点数据是否已出现过。 队列经常要多开一行,记录新结点的父亲(即该结点由上一层的哪个结点扩展而来),用于最后输出过程。 如数据规模过大,需要使用循环队列(后果是无法记录父亲)。 算法框架: function creat(i) begin case i of 1:creat:=按照第一产生式规则生成新状态数据; 2:creat:=按照第二产生式规则生成新状态数据; . . . end; end; //////////////////////////////////////////////////////////////// procedure bfs; begin join(起始状态); while not(队空) do begin 当前处理状态:=deq; for i:=第一产生式规则 to 最大产生式规则 do begin 新状态:=creat(i);

文档评论(0)

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

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

1亿VIP精品文档

相关文档