深度优先搜索(DFS)与广度优先搜索(BFS)

DFS(depth first search)与BFS(breadth first search)

深度优先搜索(DFS)

简介

深度优先搜索通过栈来实现,一般用来搜索能不能到达目的地之类。深度优先搜索通过栈来实现,一般用来搜索能不能到达目的地之类。
面图中的数字显示了深度优先搜索顶点被访问的顺序。



它可以被形象的描述为“打破沙锅问到底”,具体一点就是访问一个顶点之后,继而访问它的下一个邻接的顶点,如此往复,直到当前顶点满足条件或者它不存在
邻接顶点。

特点

占内存少,能找到最优解(一定条件下),但能很快找到接近解(优点),可能不必遍历所有分枝(也就是速度快),一个典型应用是连连看游戏。

应用

深度优先搜索用栈(stack)来实现,整个过程可以想象成一个倒立的树形:
1、把根节点压入栈中。
2、每次从栈中弹出一个元素,搜索所有在它下一级的元素,把这些元素压入栈中。并把这个元素记为它下一级元素的前驱。
3、找到所要找的元素时结束程序。
4、如果遍历整个树还没有找到,结束程序。

代码实例
ACM-HDOJ 1010题(深搜+剪枝实现)

广度优先搜索(BFS)

简介

广度优先搜索通过队列来实现,一般用来搜索最短路径。
下面图中的数字显示了广度优先搜索顶点被访问的顺序。



可以被形象的描述为“浅尝辄止”,具体一点就是每个顶点只访问它的邻接节点(如果它的邻接节点没有被访问)并且记录这个邻接节点,当访问完它的邻接节点之
后就结束这个顶点的访问。

特点

占内存多,能找到最优解,必须遍历所有分枝。

应用

广度优先搜索使用队列(queue)来实现,整个过程也可以看做一个倒立的树形:
1、把根节点放到队列的末尾。
2、每次从队列的头部取出一个元素,查看这个元素所有的下一级元素,把它们放到队列的末尾。并把这个元素记为它下一级元素的前驱。
3、找到所要找的元素时结束程序。
4、如果遍历整个树还没有找到,结束程序。

代码实例
ACM-HDOJ 1026题(广搜+优化队列实现)

文章目录
  1. 1. DFS(depth first search)与BFS(breadth first search)
    1. 1.1. 深度优先搜索(DFS)
      1. 1.1.1. 简介
      2. 1.1.2. 特点
      3. 1.1.3. 应用
    2. 1.2. 广度优先搜索(BFS)
      1. 1.2.1. 简介
      2. 1.2.2. 特点
      3. 1.2.3. 应用
|