浅析DFS与BFS的异同/图的和深度优先遍历和广度优先遍历有什么不同
文章目录
- 一、深度优先遍历(DFS)
- 1.定义
- 二、广度优先遍历(BFS)
- 1.定义
- 三、异同
- 1.相同点
- 2.不同点
- (1)DFS
- (2)BFS
浅析DFS与BFS的异同,图的和深度优先遍历和广度优先遍历有什么不同,DFS与BFS有什么区别?时间复杂度是多少?
一、深度优先遍历(DFS)
1.定义
图的深度优先搜索遍历(DFS)类似于二叉树的先序遍历。它的基本思想是:首先访问出发点v,
并将其标记为已访问过;然后选取与v邻接的未被访问的任意一个顶点w,并访问它:再选取与w邻接
的未被访问的任一项点并访问,以此重复进行。当一个顶点所有的邻接顶点都被访问过时,则依次退回到最近被访问过的顶点,若该顶点还有其他邻接顶点未被访问,则从这些未被访问的顶点中取一一个并重复上述访问过程,直至图中所有顶点都被访问过为止。图7-8所示即为一个图的深度优先搜索遍历过程。
图及定义摘自天勤,天勤no.1.
二、广度优先遍历(BFS)
1.定义
图的广度优先搜索遍历(BFS) 类似于树的层次遍历。它的基本思想是:首先访问起始顶点V,然
后选取与v邻接的全部顶点w,… w。进行访问,再依次访问与WI,… w。邻接的全部顶点(已经
访问过的除外),以此类推,直到所有顶点都被访问过为止。
广度优先搜索遍历图的时候,需要用到一一个队列(二叉树的层次遍历也要用到队列),算法执行过程
可简单概括如下:
1)任取图中一个顶点访问,入队,并将这个顶点标记为已访问;
2)当队列不空时循环执行:出队,依次检查出队顶点的所有邻接顶点,访问没有被访问过的邻接顶
点并将其入队;
3)当队列为空时跳出循环,广度优先搜索即完成。
三、异同
1.相同点
时间复杂度是相同的!
时间复杂度是相同的!
时间复杂度是相同的!
书上没有明确指明这一点,但是严奶奶的数据结构写到:
图源https://www.cnblogs.com/hi3254014978/p/12627861.html
2.不同点
(1)DFS
- 提供回溯,可以更新,完成并查集等算法
- 适用于有条件约束的问题,如棋盘问题
- 可以判断是否连通
(2)BFS
- 求最短路径
- 迷宫问题等
先挖个坑,有机会再逐渐补充完善。
打盹儿: 谢谢
小飞侠也会emo: 伸手党向您鞠躬,好人一生平安
.吃月亮的人.: optimizer.param_groups[0]['lr']
江南蜡笔小新: 是的 logSoftmax+NllLoss是常用的做法,可能是当时看差了,已更正
YANGN1: 说反了吧,现在softmax下面是这句This module doesn’t work directly with NLLLoss, which expects the Log to be computed between the Softmax and itself. Use LogSoftmax instead (it’s faster and has better numerical properties).