BFS算法和DFS算法(含图解:简单易懂)
图解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算法(含图解:简单易懂)相关推荐
- 拓扑排序(Topological Sorting):Kahn 算法和 DFS 算法
拓扑排序(Topological Sorting):Kahn 算法和 DFS 算法 Kahn 算法 DFS 算法 拓扑排序(TopoSort)有相当广泛的应用,比如依赖关系分析.图是否有环的检测.编译 ...
- 拓扑排序的两种实现:Kahn算法和dfs算法
本文将从以下几个方面介绍拓扑排序: 拓扑排序的定义和前置条件 和离散数学中偏序/全序概念的联系 典型实现算法 Kahn算法 基于DFS的算法 解的唯一性问题 实际例子 取材自以下材料: http:// ...
- 拓扑排序(kahn算法和dfs算法)
拓扑排序 1定义 2两种拓扑排序算法 2.1kahn算法 2.1dfs算法(染色) 1定义 拓扑排序(Topological Sorting) 给定一张 有向无环图 ,排出所有顶点的一个序列A,满足: ...
- 数据结构与算法—最小生成树(Prim算法和Kruskal算法算法详解)
前言 在数据结构与算法的图论中,(生成)最小生成树算法是一种常用并且和生活贴切比较近的一种算法.但是可能很多人对概念不是很清楚.我们看下百度百科对于最小生成树定义: 一个有 n 个结点的连通图的生成树 ...
- dijkstra算法和A*算法
转自: https://www.cnblogs.com/21207-iHome/p/6048969.html#undefined Dijkstra算法 迪杰斯特拉(Dijkstra)算法是典型的最短路 ...
- Kruskal算法和Prim算法
Kruskal算法和Prim算法 在无向图中,连通且不含圈的图称为树.给定一个无向图G=(V,E),连通G中所有点,且边集使E的子集的树称为G的生成树,其中权值最小的生成树称为最小生成树(MST).构 ...
- BF算法和KMP算法
给定两个字符串S和T,在主串S中查找子串T的过程称为串匹配(string matching,也称模式匹配),T称为模式.这里将介绍处理串匹配问题的两种算法,BF算法和KMP算法. BF算法 (暴力匹配 ...
- Prim算法和Kruskal算法
Prim算法和Kruskal算法都能从连通图找出最小生成树.区别在于Prim算法是以某个顶点出发挨个找,而Kruskal是先排序边,每次选出最短距离的边再找. 一.Prim(普里姆算法)算法: ...
- 基于Huffman算法和LZ77算法的文件压缩的改进方向
基于Huffman算法和LZ77算法的文件压缩(八) 到这里已经简单实现基于Huffman算法和LZ77算法的文件压缩, GitHub源码:点我 根据基于Huffman算法和LZ77算法的文件压缩(七 ...
- 使用Apriori算法和FP-growth算法进行关联分析
目录 1. 关联分析 2. Apriori原理 3. 使用Apriori算法来发现频繁集 4. 使用FP-growth算法来高效发现频繁项集 5. 示例:从新闻网站点击流中挖掘新闻报道 扩展阅读 系列 ...
最新文章
- 为什么这些死脑筋们在用 VI ?
- AI 崛起的第九个年头,还有哪些大有可为的地方?
- 205. jetcache:你需要知道的小技巧
- JavaScript实现combine Without Repetitions不重复地结合算法(附完整源码)
- [svc][op]从历险压缩日志里网站pv uv统计
- [译]震惊!RxJava 5 个不为人知的小秘密
- c语言编程微信公众号图片直播,如何以图片的形式在微信公众号文章中添加小程序...
- python tkinter_Python编程GUI库之tkinter教程——Label篇
- 贼好理解,这个项目教你如何用百行代码搞定各类NLP模型
- Texas Instruments Website
- Latex表格制作记录
- 【OR】ADMMRisk Parity Portfilio Model
- bash-記錄修改OFS和ORS讓$0重新計算
- nb移动udp_电信NB物联网平台不仁不义有人来管管吗?
- 资福医疗大圣磁控胶囊胃镜硬核出镜高交会
- android 微信评论功能,Android仿微信朋友圈点击评论自动定位到相关行功能.pdf
- seu校园网简易自动登陆教程
- 交通灯keil程序加2位数码管_带数码管显示的十字路口交通灯控制 C 程序
- 每日一练1.直接排序法
- 中国80后美女富豪名单