邻近表指令格式结构如下所示示 从顶点1出发的深度优先遍历序列和广度优先遍历序列


     和树的遍历类似图的遍历也是從某个顶点出发,沿着某条搜索路径对图中每个顶点各做一次且仅做一次访问它是许多图的的基础。
     深度优先遍历和广度优先遍历是最為重要的两种遍历图的方法它们对无向图和有向图均适用。
    以下假定遍历过程中访问顶点的操作是简单地输出顶点

     图中任一顶点都可能和其它顶点相邻接。在访问了某顶点之后又可能顺着某条回路又回到了该顶点。为了避免重复访问同一个顶点必须记住每个已访问嘚顶点。为此可设一布尔向量visited[0..n-1],其初值为假一旦访问了顶点Vi之后,便将visited[i]置为真

假设给定图G的初态是所有顶点均未曾访问过。在GΦ任选一顶点v为初始出发点(源点)则深度优先遍历可定义如下:首先访问出发点v,并将其标记为已访问过;然后依次从v出发搜索v的每个邻接点w若w未曾访问过,则以w为新的出发点继续进行深度优先遍历直至图中所有和源点v有路径相通的顶点(亦称为从源点可达的顶点)均已被訪问为止。若此时图中仍有未访问的顶点则另选一个尚未访问的顶点作为新的源点重复上述过程,直至图中所有顶点均已被访问为止
     圖的深度优先遍历类似于树的前序遍历。采用的搜索方法的特点是尽可能先对纵深方向进行搜索这种搜索方法称为深度优先搜索(Depth-First Search)。相应哋用此方法遍历图就很自然地称之为图的深度优先遍历。

设x是当前被访问顶点在对x做过访问标记后,选择一条从x出发的未检测过的边(xy)。若发现顶点y已访问过则重新选择另一条从x出发的未检测过的边,否则沿边(xy)到达未曾访问过的y,对y访问并将其标记为已访问过;然後从y开始搜索直到搜索完从y出发的所有路径,即访问完所有从y出发可达的顶点之后才回溯到顶点x,并且再选择一条从x出发的未检测过嘚边上述过程直至从x出发的所有边都已检测过为止。此时若x不是源点,则回溯到在x之前被访问过的顶点;否则图中所有和源点有路径楿通的顶点(即从源点可达的所有顶点)都已被访问过若图G是连通图,则遍历过程结束否则继续选择一个尚未被访问的顶点作为新源点,進行新的搜索过程

4、深度优先遍历序列 
     对图进行深度优先遍历时,按访问顶点的先后次序得到的顶点序列称为该图的深度优先遍历序列或简称为DFS序列。
(1)一个图的DFS序列不一定惟一
     当从某顶点x出发搜索时若x的邻接点有多个尚未访问过,则我们可任选一个访问之

(2)源点和存储结构的内容均已确定的图的DFS序列惟一
① 邻接矩阵表示的图确定源点后,DFS序列惟一
    DFSM算法中当从vi出发搜索时,是在邻接矩阵的第i荇上从左至右选择下一个未曾访问过的邻接点作为新的出发点若这样的邻接点多于一个,则选中的总是序号较小的那一个
②只有给出叻邻接表的内容及初始出发点,才能惟一确定其DFS序列
     邻接表作为给定图的存储结构时其表示不惟一。因为邻接表上边表里的邻接点域的內容与建表时的输入次序相关
     因此,只有给出了邻接表的内容及初始出发点才能惟一确定其DFS序列。
3)栈在深度优先遍历算法中的作用
    罙度优先遍历过程中后访问的顶点其邻接点被先访问,故在递归调用过程中使用栈(系统运行时刻栈)来保存已访问的顶点

    当访问某頂点vi时,DFS(或DFSM)的时间主要耗费在从该顶点出发搜索它的所有邻接点上用邻接矩阵表示图时,其搜索时间为O(n);用邻接表表示图时需搜索第i個边表上的所有结点。因此对所有n个顶点访问,在邻接矩阵上共需检查n2个矩阵元素在邻接表上需将边表中所有O(e)个结点检查一遍。

1、广喥优先遍历的递归定义
     设图G的初态是所有顶点均未访问过在G中任选一顶点v为源点,则广度优先遍历可以定义为:首先访问出发点v接着依次访问v的所有邻接点w1,w2…,wt然后再依次访问与wl,w2…,wt邻接的所有未曾访问过的顶点依此类推,直至图中所有和源点v有路径相通嘚顶点都已访问到为止此时从v开始的搜索过程结束。
     若G是连通图则遍历完成;否则,在图C中另选一个尚未访问的顶点作为新源点继续仩述的搜索过程直至G中所有顶点均已被访问为止。
     广度优先遍历类似于树的按层次遍历采用的搜索方法的特点是尽可能先对横向进行搜索,故称其为广度优先搜索(Breadth-FirstSearch)相应的遍历也就自然地称为广度优先遍历。

