一.DFS 深度优先搜索算法(Depth First Search,简称DFS)
1.简介:
一种用于遍历搜索图或者树的算法,从一个未访问的顶点 V 开始,沿着一条路一直走到底,然后从这条路尽头的节点回退到上一个节点, 再从另一条路开始走到底…,不断递归重复此过程,直到所有的顶点都遍历完成。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。
2.基本思想:(结合了我自己的理解)
不撞南墙不回头的走法,最终遍历完所有顶点
3.适用情景:
找到一个结果是否存在(因为DFS的遍历较为彻底)
4.算法流程
STEP1:表示图:
以某种数据结构来表示图。通常可以使用邻接表或邻接矩阵。在Python中,可以使用字典来表示邻接表,或者二维列表来表示邻接矩阵。
STEP2:初始化:
初始化一个栈(可以使用Python中的列表模拟栈),以及一个集合或列表来记录已经访问过的节点
STEP3:DFS函数
(1)将起始节点标为已访问,并将其入栈
(2)进入循环直到栈为空
(3)弹出栈顶结点
(4) 遍历该结点的所有相邻结点
(5)如果相邻结点没有被访问过,将其标记为已访问并入栈
STEP4:主程序
编写主程序来调用DFS函数,并传递图的表示、起始节点等参数。
以下为python代码的实现:
(这里的代码参考了莫失莫忘--CSDN博客大家也可以去原博主那里看一下,写的很详细!)
grap = {
"A":["B","C","D"],
"B":["E","F","G"],
"C":[],
"D":["I","K"]
}
#存图
def DFS(grap,star): #DFS算法
stack = [] #定义一个栈
seen = set() #建立一个集合,集合就是用来判断该元素是不是已经出现过
stack.append(star) #将任一个节点放入
seen.add(star) #同上
while (len(stack)>0) : #当队列里还有东西时
ver = stack.pop() #取出栈顶元素 !!!!这里也就是与BFS的不同
notes = grap[ver] #查看grep里面的key,对应的邻接点
for i in notes: #遍历邻接点
if i not in seen: #如果该邻接点还没出现过
stack.append(i) #存入stack
seen.add(i) #存入集合
print(ver) #打印栈顶元素
print(DFS(grap,"K"))