深度优先搜索

Posted hitycy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度优先搜索相关的知识,希望对你有一定的参考价值。

深度优先搜索也叫DFS。是一种常见的图搜索(遍历)方法。该方法秉承着不到黄河心不死的思路对图中个点进行遍历搜索。

思想:

  先沿着一条路遍历(查询)直到这条路不能走的时候,我们再回退到可以走位置继续遍历(查询)

方法(不给详细代码给思路,具体问题有增减很正常):

  首先我们遍历的是一个图。G(V,E),G代表该图,V是点的集合,E是边的集合。

  1.递归的:

    函数1:

      1.建立一个数组保存所有点的状况。(是否被遍历过)

      2.建立一个数组保存每个点遍历的顺序(就是一个int数组记录第一个点是第几个被遍历的,或者hashMap用点名和他的顺序一一对应)。

      3.建立代表初始编号的变量并初始化为1(2,3步如果不在乎顺序可以不用操作)

      4.遍历每个点,如果该点没有被访问过,就对该点调用函数2(你可能会想肯定都没有访问过啊,但是在调用函数2时会访问部分后续的节点)

    函数2:

      1.标记调用点已访问(记录在状态数组中)

      2.记录该点的为第几个遍历的,然后使记录顺序的变量加1(结合函数1看是否需要)

      3.如果该点是查询的点输出信息并停止(遍历就无视这步)

      4.对该点的所有未被访问(就是你没有在状态数组中标记的)的邻接点调用函数2

  2.非递归的我们使用栈来储存只用一个函数就可以了

    函数3:

      1.建立一个栈来储存点

      2.同样需要状态数组

      3.记录编号的数组同上

      4.初始编号为1(3,4依然随情况决定要还是不要)

      2.将第一个点压入栈中(没有要求就随意取一个点)

      3.当栈不为空时循环做以下的操作(缩进表示循环)

        4.将栈首元素出栈,如果要查询就检查该点与需要查询的点是否一致,一致就停止。不需要的话就只出栈。

        5.将该点标记为已访问,记录其编号。

        6.将其所有的没有访问的邻接点压入栈中。

      

  时间复杂度;

        1.使用临接矩阵O(n^2),因为在寻找临接点这步操作的时候临接矩阵会查看所有的点

        2.使用临接表O(n+e)因为所有定点的临接点之和就相当于两倍的边。n+2e属于O(n+e)

以上是关于深度优先搜索的主要内容,如果未能解决你的问题,请参考以下文章

基本算法——深度优先搜索(DFS)和广度优先搜索(BFS)

深度优先搜索算法解释下?

简述深度优先搜索遍历的方法。

Python算法-深度优先搜索&广度优先搜索(DFS&BFS)

图的广度、深度优先搜索和拓扑排序

算法题——深度优先搜索与广度优先搜索