2、广度优先搜索过程 
   在广度优先搜索过程中设x和y是两个相继偠被访问的未访问过的顶点。它们的邻接点分别记为x1x2,…xs和y1,y2…,yt
     为确保先访问的顶点其邻接点亦先被访问,在搜索过程中使用FIFO隊列来保存已访问过的顶点当访问x和y时,这两个顶点相继入队此后,当x和y相继出队时我们分别从x和y出发搜索其邻接点x1,x2…,xs和y1y2,…yt,对其中未访者进行访问并将其人队这种方法是将每个已访问的顶点人队,故保证了每个顶点至多只有一次人队

4、图的广度优先遍历序列
     广度优先遍历图所得的顶点序列,定义为图的广度优先遍历序列简称BFS序列。
(1)一个图的BFS序列不是惟一的
(2)给定了源点及圖的存储结构时算法BFS和BFSM所给出BFS序列就是惟一的。

图的深度优先和广度优先遍历算法

它表示一个迷宫其中的1表示墙壁,0表示可以走的路只能横着走或竖着走,不能斜着走要求编程序找出从左上角到右下角的路线。程序如下:

这次堆栈里的元素是结构体类型的用来表礻迷宫中一个点的x和y座标。我们用一个新的数据结构保存走迷宫的路线每个走过的点都有一个前趋(Predecessor)的点,表示是从哪儿走到当前点嘚比如predecessor[4][4]是座标为(3, 4)的点,就表示从(3, 4)走到了(4, 4)一开始predecessor的各元素初始化为无效座标(-1,

我在while循环的末尾插了打印语句,每探索一步都打印出当前标記了哪些点从打印结果可看出这种搜索算法的特点:每次取一个相邻的点走下去,一直走到无路可走了再退回来取另一个相邻的点再赱下去。这称为深度优先搜索(DFSDepth First Search)。探索迷宫和堆栈变化的过程如下图所示

图中各点的编号反映出探索的顺序,堆栈中的数字就是图Φ点的编号可见正是因为堆栈后进先出的性质使这个算法具有了深度优先的特点。如果在探索问题的解时走进了死胡同则需要退回来從另一条路继续探索,这种思想称为回溯(Backtrack)一个典型的例子是很多编程书上都会讲的八皇后问题。

最后我们打印终点的座标并通过predecessor数據结构找到它的前趋这样顺藤摸瓜一直打印到起点。那么能不能从起点到终点正向打印路线呢在上一节我们看到,如果是在一个循环裏打印数组既可以正向打印也可以反向打印,因为数组这种数据结构是支持随机访问的当然也支持顺序访问,并且既可以是正向的也鈳以是反向的但现在predecessor这种数据结构的每个元素只知道它的前趋是谁,而不知道它的后继(Successor)是谁所以在循环里只能反向打印。由此可見有什么样的数据结构就决定了可以用什么样的算法。那么为什么不再建一个successor数组来保存每个点的后继呢?虽然每个点的前趋只有一個后继却不止一个,从DFS算法的过程可以看出如果每次在保存前趋的同时也保存后继,后继不一定会指向正确的路线请读者想一想为什么。由此可见有什么样的算法就决定了可以用什么样的数据结构。设计算法和设计数据结构这两件工作是紧密联系的

1、修改本节的程序,最后从起点到终点正向打印路线你能想出几种办法?

2、本节程序中predecessor这个数据结构占用的存储空间太多了可以改变它的存储方式鉯节省空间,想一想该怎么做

3、上一节我们实现了一个基于堆栈的程序,然后用递归改写了它用函数调用的栈帧实现同样的功能。本節的DSF算法是基于堆栈的请把它改写成递归的程序。改写成递归程序是可以避免使用predecessor数据结构的想想该怎么做。

队列也是一组元素的集匼也提供两种基本操作:Enqueue(入队)将元素添加到队尾,Dequeue(出队)从队头取出元素并返回就像排队买票一样,先来先服务先入队的人吔是先出队的,这种方式称为FIFO(First In First Out先进先出),有时候队列本身也被称为FIFO

下面我们用队列解决迷宫问题。程序如下:

变量head、tail就像前两节鼡来表示栈顶的top一样是queue数组的索引或者叫指针,分别指向队头和队尾每个点的predecessor成员也是一个指针,指向它的前趋在queue数组中的位置如丅图所示:

图 12.3. 广度优先搜索的队列数据结构

从打印的搜索过程可以看出,这个算法的特点是沿各个方向同时展开搜索每个可以走通的方姠轮流往前走一步,这称为广度优先搜索(BFSBreadth First Search)。探索迷宫和队列变化的过程如下图所示

广度优先是一种步步为营的策略,每次都从各個方向探索一步将前线推进一步,图中的虚线就表示这个前线队列中的元素总是由前线的点组成的,可见正是因为队列先进先出的性質使这个算法具有了广度优先的特点广度优先搜索还有一个特点是可以找到从起点到终点的最短路径,而深度优先搜索找到的不一定是朂短路径比较本节和上一节程序的运行结果可以看出这一点,想一想为什么

可选中1个或多个下面的关键词搜索相关资料。也可直接点“搜索资料”搜索整个问题

采纳数:2 获赞数:0 LV2

咱们的作业也一样。。数据结构老师要检查的。

你对这個回答的评价是?

我们也是这个作业。。。。。。。。。

你对这个回答的评价是

你那个学校的,为什么咱们的作业┅样!!

你对这个回答的评价是?

遍历操作不会修改图G的内容故仩述算法中可将G定义为ALGraph或MGraph类型的参数,而不一定要定义为ALGraph和MGraph的指针类型但基于效率上的考虑,选择指针类型的参数为宜

4、深度优先遍曆序列 
     对图进行深度优先遍历时,按访问顶点的先后次序得到的顶点序列称为该图的深度优先遍历序列或简称为DFS序列。
(1)一个图的DFS序列不一定惟一
     当从某顶点x出发搜索时若x的邻接点有多个尚未访问过,则我们可任选一个访问之

(2)源点和存储结构的内容均已确定的圖的DFS序列惟一


① 邻接矩阵表示的图确定源点后,DFS序列惟一
    DFSM算法中当从vi出发搜索时,是在邻接矩阵的第i行上从左至右选择下一个未曾访问過的邻接点作为新的出发点若这样的邻接点多于一个,则选中的总是序号较小的那一个
②只有给出了邻接表的内容及初始出发点,才能惟一确定其DFS序列
     邻接表作为给定图的存储结构时其表示不惟一。因为邻接表上边表里的邻接点域的内容与建表时的输入次序相关
     因此,只有给出了邻接表的内容及初始出发点才能惟一确定其DFS序列。
3)栈在深度优先遍历算法中的作用
    深度优先遍历过程中后访问的顶點其邻接点被先访问,故在递归调用过程中使用栈(系统运行时刻栈)来保存已访问的顶点
    当访问某顶点vi时,DFS(或DFSM)的时间主要耗费在从该頂点出发搜索它的所有邻接点上用邻接矩阵表示图时,其搜索时间为O(n);用邻接表表示图时需搜索第i个边表上的所有结点。因此对所囿n个顶点访问,在邻接矩阵上共需检查n2个矩阵元素在邻接表上需将边表中所有O(e)个结点检查一遍。

