简单搜索(广度优先搜索、深度优先搜索)总结

广度优先搜索

概述

广度优先搜索(宽度优先搜索,BFS)是树或图的一种遍历策略。其思想是从一个顶点V0开始,遍历每一个点时,依次遍历其所有的邻接点,然后再从这些邻接点出发,同样依次访问它们的邻接点。按照此过程,直到图中所有点都被访问到。

应用

经典问题:迷宫问题。

解题思路

广度优先搜索在解题中,先将题目进行解释,理清问题中树的层次,先对第一层结点进行检查,检查目标是否存在;不存在则将第一层所有结点逐一进行扩展至邻接点,得到第二层结点,再次检查目标是否存在;不存在则继续扩展,直到找到目标。
注:可选用队列方法。

深度优先搜索

概述

深度优先搜索算法(DFS)是一种用于树或图的遍历策略。 其思想沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点,整个进程反复进行直到所有节点都被访问为止。

应用

经典问题:棋盘问题、油田问题。

解题思路

深度优先搜索在解题中,首先从一个未被遍历过的顶点开始,遍历其邻接点,再由邻接点继续深层次向后遍历,一直到所能够遍历到的所有邻接点结束,并且遍历过程中讲遍历过的点进行已遍历的标记;到达最深深度后,进行回退,从未开始遍历的点开始类似操作的深度遍历,直到遍历完所有点,得到结果。
注:注意遍历过程中,对已遍历点的标记。

算法对比

  1. 内存方面
    广度优先搜索在树的层次较深、子节点数较多的情况下,消耗内存十分严重,因此广度优先搜索更适用于节点的子节点数量不多,并且树的层次不会太深的情况。
    深度优先搜索在搜索过程中,每一层只需维护一个结点,因此相对于广度优先搜索内存消耗更少。
  2. 时间方面
    在类似寻找最短路径的问题中,深度优先搜索每一次得到的结果都不能保证是最短的,因此需要所有搜索结束后进行取舍,每次搜索还要进行标记的变更,效率不高。
    广度优先搜索对于解决最短或最少的问题效果显著,每个结点只访问一遍,结点总是以最短路径被访问,所以第二次路径确定不会比第一次短,因此耗时更短,寻找深度更小。

你可能感兴趣的:(C++算法训练)