图的搜索算法.ppt
《图的搜索算法.ppt》由会员分享,可在线阅读,更多相关《图的搜索算法.ppt(155页珍藏版)》请在三一办公上搜索。
1、第五章 图的搜索算法,51 图搜索概述 511 图及其术语 512 图搜索及其术语52 广度优先搜索 521 算法框架 522 广度优先搜索的应用,上一页 下一页 返回首页,图是一种限止最少的数据结构,因此更接近现实,实际问题中很多数据关系都可以抽象成图,相关问题则可利用图的基本算法进行求解,很早就有专门研究图的是一门数学学科“图论”;其中的计算问题包括图的搜索、路径问题、连通性问题、可平面性检验、着色问题、网络优化等。图论中的著名算法有:求最小生成树的Kruskal算法、求最短路径的Dijkstra算法和Floyd算法、求二部图最大匹配(指派问题)的匈牙利算法、求一般图最大匹配的Edmond
2、s“花”算法、求网络最大流和最小割的算法等。其中的一些算法在数据结构课程中已经学习过了。,1显式图与隐式图,在路径问题、连通性问题、可平面性检验、着色问题和网络优化等问题中,图的结构是显式给出的,包括图中的顶点、边及权重,这类图我们称为显式图,也就是一般意义上的图。,隐式图是由问题的初始结点,为了求解或求证问题,根据题目的规则(一般是由题目的意思隐含给出的),也就是生成子结点的约束条件,逐步扩展结点,直到得到目标结点为止的一个隐式的图。,511 图及其术语,2.显式图的常用术语,如图5-1所示的,均为显式图(Graph)。图中的这些点(v1,v2,vn)被称为顶点(vertex)或结点,连接顶
3、点的曲线或直线称为边(edge)。通常将这种由若干个顶点以及连接某些顶点的边所组成的图形称为图,顶点通常被称作是图中的数据元素.,上一页 下一页 返回首页,图,带权图:j即图5-2给图 5-1中各图的边上附加一个代表性数据(比如表示长度、流量或其他),则称其为带权图。环(cycle):图5-1中 图中的 v 1点本身也有边相连,这种边称为环。有限图:顶点与边数均为有限的图,如图 5-1中的三个图均属于有限图。简单图:没有环且每两个顶点间最多只有一条边相连的图,如图 5-1中的 图。邻接与关联:当(v 1,v 2)E,或 E,即 v 1,v 2间有边相连时,则称 v 1和 v 2是相邻的,它们互
4、为邻接点(adjacent),同时称(v 1,v 2)或 是与顶点 v 1、v 2相关联的边。,上一页 下一页 返回首页,顶点的度数(degree):从该顶点引出的边的条数,即与该顶点相关联的边的数目,简称度。入度(indegree):有向图中把以顶点 v为终点的边的条数称为是顶点 v的入度。出度(outdegree):有向图中把以顶点 v为起点的边的条数称为是顶点 v的出度。终端顶点:有向图中把出度为 0的顶点称为终端顶点,如图 5-1中 图的 v 3。路径与路长:在图 G=(V,E)中,如果存在由不同的边(v i0,v i1),(v i1,v i2),(v in-1,v in)或是,)组成
5、的序列,则称顶点 v i0,v in是连通的,顶点序列(v i0,v i1,v i2,v in)是从顶点 v i0到顶点 v in的一条道路。路长是道路上边的数目,v i0到 v in的这条道路上的路长为 n。连通图:对于图中任意两个顶点 v i、v j V,v i、v j之间有道路相连,则称该图为连通图。如 5-1中的 图。网络:带权的连通图,如图 5-2所示。,3隐式图术语 1)子集树,当要求解的问题需要是在n 个元素的子集中进行搜索,其搜索空间树被称作子集树(subset tree)。这n个元素都有在子集中或被选取记为1,不在子集中或被舍去记为0,这样搜索空间为:(0,0,0,0),(0
6、,0,0,1),(0,0,1,0),(0,0,1,1),(1,1,1,1)。共2n 个状态。若表示为树形结构就是一棵有2n个叶结点的二叉树,对树中所有分支进行遍历的算法都必须耗时O(2n)。,上一页 下一页 返回首页,图5-3 n=3的子集树,上一页 下一页 返回首页,2)排列树,上一页 下一页 返回首页,当要求解的问题需要在n 元素的排列中搜索问题的解时,解空间树被称作排列树(permutation tree)。搜索空间为:(1,2,3,n-1,n),(2,1,3,n-1,n),(2,3,1,n-1,n),(2,3,4,1,n-1,n),(n,n-1,3,2,1)第一个元素有n 种选择,第二
7、个元素有n-1种选择,第三个元素有n-2种选择,第n个元素有1种选择,共计n!个状态。若表示为树形就是一个n度树,这样的树有n!个叶结点,所以每一个遍历树中所有节点的算法都必须耗时O(n!),上一页 下一页 返回首页,图5-3 n=4的部分子集树,4图的存储 1)邻接矩阵法,上一页 下一页 返回首页,邻接矩阵是表示顶点之间相邻关系的矩阵,设G=(V,E)是具有n个顶点的图,则G的邻接矩阵可定义为:Ai,j=1,若(Vi,Vj)或是E(G)中的边。Ai,j=0,若(Vi,Vj)或不是E(G)中的边。若G是网络,则邻接矩阵可定义为:Ai,j=Wij 若(Vi,Vj)或属于E(G);Ai,j=0或
8、若(Vi,Vj)或 不属于E(G);其中,Wij表示边上的权值,表示一个计算机允许的,大于所有边上权值的数;,上一页 下一页 返回首页,2)邻接表,上一页 下一页 返回首页 例1,对于图G中的每个结点Vi,把所有邻接于Vi的顶点Vj链成一个单链表,这个单链表就称为顶点Vi的邻接表。邻接表由边表和顶点两部分组成。边表为一个单链表,每个表结点均有两个域:邻接点域adjvex,存放与vi相邻接的顶点vj的序号j。链域next,将邻接表的所有表结点链在一起。顶点表为一数组,每个元素均有两个域:顶点域vertex,存放顶点vi的信息 指针域firstedge,vi的边表的头指针。对于无向图来说,Vi的邻
9、接表中每个表结点都对应于与Vi相关联的一条边,对于有向图来说,Vi的邻接表中每个表结点对应于Vi为始点射出的一条边。,图7.1,上一页 下一页 返回首页,图5-5 图5-1中(1)图的邻接表,512 图搜索及其术语,1穷举搜索与启发式搜索,穷举搜索是对图的最基本的搜索算法,是蛮力策略的一种表现形式。即不考虑给定问题的特有性质,按事先定好的顺序,依次运用规则,盲目搜索的方法。,启发式搜索是利用一些启发信息,提前判断出先搜索哪些状态可能尽快找到问题的解或某些情况不可能取到最优解,从而可以提前舍弃对这些状态的尝试。即考虑给定问题的特有性质,选用合适的细则,提高搜索的效率。,上一页 下一页 返回首页,
10、2相关概念和术语,上一页 下一页 返回首页,问题状态:树中的每一个结点确定所求解问题的一个问题状态。状态空间:由根结点到其它结点的所有路径(分支),就确定 了这个问题的状态空间。解状态:是这样一些问题状态S,对于这些问题状态,由根到S 的那条路径确定了这解空间中的一个元组。答案状态:是这样的一些解状态S,对于这些解状态而言,由 根到S的这条路径确定了这问题的一个解状态空间树:解空间的树结构又称隐式图。,活结点:如果已生成一个结点而它的所有儿子结点还没有全部生成,则这个结点叫做活结点。E-结点:当前正在生成其儿子结点的活结点叫E-结点(正 扩展的结点)。死结点:不再进一步扩展或者其儿子结点已全部
11、生成的生成结点就是死结点。,521 算法框架,1算法的基本思路,算法设计的基本步骤为:,1)确定图的存储方式;2)图的遍历过程中的操作,其中包括为输出问题解而进行的存储操作;3)输出问题的结论。,上一页 下一页 返回首页,2算法框架,上一页 下一页 返回首页 例1,从广度优先搜索定义可以看出活结点的扩展是按先来先处理的原则进行的,所以在算法中要用“队”来存储每个E-结点扩展出的活结点。为了算法的简洁,抽象地定义:queue为队列类型,InitQueue()为队列初始化函数,EnQueue(Q,k)为入队函数,QueueEmpty(Q)为判断队空函数,DeQueue(Q)为出队函数。实际应用中,
12、用数组或链表实现队列。开辟数组visited记录visited结点的搜索情况。在算法框架中以输出结点值表示“访问”。,1)邻接表表示图的广度优先搜索算法,int visitedn;/n 为结点个数/bfs(int k,graph head)int i;queue Q;edgenode*p;/定义队列/InitQueue(Q);/队列初始化/print(“visit vertex”,k);/访问源点vk/visitedk=1;EnQueue(Q,k);/vk已访问,将其入队。/while(!QueueEmpty(Q)/队非空则执行/i=DeQueue(Q);/vi出队为E-结点/p=headi.
13、firstedge;/取vi的边表头指针/while(pnull)/扩展E-结点/if(visitedp-adjvex=0)/若vj未访问过/print(“visitvertex”,p-adjvex);/访问vj/visitedp-adjvex=1;EnQueue(Q,p-adjvex);/访问过的vj人队/p=p-next;/找vi的下一邻接点/,2)邻接矩阵表示的图的广度优先搜索算法,上一页 下一页 返回首页,bfsm(int k,graph g100,int n)int i,j;CirQueue Q;InitQueue(Q);print(visit vertex,k);/访问源点vk/v
14、isitedk=1;EnQueue(Q,k);while(not QueueEmpty(Q)i=DeQueue(Q);/vi出队/for(j=0;jn;j+)/扩展结点/if(gij=1 and visitedj=0)print(visit vertex,j);visitedj=1;EnQueue(Q,j);/访问过的vj人队/,522 广度优先搜索的应用,【例1】已知若干个城市的地图,求从一个城市到另一个城市的路径,要求路径中经过的城市最少【例2】走迷宫问题,上一页 下一页 返回首页,【例1】已知若干个城市的地图,求从一个城市到另一个城市的路径,要求路径中经过的城市最少。算法设计:,上一页
15、下一页 返回首页 例2 例3,图的广度优先搜索类似与树的层次遍历,逐层搜索正好可以尽快找到一个结点与另一个结点相对而言最直接的路径。,如图5-6表示的是从城市A到城市H的交通图。从图中可以看出,从城市A到城市H要经过若干个城市。现要找出一条经过城市最少一条路线。,上一页 下一页 返回首页 例2 例3,图5-6,表5-1 图5-6的邻接距阵,具体过程如下:,1)将城市A(编号1)入队,队首qh置为0、队尾qe置为1。2)将队首所指的城市所有可直通的城市入队(如果这个城市在队中出现过就不入队),然后将队首加1,得到新的队首城市。重复以上步骤,直到城市H入队为止。当搜到城市H时,搜索结束。3)输出最
16、少城市线路。,上一页 下一页 返回首页 例2 例3,数据结构设计:,1)线性数组a作为活结点队的存储空间。2)队列的每个结点有两个成员:ai.city记录入队的城市,ai.pre记录该城市的前趋城市在队列中的下标,这样通过ai.pre就可以倒推出最短线路。3)设置数组visited记录已搜索过的城市。,上一页 下一页 返回首页 例2 例3,算法如下:,search()qh=0;qe=1;sq1.city=1;sq1.pre=0;visited1=1;while(qhqe)/当队不空/qh=qh+1;/结点出队/for(i=1;i=n,i+)/扩展结点/if(jzsqqh.cityi=1 and
17、 visitedi=0)qe=qe+1;/结点入队/sqqe.city=i;sqqe.pre=qh;visitedqe=1;if(sqqe.city=8)out();print(“No avaliable way.”);,上一页 下一页 返回首页 例2 例3,算法分析:时间复杂度是O(n);空间复杂性为(n2),包括图本身的存储空间和搜索时辅助空间“队”的存储空间。,out();/输出路径/print(sqqe.city);while(sqqe.pre0)qe=sqqe.pre;print(-,sqqe.city);,【例2】走迷宫问题,上一页 下一页 返回首页 例1 例3,迷宫是许多小方格构
18、成的矩形,在每个小方格中有的是墙(图中的“1”)有的是路(图中的“0”)。走迷宫就是从一个小方格沿上、下、左、右四个方向到邻近的方格,当然不能穿墙。设迷宫的入口是在左上角(1,1),出口是右下角(8,8)。根据给定的迷宫,找出一条从入口到出口的路径。,算法设计:,上一页 下一页 返回首页 例1 例3,从入口开始广度优先搜索可到达的方格入队,再扩展 队首的方格,直到搜索到出口时算法结束。对于迷宫中任意一点A(Y,X),有四个搜索方向:向上A(Y-1,X)向下A(Y+1,X)向左A(Y,X-1)向右A(Y,X+1)当对应方格可行(值为0),就扩展为活结点。,数据结构设计:,上一页 下一页 返回首页
19、 例1 例3,用数组做队的存储空间,队中结点有三个成员:行号、列号、前一个方格在队列中的下标。搜索过的方格不另外开辟空间记录其访问的情况,而是用迷宫原有的存储空间置元素值为“-1”时,标识已经访问过该方格。为了构造循环体,用数组fx=1,-1,0,0、fy=0,0,-1,1 模拟上下左右搜索时的下标的变化过程。,int jz88=1,0,0,0,1,0,1,1,0,1,1,1,1,0,1,1,0,1,1,0,0,1,1,1,0,1,0,1,1,1,0,1,1,1,0,1,1,1,0,0,0,0,1,1,1,1,1,0,1,1,1,0,0,1,1,0,1,1,1,1,0,0,0,1;struct
20、 intcity,pre;sq100;int qh,qe,i,visited100;main()int i,n=8;for(i=1;i=n,i=i+1)visitedi=0;search();,search()qh=0;qe=1;sq1.city=1;sq1.pre=0;visited1=1;while(qhqe)/当队不空/qh=qh+1;/结点出队/for(i=1;i=n,i=i+1)/扩展结点/if(jzsqqh.cityi=1 and visitedi=0)qe=qe+1;/结点入队/sqqe.city=i;sqqe.pre=qh;visitedqe=1;if(sqqe.city=8)
21、out();print(“No avaliable way.”);,out();/输出路径/print(sqqe.city);while(sqqe.pre0)qe=sqqe.pre;print(-,sqqe.city);算法分析:算法的时间复杂度并不复杂是O(n),算法的空间复杂性为O(n2),包括图本身的存储空间和搜索时辅助空间“队”的存储空间。,上一页 下一页 返回首页 例1 例3,深度优先遍历首先访问出发点v,并将其标记为已访问过;然后依次从v出发搜索v的每个邻接点w。若w未曾访问过,则以w为新的出发点继续进行深度优先遍历,直至图中所有和源点v有路径相通的顶点均已被访问为止。若此时图中仍
22、有未访问的顶点,则另选一个尚未访问的顶点作为新的源点重复上述过程,直至图中所有顶点均已被访问为止。,5.3 深度优先搜索,深度搜索与广度搜索的相近,最终都要扩展一个结点的所有子结点.区别在于对扩展结点过程,深度搜索扩展的是E-结点的邻接结点中的一个,并将其作为新的E-结点继续扩展,当前E-结点仍为活结点,待搜索完其子结点后,回溯到该结点扩展它的其它未搜索的邻接结点。而广度搜索,则是扩展E-结点的所有邻接结点,E-结点就成为一个死结点。,531 算法框架,1算法的基本思路 2算法框架,1算法的基本思路 算法设计的基本步骤为:1)确定图的存储方式;2)遍历过程中的操作,其中包括为输出问题解而进行的
23、存储操作;3)输出问题的结论。4)一般在回溯前的应该将结点状态恢复为原始状态,特别是在有多解需求的问题中。,2算法框架 1)用邻接表存储图的搜索算法 2)用邻接矩阵存储图的搜索算法,graph head100;dfs(int k)/head图的顶点数组/edgenode*ptr/ptr图的边表指针/visitedk=1;/*记录已遍历过*/print(“访问”,k);/*印出遍历顶点值*/ptr=headk.firstedge;/*顶点的第一个邻接点*/while(ptr NULL)/*遍历至链表尾*/if(visitedptr-vertex=0)/*如过没遍历过*/dfs(ptr-verte
24、x);/*递归遍历*/ptr=ptr-nextnode;/*下一个顶点*/算法分析:n图中有 n 个顶点,e 条边。扫描边的时间为O(e)。遍历图的时间复杂性为O(n+e)。返回,graph g100100,int n;dfsm(int k)int j;print(“访问”,k);visitedk=1;for(j=1;j=n;j+)/依次搜索vk的邻接点 if(gkj=1 and visitedj=0)dfsm(g,j)/(vk,vj)E,且vj未访问过,故vj为新出发点 算法分析:查找每一个顶点的所有的边,所需时间为O(n),遍历图中所有的顶点所需的时间为O(n2)。返回,532 深度优先搜
25、索的应用,【例1】走迷宫问题:问题同522【例2】1、算法设计:深度优先搜索,就是一直向着可通行的下一个方格行进,直到搜索到出口就找到一个解。若行不通时,则返回上一个方格,继续搜索其它方向。,2、数据结构设计:我们还是用迷宫本身的存储空间除了记录走过的信息,还要标识是否可行:mazeij=3 标识走过的方格;mazeij=2 标识走入死胡同的方格,这样,最后存储为“3”的方格为可行的方格。而当一个方格四个方向都搜索完还没有走到出口,说明该方格或无路可走或只能走入了“死胡同”。,3、算法int maze88=0,0,0,0,0,0,0,0,0,11,1,1,0,1,0,0,0,0,0,1,0,1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 搜索 算法
链接地址:https://www.31ppt.com/p-6257757.html