BFS,DFS一行代码的区别

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不重复访问的功能,但核心原理已经实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值