安琪拉教鲁班学算法之BFS和DFS

《安琪拉与面试官二三事》系列文章
一个HashMap能跟面试官扯上半个小时
一个synchronized跟面试官扯了半个小时

《安琪拉教鲁班学算法》系列文章

安琪拉教鲁班学算法之动态规划

安琪拉教鲁班学算法之BFS和DFS

BFS 和 DFS在算法中属于有举足轻重的地位,本文希望通过使用王者峡谷二位脆皮英雄对话的方式讲解动态规划,让大家在轻松愉快的氛围中搞懂BFS 和 DFS。

鲁班: 安琪拉,你知道 BFS 和DFS 吗?

安琪拉:当然知道啊,BFS 全程是 广度优先搜索, DFS 指的是深度优先搜索。

鲁班: 安琪拉妹妹,你这么说我还是很蒙,能跟我详细讲讲吗?

安琪拉:鲁班哥哥,看你求知欲这么强,咱俩又都是脆皮的份上,我给你讲讲BFS 和 DFS。

以下图为例,

广度优先搜索 和 深度优先搜索都是遍历图/树 节点的方式

广度优先搜索: 如下图所示,广度优先搜索,例如从上图中选取一个节点A,作为起点,宽度优先搜索,遍历的方式是遍历A、 和A相连的B和C,和B相连的D,和C相连的E,和D相连的F,以这样的顺序访问图中的节点。

深度优先搜索:还是以A作为起点,一直走到底,直到不能访问,再回退,A => B => D => F =>E => C

代码实现例子:

