图解BFS算法和DFS算法

  • BFS算法
    • 算法思路
    • 实现过程
    • Python代码实现
  • DFS算法
    • 算法思路
    • 实现过程
    • Python代码实现

BFS算法

BFS类似于树的层次遍历过程,从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。
舍去空间换时间。

算法思路

队列(先进先出)

1、创建一个空队列queue(用来存放节点)和一个空列表visit(用来存放已访问的节点)

2、依次将起始点及邻接点加入queue和visit中

3、poo出队列中最先进入的节点,从图中获取该节点的邻接点

4、如果邻接点不在visit中,则将该邻接点加入queue和visit中

5、输出pop出的节点

6、重复3、4、5,直至队列为空

实现过程

如图:从A开始

1、A进入队列

2、A出队列时,A的邻接结点B、C、D进入队列

3、B出队列时,B的邻接结点A、E、F中未进过队列的E、F进入队列

4、C出队列时,C的邻接结点A、D、F、G、中未进过队列的G进入队列

5、D出队列时,D的邻接结点A、C、G已经全部进入过队列

6、E出队列,邻接结点均已进入过队列

7、F出队列,邻接结点均已进入过队列

8、G出队列,邻接结点均已进入过队列

结果 : A B C D E F G

Python代码实现

用字典结构表示


graph = {'A' : ['B','C','D'],'B' : ['A','E','F'],'C' : ['A','D','F','G'],'D' : ['A','C','G'],'E' : ['B'],'F' : ['B','C'],'G' : ['C','D']
}

BFS


def BFS(start,graph):queue =[]visit = []queue.append(start)visit.append(start)while queue:node = queue.pop(0)nodes = graph[node]for i in nodes:if i not in visit:queue.append(i)visit.append(i)print(node,end='\t')

运行结果:

DFS算法

DFS沿着树的深度遍历树的节点,
选一条路一直走到底,回溯,遍历所有的子节点,进而达到全局搜索的目的。

算法思路

栈(先进后出)
和BFS相似,只是稍微做了一丝改变

1、创建一个空栈stack(用来存放节点)和一个空列表visit(用来存放已访问的节点)

2、依次将起始点及邻接点加入stack和visit中

3、poo出栈中最后进入的节点,从图中获取该节点的邻接点

4、如果邻接点不在visit中,则将该邻接点加入stack和visit中

5、输出pop出的节点

6、重复3、4、5,直至栈为空

实现过程

如图:从A开始

1、A进入堆栈

2、A出堆栈时,A的邻接结点B、C、D进入堆栈

3、D出堆栈时,D的邻接结点A、C、G中未进过堆栈的G进入堆栈

4、G出堆栈时,G的邻接结点C、D已经全部进入过堆栈

5、C出堆栈时,C的邻接结点A、D、F、G中未进过堆栈的F进入堆栈

6、F出堆栈,邻接结点均已进入过堆栈

7、B出堆栈,邻接结点E进入堆栈

8、E出堆栈

结果 : A D G C F B E

Python代码实现


graph = {'A' : ['B','C','D'],'B' : ['A','E','F'],'C' : ['A','D','F','G'],'D' : ['A','C','G'],'E' : ['B'],'F' : ['B','C'],'G' : ['C','D']
}
def DFS(start,graph):stack = []visit = []stack.append(start)visit.append(start)while stack:node = stack.pop()nodes = graph[node]for i in nodes:if i not in visit:stack.append(i)visit.append(i)print(node,end='\t')DFS('A',graph)

运行结果:

