当前位置:网站首页 > 深度学习 > 正文

广度优先搜索和深度优先搜索的基本思想(广度优先搜索和深度优先搜索的基本思想是)



广度优先搜索(Breadth-First-Search,BFS)类似于二叉树的层序遍历算法(借助队列),其基本思想是:首先访问起始顶点,接着由v出发,依次访问v的各个未访问过的邻接顶点w1,W2,…,Wn,然后依次访问w1,W2,…,Wn的所有未被访问过的邻接顶点;再从这些访问过的顶点出发,访问它们所有未被访问过的邻接顶点……以此类推,直到图中所有顶点都被访问过为止。Dijkstra 单源最短路径算法和Prim最小生成树算法也应用了类似的思想。

广度优先搜索是一种分层的查找过程,每向前走一步可能访问一批顶点,不像深度优先拽索那样有往回退的情况,因此它不是一个递归的算法。为了实现逐层的访问,算法必须借助一个辅助队列,以记忆正在访问的顶点的下一层顶点。

图5.11
广度优先搜索(Breadth-First Search,简称BFS)是一种图搜索算法,用于在图或树数据结构中遍历或搜索。BFS从根节点开始,沿着树的宽度遍历树的节点,即首先访问根节点的所有邻居节点,然后再依次访问邻居节点的邻居节点。在搜索时,BFS通常使用队列数据结构来辅助实现。下面是用Python实现BFS算法的示例代码:

 
  

这段代码首先定义了一个Graph类,其中包含了add_edge方法用于添加边,以及bfs方法用于执行广度优先搜索。在bfs方法中,我们使用了一个队列来辅助遍历图中的节点,首先将起始节点加入队列,然后循环从队列中取出一个节点,并访问其未访问过的邻居节点,将其加入队列中。重复这一过程,直到队列为空,即完成了图的广度优先搜索。

 
  

这段代码首先定义了一个Graph类,其中包含了add_edge方法用于添加边,以及bfs_shortest_path方法用于执行BFS算法求解最短路径问题。在bfs_shortest_path方法中,我们使用了一个队列来辅助遍历图中的节点,并利用一个字典来记录每个节点到起始节点的最短距离。我们从起始节点开始执行BFS算法,在遍历过程中,不断更新节点到起始节点的最短距离,直到队列为空。

在示例中,我们创建了一个简单的图实例,并求解了从节点0到其他节点的最短路径。最后输出了每个节点到起始节点的最短距离。

 
  

bfs函数接受两个参数:graph是表示图的邻接表,start是指定的起始节点。

我们使用一个集合visited来记录已经访问过的节点,并使用一个双端队列queue来存储待访问的节点。在开始时,我们将起始节点start加入到visited集合和queue队列中,并标记为已访问。

在while循环中,我们不断从队列中取出节点进行处理,直到队列为空。

在每次处理一个节点时,我们打印该节点的值,这里可以代表对节点的访问操作

然后,我们遍历当前节点的邻居节点。对于每个邻居节点,如果它尚未被访问过,则将其标记为已访问,并将其加入到队列中,以便稍后进行处理。

这个过程会一直持续,直到队列中没有待访问的节点为止。

通过这种方式,广度优先搜索会逐层遍历图,从而生成一棵树,这棵树称为广度优先搜索生成树。

注意:图的邻接矩阵表示是唯一的,但对于邻接表来说,若边的输入次序不同,生成的邻接表也不同。因此,对于同样一个图,基于邻接矩阵的遍历所得到的 DFS 序列和 BFS序列是唯一的,基于邻接表的遍历所得到的DFS 序列和BFS序列是不唯一的。

深度优先搜索(DFS)是一种用于遍历或搜索树或图的算法。它从根节点开始,沿着树的深度尽可能远的路径探索每个分支,直到遇到叶子节点或者无法继续往下搜索为止,然后回溯到前一个节点,继续深度遍历其他分支。

下面是用Python实现深度优先搜索算法的代码:

 
  

深度优先生成树是深度优先搜索(DFS)在树结构中的应用。当使用DFS遍历一个连通图时,会生成一棵深度优先生成树。这棵生成树包含了图中所有可达节点,并且保持了深度优先搜索的顺序。

下面是详细解释深度优先生成树的过程:

选择起始节点:深度优先生成树的开始节点可以是任意一个节点。通常选择图中的一个未被访问过的节点作为起始节点。

从起始节点开始深度优先搜索:从起始节点开始,进行深度优先搜索。具体来说,对于当前节点,首先将其标记为已访问,然后递归地访问其所有未被访问过的邻居节点。

生成树的边:在搜索过程中,每次从当前节点到邻居节点的访问过程中,形成的边被添加到生成树中。这些边构成了深度优先生成树的结构。

回溯:当一个节点的所有邻居节点都被访问过后,递归回溯到上一个节点,继续搜索其他未被访问的邻居节点。

终止条件:深度优先搜索会一直进行直到所有可达节点都被访问过为止。这样就会形成一棵包含所有节点的深度优先生成树。

通过这个过程,深度优先生成树保留了图中节点之间的连接关系,并且保持了深度优先搜索的顺序。生成树的根节点是起始节点,而其他节点则按照DFS的顺序连接到根节点上。

在实际应用中,深度优先生成树通常用于网络路由、拓扑排序、最小生成树算法等场景中。

下面是用Python实现深度优先生成树的代码:

 
  

在这个实现中,使用了一个生成器函数 dfs,它会生成深度优先生成树的所有边。在函数内部使用递归来进行深度优先搜索,当访问到一个节点时,会将其与邻居节点之间的边生成出来。

这段代码会输出深度优先生成树的所有边,例如:

 
  

这些边构成了深度优先生成树的结构,它们保留了节点之间的连接关系,并且按照深度优先搜索的顺序连接起了整棵树。

 
  

深度优先搜索

到此这篇广度优先搜索和深度优先搜索的基本思想(广度优先搜索和深度优先搜索的基本思想是)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就! 
  

                            

版权声明


相关文章:

  • 广度优先搜索和深度优先搜索都属于(广度优先搜索和深度优先搜索都属于什么类型)2026-03-23 18:00:07
  • linux学习(linux这样学)2026-03-23 18:00:07
  • 广度优先搜索和深度优先搜索时间复杂度(广度优先搜索和深度优先搜索时间复杂度的区别)2026-03-23 18:00:07
  • 广度优先搜索和深度优先搜索的基本思想(深度与广度优先搜索)2026-03-23 18:00:07
  • 广度优先搜索和深度优先搜索时间复杂度(广度优先搜索和深度优先搜索的时间复杂度)2026-03-23 18:00:07
  • 广度优先搜索和深度优先搜索的区别(广度优先搜索和深度优先搜索的区别)2026-03-23 18:00:07
  • linux学习(linux要怎么学)2026-03-23 18:00:07
  • 广度优先搜索和深度优先搜索(广度优先搜索和深度优先搜索的本质区别)2026-03-23 18:00:07
  • 广度优先搜索和深度优先搜索都可以用于遍历一棵树(广度优先搜索和深度优先搜索例题)2026-03-23 18:00:07
  • 广度优先搜索和深度优先搜索的区别(广度优先搜索序列和深度优先搜索序列)2026-03-23 18:00:07
  • 全屏图片