python 实现DFS和BFS

##有关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']
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值