BFS算法和DFS算法(含图解:简单易懂)相关推荐

  1. 拓扑排序(Topological Sorting):Kahn 算法和 DFS 算法

    拓扑排序(Topological Sorting):Kahn 算法和 DFS 算法 Kahn 算法 DFS 算法 拓扑排序(TopoSort)有相当广泛的应用,比如依赖关系分析.图是否有环的检测.编译 ...

  2. 拓扑排序的两种实现:Kahn算法和dfs算法

    本文将从以下几个方面介绍拓扑排序: 拓扑排序的定义和前置条件 和离散数学中偏序/全序概念的联系 典型实现算法 Kahn算法 基于DFS的算法 解的唯一性问题 实际例子 取材自以下材料: http:// ...

  3. 拓扑排序(kahn算法和dfs算法)

    拓扑排序 1定义 2两种拓扑排序算法 2.1kahn算法 2.1dfs算法(染色) 1定义 拓扑排序(Topological Sorting) 给定一张 有向无环图 ,排出所有顶点的一个序列A,满足: ...

  4. 数据结构与算法—最小生成树(Prim算法和Kruskal算法算法详解)

    前言 在数据结构与算法的图论中,(生成)最小生成树算法是一种常用并且和生活贴切比较近的一种算法.但是可能很多人对概念不是很清楚.我们看下百度百科对于最小生成树定义: 一个有 n 个结点的连通图的生成树 ...

  5. dijkstra算法和A*算法

    转自: https://www.cnblogs.com/21207-iHome/p/6048969.html#undefined Dijkstra算法 迪杰斯特拉(Dijkstra)算法是典型的最短路 ...

  6. Kruskal算法和Prim算法

    Kruskal算法和Prim算法 在无向图中,连通且不含圈的图称为树.给定一个无向图G=(V,E),连通G中所有点,且边集使E的子集的树称为G的生成树,其中权值最小的生成树称为最小生成树(MST).构 ...

  7. BF算法和KMP算法

    给定两个字符串S和T,在主串S中查找子串T的过程称为串匹配(string matching,也称模式匹配),T称为模式.这里将介绍处理串匹配问题的两种算法,BF算法和KMP算法. BF算法 (暴力匹配 ...

  8. Prim算法和Kruskal算法

       Prim算法和Kruskal算法都能从连通图找出最小生成树.区别在于Prim算法是以某个顶点出发挨个找,而Kruskal是先排序边,每次选出最短距离的边再找. 一.Prim(普里姆算法)算法: ...

  9. 基于Huffman算法和LZ77算法的文件压缩的改进方向

    基于Huffman算法和LZ77算法的文件压缩(八) 到这里已经简单实现基于Huffman算法和LZ77算法的文件压缩, GitHub源码:点我 根据基于Huffman算法和LZ77算法的文件压缩(七 ...

  10. 使用Apriori算法和FP-growth算法进行关联分析

    目录 1. 关联分析 2. Apriori原理 3. 使用Apriori算法来发现频繁集 4. 使用FP-growth算法来高效发现频繁项集 5. 示例:从新闻网站点击流中挖掘新闻报道 扩展阅读 系列 ...

最新文章

  1. 为什么这些死脑筋们在用 VI ?
  2. AI 崛起的第九个年头,还有哪些大有可为的地方?
  3. 205. jetcache:你需要知道的小技巧
  4. JavaScript实现combine Without Repetitions不重复地结合算法(附完整源码)
  5. [svc][op]从历险压缩日志里网站pv uv统计
  6. [译]震惊!RxJava 5 个不为人知的小秘密
  7. c语言编程微信公众号图片直播,如何以图片的形式在微信公众号文章中添加小程序...
  8. python tkinter_Python编程GUI库之tkinter教程——Label篇
  9. 贼好理解,这个项目教你如何用百行代码搞定各类NLP模型
  10. Texas Instruments Website
  11. Latex表格制作记录
  12. 【OR】ADMMRisk Parity Portfilio Model
  13. bash-記錄修改OFS和ORS讓$0重新計算
  14. nb移动udp_电信NB物联网平台不仁不义有人来管管吗?
  15. 资福医疗大圣磁控胶囊胃镜硬核出镜高交会
  16. android 微信评论功能,Android仿微信朋友圈点击评论自动定位到相关行功能.pdf
  17. seu校园网简易自动登陆教程
  18. 交通灯keil程序加2位数码管_带数码管显示的十字路口交通灯控制 C 程序
  19. 每日一练1.直接排序法
  20. 中国80后美女富豪名单

热门文章

  1. 开学季Web渗透测试工程师精英班“第5期”来袭,加入即永久观看!
  2. HCIE安全笔试-H12-731 V2.0选择题难点解析
  3. MySQL主从配置(Django实现主从配置读写分离)
  4. WinForm自定义ListBox显示样式
  5. 逆向破解必备基础smail基础语法
  6. 更新至2021各省份上传服务器地址(航信、百旺、税务UK)
  7. 二进制,十进制,十六进制转化
  8. 【C】C语言判断是否质数
  9. 头脑王者答题神器,开发思路
  10. 工业物联网与人工智能合体之后 竟把魔爪第一个伸向了她……