首页 > 编程语言 >深度DFS 和 广度BFS搜索算法学习

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

时间:2024-09-29 10:47:24浏览次数:7  
标签:优先 遍历 DFS BFS 搜索 搜索算法 深度 广度 节点

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

 

目录

 


图的两种遍历方式:

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

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

  • 队列

广度优先的动态图

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

深度优先的动态图

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


广度和深度的具体步骤

广度搜索中,存储下层的数据需要用到队列,
深度搜索中,存储一整条路径的数据,需要用到栈 ,用栈去回溯到最开始的顶点,
具体步骤去看《秒懂算法:用常识解读数据结构》,我觉得书分解得很详细了,不需要在搬一次了。

深度和广度的应用场景

我面试过挺多次的,很多面试问题都慢慢淡忘了,但是有一个问题一直记得:
他问,你平时在做爬虫的时候,用深度还是广度?

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

为什么?

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

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

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

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

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

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

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

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

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

所以,为什么我现在觉得那个问得很扯淡,就类似,小明,你开发喜欢用list还是Map呀?
- -。

  分类: DataStructure

标签:优先,遍历,DFS,BFS,搜索,搜索算法,深度,广度,节点
From: https://www.cnblogs.com/sexintercourse/p/18439110

相关文章

  • 搜索:如何用 A*搜索算法实现游戏中的寻路功能?
    搜索:如何用A*搜索算法实现游戏中的寻路功能?在游戏开发中,寻路功能是一个非常重要的部分。它可以让游戏中的角色自动找到从一个位置到另一个位置的最佳路径。A搜索算法是一种常用的寻路算法,它可以在复杂的地图环境中快速找到最短路径。本文将详细介绍如何用A搜索算法实现游......
  • 【图计算算法‌】广度优先搜索(BFS)算法
    目录一、广度优先搜索算法概述1.1算法原理1.2算法步骤1.3算法特点二、广度优先搜索算法优缺点和改进2.1 广度优先搜索算法优点2.2  广度优先搜索主算法缺点2.3  广度优先搜索算法改进三、广度优先搜索算法编程实现3.1  广度优先搜索算法C语言实现3.2  ......
  • 【算法】二叉树中的 DFS
     【ps】本篇有6 道 leetcode OJ。 目录一、算法简介二、相关例题1)计算布尔二叉树的值.1-题目解析.2-代码编写2)求根节点到叶节点数字之和.1-题目解析.2-代码编写3)二叉树剪枝.1-题目解析.2-代码编写4)验证二叉搜索树.1-题目解析.2-代码编写5)二叉......
  • JAVA连接HDFS操作
    JAVA连接HDFS操作一、引言在大数据时代,Hadoop分布式文件系统(HDFS)扮演着重要的角色。对于Java开发者来说,掌握如何使用Java连接和操作HDFS是一项基本技能。本文将介绍如何通过Java代码连接HDFS,并执行一些基本的文件操作。二、连接HDFS1、第一步:添加依赖要使用Java操作HDF......
  • JAVA连接HDFS使用案例
    JAVA连接HDFS使用案例一、引言Hadoop分布式文件系统(HDFS)是大数据存储的基础。对于Java开发者来说,能够通过Java代码操作HDFS是处理大数据任务的关键技能。本文将通过几个简单的示例,展示如何使用Java连接HDFS并执行一些基本的文件操作。二、连接HDFS1、第一步:添加依赖在M......
  • 剪枝的应用,bfs判重 蚱蜢跳——蓝桥p642
    **问题描述总共有九个盘子,八只蚱蜢,且每个盘子中只能容下一只蚱蜢,蚱蜢的编号为1~8,如果蚱蜢所在的盘子紧邻着空盘子,那么该蚱蜢可以从自己的盘子跳到空盘子中,也可以隔一个盘子跳到空盘子中,问一开始状态是012345678,蚱蜢至少该跳多少步才可以被变为087654321**输入无**输出蚱蜢跳......
  • Hadoop三大组件之HDFS(二)
    HDFS常用操作命令Hadoop分布式文件系统(HDFS)提供了灵活且高效的文件管理方式,类似于Linux文件系统。本文将介绍常用的HDFS操作命令,帮助您更好地掌握HDFS的基本操作。1.查看HDFS内容HDFS的目录结构与Linux类似,顶层目录为/。1.1通过浏览器查看可以通过......
  • 【Py/Java/C++三种语言OD独家2024E卷真题】20天拿下华为OD笔试之【DFS/BFS】2024E-开
    可上欧弟OJ系统练习华子OD、大厂真题绿色聊天软件戳oj1441了解算法冲刺训练(备注【CSDN】否则不通过)文章目录相关推荐阅读题目描述与示例题目描述输入输出示例一输入输出说明示例二输入输出解题思路代码解法一:BFSpythonjavacpp......
  • HDFS NAMENODE 安全模式
    一、安全模式现象探究1.1 关闭所有服务,使用命令单独启动服务使用hdfs--daemon命令逐个进程启动集群,观察现象1.首先启动namenodestop-all.shjpshdfs--daemonstartnamenodejpshadoopfs-ls/#使用ls浏览时正常显示hadoopfs-cat/test.txt#使用cat查看数......
  • HDFS数据(跨集群)迁移
    一、数据迁移使用场景1.冷热集群数据同步、分类存储2.整体数据整体搬迁3.数据准实时同步(备份)二、考量因素1.网络传输带宽及时间,是否会影响现有业务2.性能,单机?多线程?分布式?3.是否正常增量同步4.数据迁移的同步性(同步单位时间数据超过单位时间)三、DistCp工具使用3.1简介dis......