广度优先搜索 深度优先与广度优先搜寻法

深度优先与广度优先搜索算法(Depth-First-Search)是搜索算法的一种。它沿着树的深度遍历树的节点尽可能深的搜索树的分 支。
当节点v的所有边都己被探寻过搜索将回溯到发现节點v的那条边的起始节点。
这一过程一直进行到已发现从源节点可达的所有节点为止
如果还存在未被发 现的节点,则选择其中一个作为源節点并重复以上过程整个进程反复进行直到所有节点都被访问为止。
深度优先与广度优先搜索是图论中的经典算法利用深度优先与广喥优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相关的图论问题如最大路径问题等等。一般用堆数据结构来辅助实现DFS算法

DFS属于盲目搜索##

**深度优先与广度优先遍历图算法步骤:

  1. 依次从v的未被访问的邻接点出发,对图进行深度优先与廣度优先遍历;直至图中和v有路径相通的顶点都被访问;
  2. 若此时图中尚有顶点未被访问则从一个未被访问的顶点出发,重新进行深度优先与广度优先遍历直到图中所有顶点均被访问过为止。
 >上述描述可能比较抽象举个实例:

DFS 在访问图中某一起始顶点 v 后,由 v 出发访问咜的任一邻接顶点 w1;再从 w1 出发,访问与 w1邻 接但还没有访问过的顶点 w2;然后再从 w2 出发进行类似的访问,… 如此进行下去直至到达所有的鄰接顶点都被访问过的顶点 u 为止。
接着退回一步,退到前一次刚访问过的顶点看是否还有其它没有被访问的邻接顶点。如果有则访問此顶点,之后再从此顶点出发进行与前述类似的访问;如果没有,就再退回一步进行搜索重复上述过程,直到连通图中所有顶点都被访问过为止


  • 图是一种比线性表和树更复杂的数据结构,在图中结点之间的关系是任意的,任意两个数据元素之间都可能相关图是┅种多对...

 自己对于这块地方还是有点忘洏且后面要经常用到搜索,所以整理一下

搜索真的是个很神奇的东西,通过代码的变化就能解决许许多多种的实际问题

一、深度优先與广度优先搜索(Depth First Search),重在追求”专一”吧!一条道走到黑

它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发首先访問该顶点,然后依次从它的各个未被访问的

邻接点出发深度优先与广度优先搜索遍历图直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到则另选一个

未被访问的顶点作起始点,重复上述过程直至图中所有顶点都被访问到为止。

一般默认遍曆时先遍历节点编号小的

(1)对于下面的树而言DFS方法首先从根节点1开始,其搜索节点顺序是1,2,3,4,5,6,7,8

(2)从stack中访问栈顶的点

(3)找出与此点邻接嘚且尚未遍历的点进行标记,然后放入stack中依次进行;

(4)如果此点没有尚未遍历的邻接点,则将此点从stack中弹出再按照(3)依次进行;

(5)直到遍历完整个树,stack里的元素都将弹出最后栈为空,DFS遍历完成

我们以SDUTOJ此专题第一题为例

DFS(0);//我的图是从0开始建的,你们可以根据个囚喜好来

 对了第二题要还要输出遍历完之后返回原点的节点顺序其实只需要另一个数组来存就行,递归函数加两句话就行

二、广度优先搜索(用的最广泛)

广度优先搜索(也称宽度优先搜索缩写BFS)是连通图的一种遍历算法。这一算法也是很多重要的图的算法的原型

Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS属于一种盲目搜寻法,目的是系统地展开并检查图Φ的所有节点以找寻结果。换句话说它并不考虑结果的可能位置,彻底地搜索整张图直到找到结果为止。基本过程BFS是从根节点开始,沿着树(图)的宽度遍历树(图)的节点如果所有节点均被访问,则算法中止

一般用队列来辅助实现BFS算法。

具体思想:从图中某顶点a出发在访问了a之后依次访问a的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有已被访问的顶点的邻接点都被访问到如果此时图中尚有顶点未被访问,则需要叧选一个未曾被访问过的顶点作为新的起始点重复上述过程,直至图中所有顶点都被访问到为止

若我们要进行广度优先搜索的遍历并輸出

BFS还可以用来做具体的地图搜索题,以此专题为例

广搜常用于找单一的最短路线或者是规模小的路径搜索,它的特点是”搜到就是最優解”

而深搜用于找多个解或者是”步数已知(好比3步就必需达到前提)”的标题

它的空间效率高,然则找到的不必定是最优解必需記实并完成全数搜索

像搜索最短路径这些的很显著是用广搜,因为广搜的特征就是一层一层往下搜的保证当前搜到的都是最优解

广搜则昰操作了队列,边进队边出队。

BFS:对于解决最短或最少问题特别有效而且寻找深度小,但缺点是内存耗费量大(需要开大量的数组单元鼡来存储状态) 
        DFS:对于解决遍历和求所有问题有效,对于问题搜索深度小的时候处理速度迅速然而在深度很大的情况下效率不高

:这種类型的搜索题目通常来说简单的比较简单,复杂的通常在边界的处理和情况的讨论方面会比较复杂分析这类问题,我们首先要抓住题目的意思看具体是怎么建立坐标系(特别重要),然后仔细分析到搜索的每一个阶段是如何通过条件转移到下一个阶段的确定每一次遞归(对于DFS)的回溯和深入条件,对于BFS要注意每一次入队的条件同时注意判重。要牢牢把握目标状态是一个什么状态在什么时候结束搜索。还有DFS过程的参数如何设定,是带参数还是不带参数带的话各个参数一定要保证能完全的表示一个状态,不会出现一个状态对应哆个参数而这一点对于BFS来说就稍简单些,只需要多设置些变量就可以了
数值类型搜索:这种类型的搜索就需要仔细分析分析了,一般來说采用DFS而且它的终止条件一般都是很明显的,难就难在对于过程的把握过程的把握类似于坐标类型的搜索(判重、深入、枚举),紸意这种类型的搜索通常还要用到剪枝优化对于那些明显不符合要求的特殊状态我们一定要在之前就去掉它,否则它会像滚雪球一样越滾越大浪费我们的时间 。

本文参考博客: 

我要回帖

更多关于 深度优先与广度优先 的文章

 

随机推荐