泛运筹理论初探——图论BFS和DFS简介

图论-图论算法之BFS和DFS

图论经典算法简介之DFS和BFS
    之前在图论的文章里介绍过图的基本概念,包括各类有向图、无向图;有权图、无权图;连通图、非连通图、强连通图等概念,以及介绍了图的degree也就是度的定义,这些其实都是一种图的拓扑结构和基本的几何性质。有了之前的概念以后,我们在本次文章中将会介绍图论里面最简单的两种算法,这两种算法是属于搜索类的算法,在很多场景都会使用,比如知识图谱的搜索引擎、爬虫等,因为互联网天生就是一种图的结构,下面我们来具体介绍一下深度优先算法DFS和广度优先算法BFS。
    首先介绍的是BFS广度优先算法,这种算法其实顾名思义就是每一次遍历的是当前节点的一阶子节点,也就是周围的距离是1的节点,第二次遍历的是二阶子节点,也就是周围距离是2的节点,这种遍历方法有点像树的按层遍历,因为它其实是有一种从中心向外扩的思路。而在遍历的过程中,它借助了队列的结构进行处理,那么BFS算法它的步骤如下:
在这里插入图片描述
    1、初始化所有的参数,并且拿到一个图,将所有的点的Flag标记为0,然后随机选择一个点作为遍历的起点,将它的Flag标记为1,并将该起始点放到一个队列Queue里面,到此第一步结束。
    2、找到和当前起始点所有相邻的顶点,也就是步长为1的顶点,或者说是直接和起始点相连的顶点,将这些点的Flag都标记为1,也就是进入了队列但是还没访问过,而之前的起始点的Flag标记为-1,也就是已经访问过并且已经离开了搜索队列。而那些标记为0的顶点,就是还没被发现的顶点。
    3、按步骤2进行循环处理,直到找到我们需要的那个顶点,如果没有找到则结束,如果找到那个顶点也结束该算法的程序。
    其次介绍的是DFS深度优先算法,这种算法从名字上看也很简单,其实就是选择一个点一直去访问和它连通的点,直到和当前的点相邻的点都访问过后,随机换一个没有访问过的点进行访问。而在遍历的过程中,它借助了栈的结构进行处理,那么DFS算法它的步骤如下:
在这里插入图片描述
    1、初始化所有的参数,并且拿到一个图,将所有的点的Flag标记为0,然后随机选择一个点作为遍历的起点,将它的Flag标记为1,并将该起始点放到一个栈Stack里面,到此第一步结束。
    2、找到和当前节点相邻的一个点,将它的Flag标记为1,然后入到栈里面,继续寻找相邻点的未被访问的相邻节点,找到后标记为1,继续入栈。
    3、重复步骤2,直到所有相邻节点的相邻节点都被访问过并且在栈里面,然后开始出栈,出栈操作后继续判断当前栈顶的节点是否有未被访问的节点,如果有就标记为1然后进栈;没有的话就出栈。
    4、重复步骤2和步骤3,直到我们找到需要的那个节点,如果找遍全图都没有找到就结束,当前如果找到那个节点也结束该算法的程序。
    总的来说,这两种算法是图论非常经典的算法,在图结构的搜索里面比较常用,对于不同的问题和场景可以使用不同的算法,但是前提是对于这两种算法要有一定的理论认识和步骤的认识。在后续的文章里我们还会介绍其他经典的图论算法,在深度学习、知识图谱等飞速发展的背景下,初学者需要了解一些图论的算法,从而方便自己的工作和学习。

猜你喜欢

转载自blog.csdn.net/qq_26727101/article/details/112387766