美文网首页
深度与广度优先搜索

深度与广度优先搜索

作者: 眼君 | 来源:发表于2021-08-27 09:26 被阅读0次

    深度优先搜索(Depth-First Search / DFS)

    基本思想

    深度优先搜索,从起点出发,从规定的方向中选择其中一个不断地向前走,直到无法继续为止,然后尝试另外一种方向,直到最后走到终点。就像走迷宫一样,尽量往深处走。
    DFS 解决的是连通性的问题,即,给定两个点,一个是起始点,一个是终点,判断是不是有一条路径能从起点连接到终点。起点和终点,也可以指的是某种起始状态和最终的状态。问题的要求并不在乎路径是长还是短,只在乎有还是没有。有时候题目也会要求把找到的路径完整的打印出来。

    广度优先搜索(Breadth-First Search / BFS)

    基本思想

    广度优先搜索,一般用来解决最短路径的问题。和深度优先搜索不同,广度优先的搜索是从起始点出发,一层一层地进行,每层当中的点距离起始点的步数都是相同的,当找到了目的地之后就可以立即结束。
    广度优先的搜索可以同时从起始点和终点开始进行,称之为双端 BFS。这种算法往往可以大大地提高搜索的效率。

    代码实现

    假设我们有这么一个图,里面有A、B、C、D、E、F、G、H 8 个顶点,点和点之间的联系如下图所示,对这个图进行深度优先和广度优先的遍历。


    from collections import deque
    
    class Solution:
        def __init__(self):
            self.graph = {}
            self.graph['A'] = ['B','D','G']
            self.graph['B'] = ['A','E','F']
            self.graph['C'] = ['F','H']
            self.graph['D'] = ['A','F']
            self.graph['E'] = ['B','G']
            self.graph['F'] = ['B','C','D']
            self.graph['G'] = ['A','E']
            self.graph['H'] = ['C']
            
            self.done = {}
            self.done['A'] = 1
            self.done['B'] = 1
            self.done['C'] = 1
            self.done['D'] = 1
            self.done['E'] = 1
            self.done['F'] = 1
            self.done['G'] = 1
            self.done['H'] = 1
            
        def DFS(self):
            stack = []
            stack.append('A')
            self.done['A'] = 0
            print('已经访问过A!')
            
            while stack:
                t = 0
                for i in self.graph[stack[-1]]:
                    t += self.done[i]
                if t == 0:
                    stack.pop()
                    continue
                
                for i in self.graph[stack[-1]]:
                    if self.done[i]:
                        self.done[i] = 0
                        stack.append(i)
                        print('已经访问过'+i+'!')
                        print(stack)
                        break
            print('遍历完成')
        
        def BFS(self):
            queue = deque()
            queue.append('A')
            self.done['A'] = 0
            print('已经访问过A!')
            
            while queue:
                for i in self.graph[queue.popleft()]:
                    if self.done[i]:
                        self.done[i] = 0
                        queue.append(i)
                        print('已经访问过'+i+'!')
                        print(queue)
    
                
    if __name__ == '__main__':
        s = Solution()
        s.BFS()
    

    相关文章

      网友评论

          本文标题:深度与广度优先搜索

          本文链接:https://www.haomeiwen.com/subject/fxjuiltx.html