博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深度优先搜索算法(Depth-First-Search,DFS)
阅读量:6002 次
发布时间:2019-06-20

本文共 1076 字,大约阅读时间需要 3 分钟。

深度优先搜索算法的概念

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

(举个例子,从你开始遍历你的所有亲戚,例如:先访问你的儿子,再从你的儿子继续访问你的儿子的儿子,直到你的儿子是最后一个顶点,再回退回上一层,访问你儿子的女儿,再访问你儿子的女儿的儿子….依此类推,直到你的所有亲戚都被访问过一次为止,这和广度优先搜索的算法区别还是很大的)。
  

算法伪代码

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

  

bool visited[MAX_VERTEX_NUM];//访问标记数组void DFSTraverse(Graph G){//对图G进行深度优先遍历,访问函数为visit()    for(v=0;v
=0;w=NextNeighbor(G,v,w)) if(!visited[w]) DFS(G,w);//递归调用查找第一个未被访问的邻接顶点}

实例及分析

1143923-20170825115358246-1544119731.png

  深度优先遍历

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

DFS算法的性能分析

  DFS算法是一个递归算法,需要借助一个递归工作栈,所以它的空间复杂度是O(|V|)。

  遍历图的过程实际上是对每个顶点查找其邻接点的过程,其耗费的时间取决于所采用的存储结构,当以邻接矩阵表示时,查找每个顶点的临界点所需时间为O(|V|),故总的时间复杂度为O(|V|²)。当以邻接表表示时,查找所有顶点的邻接点所需时间为O(|E|),访问顶点所需时间为O(|V|),此时,总的时间复杂度为O(|V|+|E|)。

转载于:https://www.cnblogs.com/Neo007/p/7427316.html

你可能感兴趣的文章
Android视图的截图
查看>>
App列表之分组ListView
查看>>
Android&iOS崩溃堆栈上报
查看>>
关于iOS开发的各种证书
查看>>
【Openjudge】 算24
查看>>
lvreduce -L 1000M /dev/vg0/lv0 表示最后缩减至多大,不是减少了多大
查看>>
ES 自动恢复分片的时候不恢复了是磁盘超过了85%,然后不恢复了 ES可以配置多个数据目录...
查看>>
linux查杀病毒的几个思路
查看>>
宽带速度
查看>>
构建之法阅读笔记5
查看>>
Android判断网络连接状态
查看>>
leetcode_1033. Moving Stones Until Consecutive
查看>>
logback logback.xml常用配置详解(二)<appender>
查看>>
js常用的函数库
查看>>
Sqlserver 数据库安全
查看>>
netstat命令简单使用
查看>>
Python标示符命名规则
查看>>
SSL certificate problem unable to get local issuer certificate解决办法
查看>>
20145209 刘一阳 《网络对抗》实验四:恶意代码分析
查看>>
个人学期总结
查看>>