【算法】深度优先和广度优先

本文只是总结的相关概念,仅供自己复习,严禁转载,文末附有本文内容涉及的文章链接,请点开链接查看原文!

(一)深度优先

      深度优先搜索属于图算法的一种,是一个针对图和树的遍历算法,英文缩写为DFS(Depth First Search)。深度优先搜索利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题,如最大路径问题等等。一般用堆数据结构来辅助实现DFS算法。

      文字描述过程:广度优先搜索在进一步遍历图中顶点之前,先访问当前顶点的所有邻接结点。

      a .首先选择一个顶点作为起始结点,并将其染成灰色,其余结点为白色。

      b. 将起始结点放入队列中。

      c. 从队列首部选出一个顶点,并找出所有与之邻接的结点,将找到的邻接结点放入队列尾部,将已访问过结点涂成黑色,没访问过的结点是白色。如果顶点的颜色是灰色,表示已经发现并且放入了队列,如果顶点的颜色是白色,表示还没有发现

      d. 按照同样的方法处理队列中的下一个结点。 基本就是出队的顶点变成黑色,在队列里的是灰色,还没入队的是白色。

      其过程简要来说是沿着树的深度遍历树的节点,对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。没次选择一个未被发现的节点作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止

 

                                           【算法】深度优先和广度优先_第1张图片

    对于上图的树而言,DFS方法首先从根节点1开始,其搜索节点顺序是1,2,3,4,5,6,7,8假定左分枝和右分枝中优先选择左分枝。访问顺序如下:

【算法】深度优先和广度优先_第2张图片

(二)广度优先

      广度优先搜索/宽度优先搜索,缩写BFS,是连通图的一种遍历算法这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。

     文字描述过程:深度优先搜索在搜索过程中访问某个顶点后,需要递归地访问此顶点的所有未访问过的相邻顶点。 初始条件下所有节点为白色,选择一个作为起始顶点,按照如下步骤遍历:

      a. 选择起始顶点涂成灰色,表示还未访问

      b. 从该顶点的邻接顶点中选择一个,继续这个过程(即再寻找邻接结点的邻接结点),一直深入下去,直到一个顶点没有邻接结点了,涂黑它,表示访问过了

      c. 回溯到这个涂黑顶点的上一层顶点,再找这个上一层顶点的其余邻接结点,继续如上操作,如果所有邻接结点往下都访问过了,就把自己涂黑,再回溯到更上一层。

     d. 上一层继续做如上操作,知道所有顶点都访问过。

      属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。基本过程,BFS是从根节点开始,沿着树(图)的宽度遍历树(图)的节点。如果所有节点均被访问,则算法中止。一般用队列数据结构来辅助实现BFS算法。

                                             【算法】深度优先和广度优先_第3张图片

     对于上图的树而言,从1到7的最短路径用BFS求最短路径,首先从根节点1开始访问顺序如下,每走一步记录步数,最短路径为1-》4-》7:

【算法】深度优先和广度优先_第4张图片

(三)区别

      深度优先搜索是每次从中弹出一个元素,搜索所有在它下一级的元素,把这些元素压入栈中。并把这个元素记为它下一级元素的前驱,找到所要找的元素时结束程序。

      从一个顶点v出发,选择邻接于v的尚未达到的顶点u,如果这样的u不存在,则搜索终止。如果u存在,那么从u又开始一个新的DFS,也就是递归。

     广度优先搜索是每次从队列的头部取出一个元素,查看这个元素所有的下一级元素,把它们放到队列的末尾。并把这个元素记为它下一级元素的前驱,找到所要找的元素时结束程序。

     广度优先的搜索方式就是从一个顶点v出发,先搜索所有邻接于顶点v的顶点集合,这算一回搜索,第二回搜索以邻接于顶点v的集合点出发,开始搜索所有邻接于这些顶点的邻接点。

注:在谈论两者的适用情况可以通过一下方面探讨

      1: 空间复杂度:广优的话,占内存多,能找到最优解,必须遍历所有分枝. 广优的一个应用就是迪科斯彻单元最短路径算法.深优的话,占内存少,能找到最优解(一定条件下),但能很快找到接近解(优点),可能不必遍历所有分枝(也就是速度快), 深优的一个应用就是连连看游戏.

     2: 时间复杂度:最差情形下,BFS必须查找所有到可能节点的所有路径。

     3:完全性:广度优先搜索算法具有完全性。这意指无论图形的种类如何,只要目标存在,则BFS一定会找到。然而,若目标不存在,且图为无限大,则BFS将不收敛(不会结束)。

    4:最佳解:若所有边的长度相等,广度优先搜索算法是最佳解——亦即它找到的第一个解,距离根节点的边数目一定最少;但对一般的图来说,BFS并不一定回传最佳解。这是因为当图形为加权图(亦即各边长度不同)时,BFS仍然回传从根节点开始,经过边数目最少的解;而这个解距离根节点的距离不一定最短。这个问题可以使用考虑各边权值,BFS的改良算法成本一致搜索法来解决。然而,若非加权图形,则所有边的长度相等,BFS就能找到最近的最佳解。

参考文章:

https://www.jianshu.com/p/bff70b786bb6

https://zhidao.baidu.com/question/468967354.html

https://blog.csdn.net/Jeff_Winger/article/details/80911480

https://www.jianshu.com/p/b086986969e6

你可能感兴趣的:(算法)