##有关DFS和BFS的理解我写在了这里
https://www.jianshu.com/p/4cf661fd3f56
在这里补上python实现的过程
首先生成举例子用的图结构
graph={
'S':['A','D'],
'A':['S','D','B'],
'D':['S','A','E'],
'B':['A','E','C'],
'E':['B','F'],
'F':['E','G'],
'C':['B'],
'G':['F']
}
编程思想就是简单粗暴的按照节点一个一个查询
def bfs(graph,start,destination):
pathes = [[start]]
check = set()
while pathes:
path = pathes.pop(0)
nextcheck = path[-1]
if nextcheck in check: continue
success = graph[nextcheck]
for i in success:
if i in path: continue
new_path = path+[i]
pathes.append(new_path)
if i == destination:
return new_path
check.add(nextcheck)
我们来看输出
bfs(graph,'S''C')
#输出结果:['S', 'A', 'B', 'C']
由此可以简单的分析一下结果的生成过程:
1 首先查询节点 ‘S’, 里面的‘A’, ‘D’ 不是想要的结果C
2 将‘A’作为新的节点进行查询,‘S’, ‘D’, ‘B’,不符合条件
将‘D’作为新的节点进行查找,‘S’, ‘A’, ‘E’, 不符合条件
3 继续查找,把由’A’节点查到的元素依次当作节点查找,这时候我们知道由于set()函数的存在,避免了重复查找,直接跳到查找‘B’,叮找到了目标元素’C’,输出返回结果
下面我们来看深度优先,深度优先和广度优先的区别就是对于下一个节点的查找顺序是不一样的,深度优先是顺着一条线路查找完成,我们可以知道那就是在定义new_path时改变一下顺序就好了,代码如下:
def bfs(graph,start,destination):
pathes = [[start]]
check = set()
while pathes:
path = pathes.pop(0)
nextcheck = path[-1]
if nextcheck in check: continue
success = graph[nextcheck]
for i in success:
if i in path: continue
#注意:这里不一样
new_path = [i]+path
pathes.append(new_path)
if i == destination:
return new_path
check.add(nextcheck)
我们来看输出结果:
dfs(graph,'S','C')
#输出['S', 'D', 'E', 'B', 'C']