网站大量收购闲置独家精品文档,联系QQ:2885784924

广度优先搜索(陈鹏).ppt

  1. 1、本文档共37页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
广度优先搜索 引入问题——why queue 搜索——广度优先搜索 队列的维护 什么是队列? 队列 队列是限定在一端进行插入,另一端进行删除的特殊的线性表。 删除的一端称为队首,插入的一端称为队尾。 具体事例:排队买票,后来的人排在队尾(插入),队首的人离开(删除)。 队列的特点 线性 队头读 队尾写 先进先出 队列的定义 静态—数组 Type arr=array[1..n ] of integer; queue=record vec:arr; front,rear:integer; end; Var q:queue; Var queue:arr; front,rear:integer; 队列的基本操作 操作 静态数组(A,f,r) 建立空队列 测试队列是否为空 入队(insert) 出队(dele) 尾插法 F:=0;r:=0 Fr R:=r+1;a[r]:=x; If f=0 then f:=1; X:=a[f];f:=f+1; 和约定有关 深度、广度优先搜索 在搜索过程中,我们把每个状态看作是结点,把状态之间的联系看做是边,这样我们就可以得到一棵树,我们把这棵树称为“搜索树”。 深度、广度优先搜索 初始状态对应根结点,目标状态对应目标结点。问题的一个解就是一条从根结点到目标结点的路径。 对“搜索树”的搜索算法类似于树的遍历,通常有两种不同的实现方法: 广度优先搜索(BFS) 深度优先搜索(DFS) 广度优先搜索 BFS每次都先将搜索树某一层的所有节点全部访问完毕后再访问下一层,因此也被称作“按层搜索”。 广度优先搜索 一般来说,BFS使用队列来实现。 BFS一般用来求最优解。 在存储数据时,除了需要存储当前状态外,还需要存储当前状态的父状态以及由父状态转换过来所执行的操作。 Data OP Pre 广度优先搜索算法 初始状态入队 op := 1 对队首状态进行操作op,得到新状态; 检查此状态是否出现过,如未出现则将此状态入队; 如果此状态为目标状态,则输出; 如所有操作都已完成,则队首出队,否则op := op + 1,返回(3)。 广度优先搜索的程序框架 procedure bfs; begin head := 0; tail := 1; data[tail].data := 初始状态; data[tail].op := 0; data[tail].pre := 0; flag := false; repeat inc(head); while data[head]还可以扩展 do begin new := op(data[head].state); if new已经出现 then continue; inc(tail); data[tail].data := new; data[tail].op := op; data[tail].pre := head; if new是目标状态 then begin flag := true; break; end; end; until (tail = head) or flag if flag then output else writeln(No Answer); end; DFS or BFS 搜索方式 时间 空间 适用问题 DFS O(ck) O(k) 必须完全遍历或不要求解的深度最小 BFS O(cd) O(cd) 解靠近根或要求解的深度最小 k表示树的深度;d表示解的深度;d≤k 从入口(1)到出口(17)的可行路线图中,数字标号表示关卡: 现将上面的路线图,按记录结构存储如下 : 队列应用 请设计一种能从存储数据中求出从入口到出口经过最少关卡路径的算法。 从列表中可以看出出口关卡号(17)的被访问路径最短的是:(17)←(16)←(19)←(18)←(1)←开始 关卡(最短路径) ? I:=1 ; WHILE NO[I] 17 DO I:=I+1 ; REPEAT WRITE(‘(‘,NO[I],’)’); WRITE(‘←’); I:=PRE[I] ; UNTIL I=0; 编一个程序,找出一条通过迷宫的路径。这里有黑色方块的单元表示走不通,将一只老鼠从入口

文档评论(0)

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

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

1亿VIP精品文档

相关文档