算法与数据结构讲义三(搜索算法)精品资料.doc
《算法与数据结构讲义三(搜索算法)精品资料.doc》由会员分享,可在线阅读,更多相关《算法与数据结构讲义三(搜索算法)精品资料.doc(37页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第十三课 搜索算法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、2; y=y-1113223122113314424114244112332232343233234123243213244可以建立搜索树如下:图中表示:由(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)目标结点(答案数据)一定在搜索树中能够出现
3、。 (4)对于数据规模较大的问题,搜索树的结点将是海量的。 (5)搜索树可能是无穷无尽的(因为很多结点回重复出现)。12.1 搜索算法的基本原理:从搜索树中可以看出,一个问题从起始状态,通过穷举的方式建立起搜索树后,目标状态一定能在搜索树中出现。因此,只要建立起搜索树,就可以在其中搜索到目标状态(数据、路径、位置等)。搜索算法要解决的问题:产生式规则:由当前状态按照问题的需求和限制,生成新的状态的方法集合。搜索树的生成和存储:一般采用一边生成,一边搜索;存储方法有:集合、栈。搜索的方法:按行搜索:即从上到下,逐层搜索双向按行搜索:一边从上往下(起始状态到中间状态),一边从下往上逐层搜索(从目标
4、状态到中间状态),找到相同的中间状态即可。回朔法搜索:优先向更深层结点查找,走不通则换一条路,无法换则退回到上一层。搜索状态的减少:在生成搜索树时,对于已搜过的中间状态的再次出现,是否需要再次加入到树中重新搜索。12.2 广度优先搜索(bfs)又称宽度优先搜索,是一种从搜索树的根结点开始,沿着树的宽度遍历树的结点。如果所有节点均被访问,则算法中止。一般用于求从起始状态到目标状态所需的最少步骤数。算法过程:1、首先将根结点放入队列中。 2、从队首取出一个结点,按照产生式规则逐个生成新的结点数据,对新数据: 如果如果是目标结点,则结束算法并返回结果。 如果不是目标结点,则检查它是否已在搜索树中出现
5、过,未出现就将它作为尚未检查过的子结点加入到队列的队尾(特殊情况下,也有已出现过的结点重新入队的)。 3、重复步骤2。4、若队列为空,表示整张图都检查过了,即目标无法达到,结束算法并返回“找不到目标”的信息。 算法细化:1、 用哈希数组判断新生成的结点数据是否已出现过。2、 队列经常要多开一行,记录新结点的父亲(即该结点由上一层的哪个结点扩展而来),用于最后输出过程。3、 如数据规模过大,需要使用循环队列(后果是无法记录父亲)。算法框架:function creat(i)begin case i of 1:creat:=按照第一产生式规则生成新状态数据; 2:creat:=按照第二产生式规则生
6、成新状态数据; . . . end;end;/procedure bfs;begin join(起始状态); while not(队空) do begin 当前处理状态:=deq; for i:=第一产生式规则 to 最大产生式规则 do begin 新状态:=creat(i); if 新状态=目标状态 then begin print; exit; end else if not(haxi新状态) then begin join(新状态); haxi新状态:=true; end; end; end;end;空间复杂度:线性队列:O(最大可能状态数)循环队列:O(最大可能状态数/2)时间复杂度
7、:最差情形下,BFS必须寻找所有到可能结点的所有路径。O(最大可能状态数)完全性:广度优先搜索算法具有完全性。只要目标存在,则BFS一定会找到。但是,若目标不存在,且问题规模为无限大,则BFS将不收敛(不会结束)。适用范围:广度优先搜索是找到第一个解的算法,即距离根结点的边数最少的解。如果所有边的权值都相等(即所有产生新状态的代价相同),则这个解也是最优解。例一:将一个马从M*N的棋盘的左下角跳到右上角,需要的最少步数是多少?分析:1、用一个1.2,1.m*n的数组作为工作队列,用于存储搜索树。 2、使用m*n的二维哈希数组判重。 3、生成搜索树的同时,记录父节点的序号和新结点的层数。 4、最
8、后从目标结点向起始结点回朔,用一个栈存储回朔的中间状态。例二:在一个2n+1的一维棋盘上,有n个黑色棋子和n个白色棋子,初始状态如图:规定棋子移动规则如下:1、 如果某棋子的旁边正好为空,这枚棋子可以移动到空位置上。2、 如果某棋子的一侧有棋子,二那枚棋子的另一侧为空位置,这枚棋子可以跳过那枚棋子到空位置上。问:最少经过多少步,可以将棋盘状态变成分析:1、 用2n+1位三进制数表示状态,如初始状态为:222201111,目标状态为111102222。转化为十进制进行存储,另记录空格位置。2、 产生式规则:将棋子移动转化为空格的移动。(1) 空格向左移动(2) 空格向右移动(3) 空格向左跳动(
9、4) 空格向右跳动3、 用一个1.32n+1的哈希数组判重。例三:八数码问题。在一个的九宫中有这个数及一个空格随机的摆放在其中的格子里,如图所示。现在要求实现这个问题:将该九宫格调整为如图2所示的形式。调整的规则是:每次只能将与空格(上、下、或左、右)相邻的一个数字平移到空格中。试编程实现这一问题的求解。 1238476512345678图一图二分析:1、字符串表达状态,另开一变量w记录空格位置。 2、空格移动规则:(1)向下移动:w=w+3。(2)向上移动:w=w-3。(3)向左移动:w=w-1。(4)向右移动:w=w+1。 3、用穷举法判重。(将来可以用排序二叉树判重)12.3 深度优先搜
10、索(dfs)深度优先搜索是从根结点出发,沿着树的深度遍历树的结点。如果当前新产生的结点还有以此为根的下一层结点,则沿此路继续下去,直到无法再深入访问时,回朔到上一层的结点,选另一条路继续深入访问。反复此过程,直到所有结点都被访问到为止。算法过程:1、 首先将根结点放入栈中。2、 取出栈顶结点,按照产生式规则生成新的结点数据,每产生一个:检查是否是目标结点,如果是且比保存的数据更优,刷新所保存的数据。检查该结点是否已搜过,如果是且比已保存的数据更优,则刷新所保存的数据,然后该结点进栈;如没有搜过,则保存数据并进栈。3、 转第二步。4、 如果栈空,则算法结束。细化说明:1、 一般用回朔法,利用递归
11、使用系统栈。2、 哈希数组不仅用于判断新结点是否出现过,还用于保存到达该结点时的中间数据。算法框架:procedure dfs(结点数据);var i:integer;begin for i:=产生式规则一 to 最大产生式规则 do begin 新结点数据:=creat(i); if (新结点数据没有搜到过)or(新结点数据虽已搜过但本次搜索结果更优) then begin更新新结点搜索结果;dfs(新结点数据); end;end;procedure dfs(结点数据);var i:longint;beginfor i:=1 to 最大产生式规则 dobegin新结点:=creat(i);i
12、f 新结点是目标结点 thenbegin传回新结点;t:=true;exit;end;if 新结点更优 thenbegin更新新结点数据;dfs(新结点);if t then exit;end;end;end;空间复杂度:O(最大状态数) (主要用于存储各结点搜索结果)时间复杂度:O(最大产生式规则数最大状态数)深度优先搜索的理论依据是建立在穷举基础上的,所以时间是几何级数级的,其优化剪枝是非常必要的,因此,深搜的主要算法设计是在于如何剪枝,如何既高效地抛弃不必要的子树,又不至于将最优解剪掉,将是深搜的最大难点。适用范围:在缺乏有效的数学方法、递推算法,不符合动态规划要求,也没有专用算法可以应
13、对,一般考虑使用深搜;得分情况将取决于优化剪枝的技巧(30-100分)。例一:有A、B、C、D、E 5本书,要分给张、王、刘、赵、钱5位同学,每人只能选1本。每个人都将自己喜爱的书填写在下表中。请你设计一个程序,打印出让每个人都满意的所有分书方案。 张00110 王11001 刘01100 赵00010 钱01001分析:1、朴素的穷举法:产生5本书的所有全排列,共有5!=120个,逐个检查各种排列是否符合所有人的要求,符合则输出,否则丢弃。穷举法的改进:例如产生一个全排列12345时,第一个数1表示将第一本书给小张。但从表中可以看出,这是不可能的,因为小张只喜欢第三、第四本书。也就是说,X
14、X X X这一类分法是不符合条件的。由此使我们想到,如果选定第一本书后,就立即检查一下是否符合条件,当发现第一个数的选择不符合条件时,就不必再产生后面的4个数了,这样做可以减少很多的运算量。换句话说,第一个数只在3和4中选择,这样就可以减少35的运算量。同理,在选定了第一个数后,其他4个数字的选择也可以用类似的方法处理,即选择第二个数后,立即检查是否符合条件。例如,第一个数选3,第二个数选4后,立即进行检查,发现不符合条件,就另选第二个数。这样就又把34XXX一类的分法删去了,从而又减少了一部分运算量。开始张钱赵王刘王刘王张王钱王赵王刘赵王刘张王刘钱王钱张王钱刘王钱赵王刘张赵王刘张钱王钱张赵王
15、钱张刘王钱赵张王钱赵刘王刘张赵钱3、 深搜法:建立如上搜索树,每一层分发一本书,未向下扩展的结点为当前层已不合理,故剪去。参考程序:program dfs1;const a:array1.5,1.5of boolean=(false,false,true,true,false), (true,true,false,false,true), (false,true,true,false,false), (false,false,false,true,false), (false,true,false,false,true);var outf:text; c:array1.5of integer;
16、 hx:array1.5of boolean;/procedure print;var i:integer;begin for i:=1 to 5 do case ciof 1:write(outf,张); 2:write(outf,王); 3:write(outf,刘); 4:write(outf,赵); 5:write(outf,钱); end;end;/procedure dfs(n:integer);var i:integer;begin for i:=1 to 5 do if (ai,n)and(not(hxi) then begin cn:=i; if n=5 then print
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法与数据结构讲义三搜索算法 精品资料 算法 数据结构 讲义 搜索 精品 资料
限制150内