public static void main(String[] args) {//以map 存储图中节点的关系 A 相连的节点为 B、C//就可表示为 List<Character> aList = new LinkedList<>(Arrays.asList('B','C'));Map<Character, List<Character>> graph = buildGraph();dfs(graph, 'A');bfs(graph, 'A');}// 构造图private static Map<Character,List<Character>> buildGraph(){Map<Character, List<Character>> graph = new HashMap<>();List<Character> aList = new LinkedList<>(Arrays.asList('B','C'));List<Character> bList = new LinkedList<>(Arrays.asList('A','C','D'));List<Character> cList = new LinkedList<>(Arrays.asList('A','B','D','E'));List<Character> dList = new LinkedList<>(Arrays.asList('B','F','E','C'));List<Character> eList = new LinkedList<>(Arrays.asList('C','D'));List<Character> fList = new LinkedList<>(Arrays.asList('D'));graph.put('A',aList);graph.put('B',bList);graph.put('C',cList);graph.put('D',dList);graph.put('E',eList);graph.put('F',fList);return graph;}/*** 深度优先搜索  关键是使用栈来维护相邻后继节点* @param graph 要遍历的图* @param s 起始点*/public static void dfs(Map<Character,List<Character>> graph, Character s){//走过的节点Set<Character> visited = new HashSet<>();Stack<Character> stack = new Stack<>();stack.push(s);while(!stack.empty()){Character accessC = stack.pop();if(!visited.contains(accessC)){//访问函数System.out.print("->"+accessC);visited.add(accessC);}graph.get(accessC).forEach(c ->{if(!visited.contains(c)){stack.push(c);}});}}/*** 广度优先搜索  使用队列维护相邻后续节点* @param graph* @param s*/public static void bfs(Map<Character,List<Character>> graph, Character s){//走过的节点Set<Character> visited = new HashSet<>();Queue<Character> queue = new LinkedList<>();queue.offer(s);while (!queue.isEmpty()){Character accessC = queue.poll();if(!visited.contains(accessC)){//访问函数System.out.print("->"+accessC);visited.add(accessC);}graph.get(accessC).forEach(c ->{if(!visited.contains(c)){queue.offer(c);}});}}

欢迎大家关注 Wx公众号:安琪拉的博客 获取更多技术资料

安琪拉教鲁班学算法之BFS和DFS相关推荐

  1. 安琪拉教鲁班学算法之动态规划

    <安琪拉与面试官二三事>系列文章 一个HashMap能跟面试官扯上半个小时 一个synchronized跟面试官扯了半个小时 <安琪拉教鲁班学算法>系列文章 安琪拉教鲁班学算法 ...

  2. 安琪拉教鲁班学堆排序

    <安琪拉与面试官二三事>系列文章 一个HashMap能跟面试官扯上半个小时 一个synchronized跟面试官扯了半个小时 <安琪拉教鲁班学算法>系列文章 安琪拉教鲁班学算法 ...

  3. 安琪拉教鲁班玩Java反射-业务场景篇

    安琪拉教鲁班玩Java反射-业务场景篇 Java 语言中有很多特性,其中有一项很重要的特性就是反射,我们在很多框架类的代码中可能会看到反射的身影,那实际在业务逻辑层是否可以用反射特性做些事情呢? 安琪 ...

  4. 安琪拉教百里守约学并发编程之多线程基础

    <安琪拉与面试官二三事>系列文章 一个HashMap能跟面试官扯上半个小时 一个synchronized跟面试官扯了半个小时 <安琪拉教鲁班学算法>系列文章 安琪拉教鲁班学算法 ...

  5. 安琪拉教妲己分布式限流

    安琪拉教妲己分布式限流 在系统设计中,限流是保障系统高可用的一种常规手段,同样的手段还有熔断.服务降级等等,此篇文章作为一个开端,是<安琪拉教妲己分布式系统设计>的第一篇 妲己:听说最近你 ...

  6. 遇到网络问题你是怎么解决的?安琪拉有二招

    本文是以安琪拉在项目中解决的一个网络异常(Broken Pipe)为出发点写的,我想玩家们应该多少遇到过网络问题,这篇文章也提供了一种解决网络问题的思路,遇到类似网络问题时可以借鉴这个思路. 为了尽量 ...

  7. 正则表达式:安琪拉之歌Aquarian文字查找与翻译

    现学现卖的用于在Aquaria的诸地图中查找Aquarian文字的正则表达式,第一次编写总归值得留念. 用UltraEdit打开所有地图文件,将窗口缩小到只剩两三行,如此可以提高搜索速度,然后开始搜索 ...

  8. 数据结构与算法学习⑤(BFS和DFS 贪心算法 二分查找)

    数据结构与算法学习⑤ 数据结构与算法学习⑤ 1.BFS和DFS 1.1.深度优先搜索算法 1.2.广度优先搜索算法 面试实战 102. 二叉树的层序遍历 104. 二叉树的最大深度 515. 在每个树 ...

  9. 熬夜怒肝,图解算法!BFS和DFS的直观解释

    一.前言 我们首次接触 BFS 和 DFS 时,应该是在数据结构课上讲的 "图的遍历".还有就是刷题的时候,遍历二叉树我们会经常用到BFS和DFS.它们的实现都很简单,这里我就不哆 ...

最新文章

  1. IBM确定公司未来存储技术发展方向
  2. 使用jdk 自带的jarsigner 签名工具签名的apk 和android规范有区别
  3. undefined reference to `clock_gettime'
  4. IDEA加载mysql驱动包
  5. 卡密社区源码无加密完整版(php源码+mysql脚本)
  6. 测试计算机性能的软件比较专业,用什么软件可以测试计算机的整体性能?
  7. 【Mybatis】TKMybatis 介绍和使用
  8. 190825 reverse-ogeek初赛
  9. C语言实现简单电子通讯录
  10. oracle 11g jdk设置,java-如何从oracle 11g jdbc 7/14 jdk 1.7中的读取调...
  11. 参考三:容易误解读的量子擦除实验
  12. c语言输出方框□怎么回事_C语言打印数据的二进制格式-原理解析与编程实现
  13. MATLAB中cumsum函数
  14. JSON.stringify() 详解
  15. spring入门配置
  16. Linux中select IO复用机制
  17. 什么叫html格式化,format是什么意思 格式化自己,只为删除你???
  18. stm32两轮平衡车资料
  19. 不想花钱学Python,好资源该怎么找?这里有你看不完的东西
  20. 老司机人手必备xxlive 仅供学习交流 勿传播以及商业用途

热门文章

  1. python-调用图灵AI接口,实现机器人聊天功能
  2. 迅为i.MX8M mini开发板Andaoid9系统测试4G
  3. T60/T60p显卡的官方Windows 7驱动下载网址
  4. 小程序wx.onLocationChange向下兼容wx.getLocation
  5. 2021年抗菌药发展环境(PEST)分析:老龄化进程加快推动抗菌药行业发展[图]
  6. Python推导式-[xx for xx in range() if xx]
  7. 阿里云ubuntu安装tomcat问题
  8. python求和1到100_加一行代码,让你的Python的运算速度加快100倍
  9. R语言使用rnorm函数生成正太分布数据、使用plot函数可视化折线图、使用text函数在可视化图像的指定位置添加自定义文本
  10. xlrd-操作excel 背景颜色-转载