BFS,DFS一行代码的区别
BFS
宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。
最大的特点是1.使用队列实现,2.逐层搜索,3.可以产生最短路径
构建的步骤:
1.从某个给定的起点开始
2.不满足结束条件时令起点的邻居节点进入队列
3.队列不空则出队,对出队元素进行检验,不满足结束条件,该元素邻居节点进入队列
重复2 → \rightarrow → 3
BFS实例
我们使用下例来说明:
邻接表实现图的bfs
graph = {}
graph[1]=[2,3]
graph[2]=[5]
graph[5]=[4]
graph[3]=[4]
def BFS(graph,star,end):
step = 0
queue = []
#记录进队的节点
Rem=[]
#检查起点
#起点进队
queue.append(star)
#执行步骤2
while queue!=[]:
n =queue.pop(0)
#检查起点
if n==end:
return step
elif end in graph[n]:
return step
else:
queue = queue + graph[n]
step +=1
BFS(graph,1,4)
邻接矩阵实现图的bfs
def BFS(matrix,star,end):
queue = []
step = 0
queue.append(star-1)
while queue!=[]:
n = queue.pop(0)
if matrix[n][end-1]==1:
return step
else:
new_num = [i for i in range(len(matrix[n])) if matrix[n][i]==1]
queue = queue + new_num
step = step + 1
matrix=[[0,1,1,0,0],[0,0,0,0,1],[0,0,0,1,0],[0,0,0,0,0],[0,0,0,1,0]]
BFS(matrix,1,4)
DFS
深度优先搜索算法(英语:Depth-First-Search,简称DFS)是一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。(Wiki)
(直到走不下去才往回走)
最大的特点是1.使用栈实现,2.逐个分支搜索,3.每次都搜索到最深路径
构建的步骤:
1.从某个给定的起点开始
2.不满足结束条件时令起点的邻居节点进入栈
3.队列不空则出队,对出队元素进行检验,不满足结束条件,该元素邻居节点进入栈
重复2 → \rightarrow → 3
**注:**可以明显注意到dfs和bfs几乎没有任何区别,只是在使用的结构不同
DFS实例
我们使用下例来说明:
邻接表实现图的dfs
graph = {}
graph[1]=[2,3]
graph[2]=[5]
graph[5]=[4]
graph[3]=[4]
def BFS(graph,star,end):
step = 0
queue = []
#记录进队的节点
Rem=[]
#检查起点
#起点进队
queue.append(star)
#执行步骤2
while queue!=[]:
n =queue.pop()###################唯一修改的地方
#检查起点
if n==end:
return step
elif end in graph[n]:
return step
else:
queue = queue + graph[n]
step +=1
BFS(graph,1,4)
邻接矩阵实现图的dfs
def BFS(matrix,star,end):
queue = []
step = 0
queue.append(star-1)
while queue!=[]:
n = queue.pop()###########################唯一修改
if matrix[n][end-1]==1:
return step
else:
new_num = [i for i in range(len(matrix[n])) if matrix[n][i]==1]
queue = queue + new_num
step = step + 1
matrix=[[0,1,1,0,0],[0,0,0,0,1],[0,0,0,1,0],[0,0,0,0,0],[0,0,0,1,0]]
BFS(matrix,1,4)
注
上面的代码并没有实现bfs和dfs不重复访问的功能,但核心原理已经实现