广度搜索(Breadth-First Search,BFS)是一种基于图的遍历算法,它按照广度优先的方式遍历图中的所有节点。具体来说,该算法从起点开始向外扩展,先遍历起点所有直接相邻的节点,然后再遍历这些节点的直接相邻节点,以此类推。BFS算法可以用于寻找两点之间的最短路径,也可以用于检查图的连通性、拓扑排序等问题。以下是广度搜索算法的基本实现步骤:

创建一个空队列,将起点入队。

标记起点为已访问。

当队列不为空时,重复以下步骤:

从队列中取出一个节点,访问它之后将其出队。

遍历该节点的所有邻居节点,如果邻居节点未被访问过,则将其标记为已访问,并将其入队。

如果所有节点都被访问过,则算法结束;否则,返回第一步。

需要注意的是,由于广度搜索需要遍历相邻的所有节点,因此它通常需要使用额外的开销来存储每个节点的邻居信息。对于大型图来说,该算法的内存消耗可能会很大,因此需要进行优化。同时,BFS算法的时间复杂度为O(|V|+|E|),其中|V|表示节点数量,|E|表示边的数量。因此,对于密集图来说,该算法的时间复杂度会很高。

深度搜索(Depth-First Search,DFS)是一种基于图的遍历算法,它沿着一条路径尽可能深地访问每个节点,直到不能再继续下去为止,然后返回上一级节点,继续深度优先遍历其他路径。DFS算法可以用于寻找图中的所有连通块、找到两点之间的路径、拓扑排序、解决迷宫等问题。以下是DFS算法的基本实现步骤:

标记起点为已访问,并将其加入路径。

对于当前节点的每个未访问的相邻节点,重复以下步骤:

标记相邻节点为已访问。

将相邻节点加入路径。

递归访问相邻节点(即重复步骤2)。

如果所有相邻节点都已经访问过,将当前节点从路径中删除。

如果所有节点都被访问过,则算法结束;否则,重复步骤1。

需要注意的是,DFS算法可能会陷入死循环或超出递归深度限制。通常情况下,使用迭代模拟递归或剪枝等技巧可以避免这些问题。此外,DFS算法并没有保证能够找到最短路径。如果需要找到两点之间的最短路径,可以考虑使用广度搜索(BFS)算法。

广度搜索和深度搜索的使用场景略有不同,下面分别介绍:

广度搜索的使用场景
最短路径查询:在无权图中,广度搜索可以找到两个节点之间的最短路径。这是因为在广度搜索中,每个节点都是从与它距离为1的节点扩展而来。所以第一次到达目的节点时,路径长度一定最短。

连通性检查:广度搜索可以检查无向图或有向图中的节点是否连接。如果一个图是连通的,那么在广度搜索中可以从任何一个节点到达所有其他节点。

拓扑排序:广度搜索可以对有向无环图(DAG)进行拓扑排序。

状态转移问题:广度搜索可以处理状态转移问题,如八数码、华容道等。

深度搜索的使用场景
有限状态机:若一个系统必须经历一系列状态才能达成目标,就可以采用DFS来解决问题。

生成全部排序:可以使用深度搜索来生成一个序列的全排列。

能力匹配问题:比如,确定一个人的技能是否能够完成一项任务。

子集和问题:给定一个集合和一个目标值,求出集合中的子集和是否能够等于该目标值。

综上所述,广度搜索和深度搜索在使用场景上有所差异。如果需要找到两个节点之间的最短路径、检查节点之间的连通性、进行拓扑排序等问题,可以使用广度搜索。如果需要处理能力匹配问题、生成全部排序、解决子集和问题等,可以使用深度搜索。

以下是广度搜索的 Python 实现,其中假设图用邻接表的形式给出:

from collections import deque

def bfs(graph, start):
visited = set() # 用集合记录已访问的节点
queue = deque([start]) # 用双端队列存储待访问的节点

while queue:node = queue.popleft()  # 取出队列首部的节点visited.add(node)print(node)for neighbor in graph[node]:  # 遍历相邻节点if neighbor not in visited:  # 如果相邻节点未被访问过,则将其标记为已访问并加入队列尾部visited.add(neighbor)queue.append(neighbor)

注意,上述代码只是对图进行遍历,并没有实现寻找最短路径等具体操作。如果需要根据广度搜索找到最短路径,可以在记录已访问节点的同时,额外记录每个节点的前驱节点,最后沿着前驱节点回溯即可。

以下是深度搜索的 Python 实现,其中假设图用邻接表的形式给出:

def dfs(graph, node, visited=None):
if visited is None: # 对访问过的节点进行标记
visited = set()
visited.add(node)
print(node)

for neighbor in graph[node]:if neighbor not in visited:  # 如果相邻节点未被访问过,则递归地访问它dfs(graph, neighbor, visited)

注意,递归过程中需要对已访问的节点进行标记,避免重复访问。如果需要根据深度搜索找到特定两节点之间的路径,可以在访问节点时记录路径,最后回溯即可。同时,需要注意循环调用的递归深度,可能会超出递归深度限制,需要做好异常处理。