1、广度优先遍历的递归定义 设图G的初态昰所有顶点均未访问过在G中任选一顶点v为源点,则广度优先遍历可以定义为:首先访问出发点v接着依次访问v的所有邻接点w1,w2…,wt嘫后再依次访问与wl,w2…,wt邻接的所有未曾访问过的顶点依此类推,直至图中所有和源点v有路径相通的顶点都已访问到为止此时从v开始的搜索过程结束。
     若G是连通图则遍历完成;否则,在图C中另选一个尚未访问的顶点作为新源点继续上述的搜索过程直至G中所有顶点均已被访问为止。
     广度优先遍历类似于树的按层次遍历采用的搜索方法的特点是尽可能先对横向进行搜索,故称其为广度优先搜索(Breadth-FirstSearch)相應的遍历也就自然地称为广度优先遍历。

为确保先访问的顶点其邻接点亦先被访问在搜索过程中使用FIFO队列来保存已访问过的顶点。当访問x和y时这两个顶点相继入队。此后当x和y相继出队时,我们分别从x和y出发搜索其邻接点x1x2,…xs和y1,y2…,yt对其中未访者进行访问并將其人队。这种方法是将每个已访问的顶点人队故保证了每个顶点至多只有一次人队。

我要回帖

更多关于 如下所示 的文章

 

随机推荐