图的两种遍历方式:

  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,但至少快速找到她是有可能的。而用广度优先搜索则别无选择,必须遍历前两辈的所有人,才能开始搜索曾孙这一辈。

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

  • 前者适合用广度优先搜索
  • 后者适合用深度优先搜索。

深度DFS 和 广度BFS搜索算法学习的更多相关文章

  1. 深度优先dfs与广度bfs优先搜索总结+例题

    DFS(Deep First Search)深度优先搜索 深度优先遍历(dfs)是对一个连通图进行遍历的算法.它的思想是从一个顶点开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节 ...

  2. 多级树的深度遍历与广度遍历(Java实现)

    目录 多级树的深度遍历与广度遍历 节点模型 深度优先遍历 广度优先遍历 多级树的深度遍历与广度遍历 深度优先遍历与广度优先遍历其实是属于图算法的一种,多级树可以看做是一种特殊的图,所以多级数的深/广遍 ...

  3. 重新整理数据结构与算法(c#)—— 图的深度遍历和广度遍历[十一]

    参考网址:https://www.cnblogs.com/aoximin/p/13162635.html 前言 简介图: 在数据的逻辑结构D=(KR)中,如果K中结点对于关系R的前趋和后继的个数不加限 ...

  4. ACM 广度优化搜索算法总结

    广度优化搜索算法的本质:要求每个状态不能重复,这就需要我们:第一次先走一步可以到达的状态,如果还没有找到答案,就需要我们走到两步可以到达的状态.依次下去 核心算法:队列 基本步骤:          ...

  5. 记录----第一次使用BFS(广度搜索)学习经验总结

    学习经验记录与分享—— 最近在学习中接触到了一种解决最短路径的实用方法----BFS(广度搜索),在这里总结并分享一下第一次学习的经验. 首先第一个要了解的是"queue"(队列函 ...

  6. java二叉树遍历——深度优先(DFS)与广度优先(BFS) 递归版与非递归版

    介绍 深度优先遍历:从根节点出发,沿着左子树方向进行纵向遍历,直到找到叶子节点为止.然后回溯到前一个节点,进行右子树节点的遍历,直到遍历完所有可达节点为止. 广度优先遍历:从根节点出发,在横向遍历二叉 ...

  7. cf276E 两棵线段树分别维护dfs序和bfs序,好题回头再做

    搞了一晚上,错了,以后回头再来看 /* 对于每次更新,先处理其儿子方向,再处理其父亲方向 处理父亲方向时无法达到根,那么直接更新 如果能达到根,那么到兄弟链中去更新,使用bfs序 最后,查询结点v的结 ...

  8. 【每日一题】【DFS】【BFS】【队列】2021年12月5日-199. 二叉树的右视图

    解答: /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * ...

  9. 图的存储及遍历 深度遍历和广度遍历 C++代码实现

    /*图的存储及遍历*/ #include<iostream> using namespace std; //----------------------------------- //邻接 ...

  10. 449. Serialize and Deserialize BST——几乎所有树的面试题目都会回到BFS或者DFS,使用BFS,None节点存#

    Serialization is the process of converting a data structure or object into a sequence of bits so tha ...

随机推荐

  1. [rCore学习笔记 015]特权级机制

    写在前面 本随笔是非常菜的菜鸡写的.如有问题请及时提出. 可以联系:1160712160@qq.com GitHhub:https://github.com/WindDevil (目前啥也没有 官方文 ...

  2. IPFS 解决国内 docker mirror 封锁

    IPFS 解决国内 docker mirror 封锁 内容仅用于研究,帮助开发者学习技术知识,以建设祖国 IPFS 技术是当前 Web3 的主要基建设施,提供去中心化存储,以及 libp2p 的去中心 ...

  3. springsecurity使用:登录与校验

    首先是引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId> ...

  4. Jmeter二次开发函数 - 文本替换

    此篇文章将在Jmeter创建一个新函数,实现替换文本中的指定内容功能.效果图如下 1.eclipse项目创建步骤此处省略,可参考上一篇Jmeter二次开发函数之入门 2.新建class命名为" ...

  5. 【Binary】XShell6 无法使用的解决办法

    感谢博主的解决方案: https://www.cnblogs.com/pinkpolk/articles/13554445.html 首先需要安装VsCode,并且安装一个[Hex Editor]的插 ...

  6. XML 教程——检视阅读

    基本 XML 简介 XML 指可扩展标记语言(eXtensible Markup Language). XML 被设计用来传输和存储数据.HTML 被设计用来显示数据. 什么是 XML? XML 指可 ...

  7. 哈哈哈,我就说未来要研发无人的AI潜艇嘛 —— 说啥来啥 —— AI驱动的无人潜艇

    相关: 沉默5个月后,美国对华发出挑战书,万没想到,中方打法早就变了

  8. TensorFlow中的int32_ref、float32_ref类型

    在用TensorFlow_1.14.0中发现数据类型的显示带有 _ref : x1=tf.Variable([1, 2, 3])x2=tf.Variable([1.0, 2.0, 3.0]) 也就是说 ...

  9. 【全】CSS动画大全之其他【移动盒子显示详情】

    效果预览 代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> < ...

  10. [天线原理及设计>基本原理] 3. 辐射方向图或天线方向图

    <Antenna_Theory_Analysis_and_Design_3rd_Constantine_A._Balanis.pdf> 3. 辐射方向图或天线方向图 天线辐射方向图或天线方 ...