深度优先搜索算法的概念

深度优先搜索算法的概念

  与广度优先搜索算法不同,深度优先搜索算法类似与树的先序遍历。这种搜索算法所遵循的搜索策略是尽可能“深”地搜索一个图。它的基本思想如下:首先访问图中某一个起始顶点v,然后由v出发,访问与v相邻且未被访问的任一顶点w1,再访问与w1邻接且未被访问的任一顶点w2,….重复上述过程。当不能再继续向下访问时,依次退回到最近被访问的顶点,若它还有邻接顶点未被访问过,则从该点开始继续上述搜索过程,直到图中所有顶点均被访问过为止(还是举相同的例子,从你开始遍历你的所有亲戚,例如:先访问你的儿子,再从你的儿子继续访问你的儿子的儿子,直到你的儿子是最后一个顶点,再回退回上一层,访问你儿子的女儿,再访问你儿子的女儿的儿子….依此类推,直到你的所有亲戚都被访问过一次为止,这和广度优先搜索的算法区别还是很大的)。 
  

算法伪代码

  DFS采用的是递归的过程,所以这个过程需要一个递归工作的辅助栈,伪代码如下: 
  

bool visited[MAX_VERTEX_NUM];//访问标记数组

void DFSTraverse(Graph G){
//对图G进行深度优先遍历,访问函数为visit()
    for(v=0;v<G.vexnum;++i)
        visited[v]=false;//初始化所有顶点的数据,false表示未曾访问过
    for(v=0;v<G.vexnum;++v)
        if(!visited[v])
            DFS(G,v);//这里从0遍历到最后一个顶点是为了防止有极端情况出现:可能存在顶点wi无法从顶点w0遍历到,所以需要对它也调用一次DFS算法
}

void DFS(Graph G,int v){
//从顶点v出发,采用递归的思想,深度优先遍历图G
    visit(v);//访问顶点v
    visited[v]=true;//设置这个顶点为已经访问过

    for(w=FirstNeighbor(G,v);w>=0;w=NextNeighbor(G,v,w))
        if(!visited[w])
            DFS(G,w);//递归调用查找第一个未被访问的邻接顶点
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

实例及分析

   
  首先访问a,并置a为已经访问;然后访问与a邻接且未被访问的顶点b,置b为已经访问,然后访问与b邻接且未被访问的顶点d,置d为已经访问。此时d已经没有未被访问过的邻接点,这时候返回上一个访问过的顶点b,访问与其邻接且未被访问的顶点e,置e为已经访问……。依此类推,直到途中所有的顶点都被访问一次且仅仅被访问一次,遍历结果为abdehcfg。

DFS算法的性能分析

  DFS算法是一个递归算法,需要借助一个递归工作栈,所以它的空间复杂度是O(|V|)。 
  遍历图的过程实际上是对每个顶点查找其邻接点的过程,其耗费的时间取决于所采用的存储结构,当以邻接矩阵表示时,查找每个顶点的临界点所需时间为O(|V|),故总的时间复杂度为O(|V|2)。当以邻接表表示时,查找所有顶点的邻接点所需时间为O(|E|),访问顶点所需时间为O(|V|),此时,总的时间复杂度为O(|V|+|E|)。

原文地址:https://www.cnblogs.com/SeaTop/p/8776277.html

时间: 2024-11-05 18:41:03

深度优先搜索算法的概念的相关文章

图的深度优先搜索算法DFS

1.问题描述与理解 深度优先搜索(Depth First Search,DFS)所遵循的策略,如同其名称所云,是在图中尽可能"更深"地进行搜索.在深度优先搜索中,对最新发现的顶点v若此顶点尚有未探索过从其出发的边就探索之.当v的所有边都被探索过,搜索"回溯"到从其出发发现顶点v的顶点.此过程继续直至发现所有从源点可达的顶点.若图中还有未发现的顶点,则以其中之一为新的源点重复搜索,直至所有的顶点都被发现.与BFS中源顶点是指定的稍有不同. DFS搜索轨迹Gπ将形成一片

深度优先搜索算法(DFS)以及leetCode的subsets II

深度优先搜索算法(depth first search),是一个典型的图论算法.所遵循的搜索策略是尽可能“深”地去搜索一个图. 算法思想是: 对于新发现的顶点v,如果它有以点v为起点的未探测的边,则沿此边继续探测下去.当顶点v的所有边都已被探寻结束,则回溯到到达点v的先辈节点.以相同方法一直回溯到源节点为止.如果图中还有未被发现的顶点,则选择其中一个作为源顶点,重复以上的过程.最后的结果是一些不相交的深度优先树. leetCode中的应用: Given a collection of integ

深度优先搜索算法

一.深度优先搜索 深度优先搜索算法(Depth First Search),是图论中的经典算法. 深度优先搜索算法是沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当结点所有子结点那一层都被搜索过,再回溯返回到当前结点的邻结点,继续搜索,直到遍历完整棵树.一般采用的是前序遍历,先根然后再左右结点的方式进行. 任何DFS只需要通过下面几步就可以实现,无论是递归还是非递归方式.我给这几步分别做了一个命名,分别是find.forward.done.back. 如下: 1.find(right):在树

广度优先、深度优先搜索算法——面试题

广度优先搜索(Breadth-first Search) BFS在求解最短路径或者最短步数上有很多的应用.应用最多的是在走迷宫上. 分析 树的定义本身就是一种递归定义,因此对于树相关的算法题,递归是最好的解决思路(在递归深度允许的情况下). 递归版 public class Solution { public boolean isSymmetric(TreeNode root) { return root==null||isMirror(root.left,root.right); } priv

广度/深度优先搜索算法 - python实现

1. 图 定义:图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合. 简单点的说:图由节点和边组成.一个节点可能与众多节点直接相连,这些节点被称为邻居. 如二叉树就为一个简单的图: 更加详细的信息可参见:https://www.cnblogs.com/polly333/p/4760275.html 2. 算法 1). 广度优先搜索: 广度优先搜索算法(Breadth First Search,BSF

DFS --- Depth First Search 深度优先搜索算法

Depth First Search 原理还是去看<DSAA>,这里着重分析实现策略. 如果对于图这种数据结构不熟悉,这个BFS一般是搞不定的... 下面分别是无向图的邻接表实现和邻接矩阵实现 http://blog.csdn.net/cinmyheart/article/details/41381845 http://blog.csdn.net/cinmyheart/article/details/41370465 --------------------------------------

广度优先和深度优先搜索算法

#include <iostream> #include <stdlib.h> #include <vector> #include <string> #include <queue> #include <stack> using namespace std; //邻接矩阵显示图 void show_graph(vector<vector<int>> &graph) { for (int i = 0;

深度优先搜索算法基础模板

1 void DFS(检索状态) 2 { 3 if(到达目标状态) 4 { 5 ...// 根据题意添加 6 return; 7 } 8 9 if(越界或是不合法状态) return; 10 11 for(扩展方式) 12 { 13 if(扩展方式所达到状态合法) 14 { 15 ....//根据题意来添加 16 标记; 17 DFS(); // 递归调用 18 修改(剪枝); 19 还原标记; 20 //是否还原标记根据题意 21 //如果加上(还原标记)就是 回溯法 22 } 23 } 24

C#深度优先搜索算法demo

//论文要用到其改进算法,在此先demo测试一下using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DFS { class Program { public int[,] map = new int[100, 100]; public int[] road = new int[120]; publi