深度DFS 和 广度BFS搜索算法学习

目录


图的两种遍历方式:

  1. 深度优先遍历(DFS------Depth First Search)
  2. 广度优先遍历(BFS------Breath First Search)

图的遍历算法里,处理临时数据,依赖两个抽象数据结构:

  • 队列

广度优先的动态图

广度优先遍历也叫层序遍历,先遍历第一层(节点 1),再遍历第二层(节点 2,3,4),第三层(5,6,7,8),第四层(9,10)。

深度优先的动态图

从根结点出发,一直向左子节点走,直到左子节点不存在然后返回到上一个节点走这个节点的右子节点,然后一直往右子节点走,同样的也是走不通为止就返回。很显然这种一路走到黑,黑了就回头的方式,就是深度优先遍历的过程。


广度和深度的具体步骤

广度搜索中,存储下层的数据需要用到队列,

深度搜索中,存储一整条路径的数据,需要用到栈 ,用栈去回溯到最开始的顶点,

具体步骤去看《秒懂算法:用常识解读数据结构》,我觉得书分解得很详细了,不需要在搬一次了。

深度和广度的应用场景

我面试过挺多次的,很多面试问题都慢慢淡忘了,但是有一个问题一直记得:

他问,你平时在做爬虫的时候,用深度还是广度?

现在回想起来,觉得他问得真扯淡。

为什么?

选择深度或广度所对应的是不同场景,理论上来说,所有问题,都可以用list解决,但是为什么还要分化出那么多的数据结构?

还不是因为------不同的问题,采用不同的数据结构,这样解决效率才高,资源才省。

比如看这个下面这个家族结构图:

如果想要找到曾祖母Ruby的所有儿女,那么用深度还是广度?

  • 肯定是广度最合适。
    使用广度优先搜索,那么立刻就能找到她所有直接女儿(Andrea、Xander、CoCo和Maya),不用搜索和她相隔一代的亲人。

如果想要找到Ruby的一个叫Ruth的后代,用深度还是广度?

  • 显然是深度合适。
    用深度优先搜索,则可以马上移动到图的底部,在几步之内就能找到曾孙一辈。
    虽然还是需要遍历整幅图才能找到Ruth,但至少快速找到她是有可能的。而用广度优先搜索则别无选择,必须遍历前两辈的所有人,才能开始搜索曾孙这一辈。

在思考用深度还是广度时?应该是先思考究竟是想先尽可能在初始顶点附近搜索还是想先尽可能远离它

  • 前者适合用广度优先搜索
  • 后者适合用深度优先搜索。
相关推荐
麦烤楽鸡翅10 小时前
挡住洪水 (牛客)
java·数据结构·c++·python·算法·bfs·牛客
徐子童14 小时前
FloodFill---BFS
算法·bfs·宽度优先·队列·floodfill
让我们一起加油好吗20 天前
【基础算法】01BFS
数据结构·c++·算法·bfs·01bfs
_OP_CHEN20 天前
C++基础:(十五)queue的深度解析和模拟实现
开发语言·c++·stl·bfs·queue·容器适配器·queue模拟实现
让我们一起加油好吗23 天前
【基础算法】多源 BFS
c++·算法·bfs·宽度优先·多源bfs
smallnetter1 个月前
华为OD机试C卷 - 分披萨 - 贪心 DFS - (Java & C++ & JavaScript & Python)
华为od·贪心算法·dfs
hansang_IR2 个月前
【题解】洛谷 P4286 [SHOI2008] 安全的航线 [递归分治]
c++·数学·算法·dfs·题解·向量·点积
KarrySmile2 个月前
网格图--Day04--网格图DFS--2684. 矩阵中移动的最大次数,1254. 统计封闭岛屿的数目,130. 被围绕的区域
矩阵·深度优先·dfs·深度优先搜索·灵茶山艾府·网格图·网格图dfs
hansang_IR2 个月前
【题解 | 两种做法】洛谷 P4208 [JSOI2008] 最小生成树计数 [矩阵树/枚举]
c++·算法·dfs·题解·枚举·最小生成树·矩阵树定理
CUC-MenG3 个月前
2025牛客多校第九场 G.排列 A.AVL树 F.军训 个人题解
数学·dfs·dp·笛卡尔树·组合数·曼哈顿距离·树上dp