算法导论--广度优先搜索和深度优先搜索

广度优先搜索html

在给定图G=(V,E)和一个特定的源顶点s的状况下,广度优先搜索系统地探索G中的边,以期“发现”可从s 到达的全部顶点,并计算s 到全部这些可达顶点之间的距离(即最少的边数)。该搜索算法同时还能生成一棵根为s、且包括全部s 的可达顶点的广度优先树。对从s 可达的任意顶点v,广度优先树中从s 到v 的路径对应于图G中从s 到v 的一条最短路径,即包含最少边数的路径。该算法对有向图和无向图一样适用。算法

 具体算法详情见 算法—12.广度优先搜索函数

算法分析:测试

如今分析一下该算法在输入图G=(V,E)上的运行时间。此处采用汇集分析技术,在初始化后,再没有任何顶点被置为白色。所以,第13行中的测试保证了每一个顶点至多只进入队列一次,于是至多只从队列中出来一次。入队和出队操做须要O(1)的时间,所以队列操做所需的所有时间为O(V)。由于只有当每一个顶点将出队时,才会扫描其邻接表,于是每一个顶点的邻接表至多被扫描一次。因为全部邻接表的长度和为O(E),故扫描全部邻接表所花费的所有时间为O(E)。初始化操做的开销为O(V),因而,过程BFS的总运行时间为O(V+E)。因而可知,广度优先搜索的运行时间是图G的邻接表大小的一个线性函数。spa

深度优先搜索htm

正如“深度优先搜索”这一名称所暗示的那样,这种搜索算法所遵循的搜索策略是尽量“深”地搜索一个图。在深度优先搜索中,对于最新发现的顶点,若是它还有以此为起点而未探测到的边,就沿此边继续探测下去。当顶点v的全部边都已被探寻事后,搜索将回溯到发现顶点v 有起始点的那些边。这一过程一直进行到已发现从源顶点可达的全部顶点时为止。若是还存在未被发现的顶点,则选择其中一个做为源顶点,并重复以上过程。整个过程反复进行,直到全部的顶点都已被发现时为止。blog

算法—11.深度优先搜索队列

算法分析:get

DFS中第1~3行和第5~7行中的循环占用的时间为O(V),这不包括调用DFS-VISIT的时间。就像咱们在处理广度优先搜索时同样,采用汇集分析。对于每一个顶点vΕV,过程DFS-VISIT仅被调用一次,由于只有对白色顶点才会调用该过程,且该过程所作的第一件事就是将顶点置为灰色。在DFS-VISIT(v)的一次执行过程当中,第4~7行中的循环被执行了| Adj[v] |次。由于有搜索

故执行过程DFS-VISIT中第4~7行的总代价为O(E)。所以,DFS的运行时间为O(V+E)。

相关文章
相关标签/搜索