广度搜索与深度搜索的区别相关推荐

  1. 【数据结构】无向图的遍历(广度搜索和深度搜索)

    说明 以邻接表作为存储结构 以用户指定的结点分别进行广度搜索和深度搜索 相应的生成树的边集 运行截图 源代码 import java.util.*;public class AdjacencyList ...

  2. 【人工智能】八数码问题:广度搜索、深度搜索

    应用广度搜索BFS和深度搜索DFS解决八数码问题,广度搜索和深度搜索都是盲目搜索,相关理论知识,算法过程:问题求解:状态空间图和盲目搜索. 参考:7种方法求解八数码问题 Python实现A*算法解决N ...

  3. 【算法】深度搜索(DFS) 和 广度搜索(BFS)

    深度搜索(DFS) 点:然后退回到该顶点,搜索其它路径,直到以该顶点为始点的所有路径的顶点都被访问,深度搜索算法是递归算法,因为对于没一个节点来说,执行的是同样的操作.  简单来说,深度搜素算法就是一 ...

  4. 深度搜索(DFS)和广度搜索(BFS)

    深度搜索(DFS) 一.搜索方法:  沿出发顶点的第一条路径尽量深入,遍历路径上所有顶点:然后退回到该顶点,搜索其它路径,直到以该顶点为始点的所有路径的顶点都被访问,深度搜索算法是递归算法,因为对于没 ...

  5. 深度搜索和广度搜索特点的深刻理解

    问题提出: 考虑如下图所示的简单图所表示的缅因州的道路系统.在冬天里保持道路通路通畅的唯一方式就是经常扫雪.高速公路部分希望只扫尽可能少的道路上的雪,而确保总是存在连接任何两个乡镇的干净道路.如何才能 ...

  6. 【图】图的深度搜索和广度搜索

    深度优先搜索 图的深度优先遍历(Depth First Search,DFS)是一种遍历图的算法,其基本思想是从起始顶点开始,不断访问邻接顶点,直到无法继续访问为止,然后回溯到之前的顶点,继续访问其未 ...

  7. 深度搜索问题c语言,C语言实现的图的深度搜索与广度搜索程序.doc

    C语言实现的图的深度搜索与广度搜索程序 C语言实现的图的深度搜索与广度搜索程序 /* 上机试验5-图的建立和遍历 1)建立[无向][非连通]图的邻接表存储结构,要求顶点个数不少于15个. 2)用DFS ...

  8. 深度搜索 java_java实现的深度搜索与广度搜索算法BFS,DFS以及几种最短路径算法...

    java实现的深度搜索与广度搜索算法BFS,DFS以及几种最短路径算法 public class City { String name; int id; static int idCounter = ...

  9. 万能的搜索——深度搜索和广度搜索

    搜索分为深度优先搜索(dfs)和广度优先搜索(bfs) 深度搜索和广度搜索的区别是: 深度搜索是往深度方向进行搜索的,先选一条路走到底,再选另一条路: 广度搜索是一层一层的,把一层上的所有情况都搜索到 ...

最新文章

  1. 侧边栏qq客服对话显示
  2. Uber开源TensorFlow框架工具箱Ludwig,无需编码即可进行深度学习开发
  3. C#中重写(override)和覆盖(new)的区别
  4. div中字垂直居中对齐
  5. sample语言词法分析_Go 译文之词法分析与解析 Part Three
  6. 没有上市的股权和股票有啥区别
  7. Center Loss
  8. 小辣椒android密码怎样开,小辣椒手机忘记密码怎么恢复出厂设置
  9. 少样本学习系列(一)【Metrics-Based Methods】
  10. paip.提升用户体验---c++ 右键菜单以及socket接口
  11. mti杂波抑制仿真 matlab,雷达MTI/MTD杂波抑制技术研究
  12. 游戏开发论坛_《原神》称霸苹果「2020年度iPhone游戏奖」
  13. 国家开放大学2021春1021劳动与社会保障法题目
  14. IrisSkin 皮肤
  15. 基于Huffman编码的C语言解压缩文件程序
  16. jquery返回上一页,前一页
  17. Python随机生成电话号码号码段分析
  18. 七个基本量纲_常用量纲
  19. cnpm 安装文件找不到_周杰伦说目前暂时找不到对手_腾讯新闻
  20. 管道(pipe)原理。

热门文章

  1. 解决win10升级补丁后共享打印机0x0000011b报错问题最简单解决方法,不需要卸载补丁
  2. 美国通胀“爆表”要加息100点?
  3. 数字签名、证书,RSA加密、解密
  4. Core Data的使用
  5. android studio 登陆ui界面设计
  6. 大整数乘法(分治法)
  7. 出现413 Request Entity Too Large问题的解决方法
  8. 使用malloc动态内存分配一个二维数组
  9. LPCTSTR的用法
  10. 03.ReactDOM.render