什么是”搜索算法“?
- 算法是作用于具体数据结构之上的,深度优先搜索算法和广度优先搜索算法都是基于”图“这种数据结构的。这是因为,图这种数据结构的表达能力很强,大部分设计搜索的场景都可以抽象成”图“。
- 图上的搜索算法,最直接的理解就是,在图中能找到从一个顶点出发,到另一个顶点的路径。具体方法有很多,最简单、最”暴力“的深度优先、广度优先搜索,还有A*、IDA*等启发式搜索算法。
广度优先搜索(BFS)
- 广度优先搜索(Breadth-Firsr-Search)简称:BFS
- 它其实就是一种”地毯式“搜索策略,即先查找离顶点最近的,然后是次近的,依次往外搜索.
- 广度优先搜索算法的时间、空间复杂度:
- 最坏情况下,终止顶点t离起始顶点s很远,需要遍历完整个图才能找到。这个时候,每个顶点都要进出一遍队列,每个边也会被访问一次,所以,广度优先搜索的时间复杂度是O(V+E),V表示顶点个数,E表示边的个数。当然,对于一个连通图来说,也就是说一个图中的所有顶点都是连通的,E肯定要大于等于V-1,所以,广度优先搜索的时间复杂度也可以简写为O(E)
- 广度优先搜索的空间消耗主要在几个辅助变量 visited 数组、queue 队列、prev 数组上。这三个存储空间的大小都不会超过顶点的个数,所以空间复杂度是 O(V)。
深度优先搜索 (DFS)
- 深度优先搜索(Dep