DFS&BFS

DFS&BFS

1.深度优先搜索

DFS解决什么问题

DFS解决的是连通性问题,即给定一个起始点(或某种起始状态)和一个终点(或某种最终状态),判断是否有一条路径能从起点连接到终点

很多情况下,连通的路径有很多条,只需要找出一条即可,DFS只关心路径存在与否,不在乎其长短

算法的思想

从起点出发,选择一个可选方向不断向前,直到无法继续为止

然后尝试另外一种方向,直到最后走到终点
深度优先搜索借助地数据结构是栈
在这里插入图片描述
DFS的递归实现
利用递归去实现DFS可以让代码看上去很简洁
递归的时候需要将当前程序种的变量以及状态压入到系统的栈里面
压入和弹出栈都需要较多的时间,如果需要压入很深的栈,会造成运行效率低下
DFS的非递归实现
栈的数据结构也支持压入和弹出操作
完全可以利用栈来提高运行效率
DFS复杂度分析
由于DFS是图论里的算法,分析利用DFS解题的复杂度,应当借用图论的思想,图有两种表达方式:

  1. 邻接表(图里有V个顶点,E条边)
    访问所有顶点的时间为O(V),查找所有顶点的邻居的时间为O(E),所以总的时间复杂度为O(V+E)

  2. 邻接矩阵(图里有V个顶点,E条边)
    查找每个顶点的邻居需要O(V)的时间,所有查找整个矩阵的时候需要O( V 2 V^2 V2)的时间

2.广度优先搜索

广度优先搜索一般用来解决最短路径的问题
广度优先的搜索是从起始点开始,一层一层地进行
每层当中地点距离起始点地步数都是相同的
双端BFS
同时从起始点和终点开始进行的广度优先的搜索称为双端BFS
双端BFS可以大大地提高搜索地效率
例如,想判断社交应用程序中两个人之间需要经历多少朋友介绍才能互相认识
广度优先搜索借助地数据结构是队列
在这里插入图片描述
BFS复杂度分析
由于BFS是图论里的算法,分析利用BFS解题的复杂度时,应当借用图论的思想,图有两种表示方式

  1. 邻接表(图里有V个顶点,E条边)
    每个顶点都需要被访问一次,因此时间复杂度时O(V),在访问每个顶点的时候,与它相连的顶点(也就是每条边)也都要被访问一次,所以加起来就是O(E),因此整体时间复杂度为O(V+E)

  2. 邻接矩阵(图里有V个顶点,E条边)
    由于有V个顶点,每次都要检查每个顶点与其他顶点是否有联系,因此时间复杂度为O( V 2 V^2 V2)

猜你喜欢

转载自blog.csdn.net/wqs12345612/article/details/114108153