DFS(depth first search)与BFS(breadth first search)
深度优先搜索(DFS)
简介
深度优先搜索通过栈来实现,一般用来搜索能不能到达目的地之类。深度优先搜索通过栈来实现,一般用来搜索能不能到达目的地之类。
面图中的数字显示了深度优先搜索顶点被访问的顺序。
它可以被形象的描述为“打破沙锅问到底”,具体一点就是访问一个顶点之后,继而访问它的下一个邻接的顶点,如此往复,直到当前顶点满足条件或者它不存在
邻接顶点。
特点
占内存少,能找到最优解(一定条件下),但能很快找到接近解(优点),可能不必遍历所有分枝(也就是速度快),一个典型应用是连连看游戏。
应用
深度优先搜索用栈(stack)来实现,整个过程可以想象成一个倒立的树形:
1、把根节点压入栈中。
2、每次从栈中弹出一个元素,搜索所有在它下一级的元素,把这些元素压入栈中。并把这个元素记为它下一级元素的前驱。
3、找到所要找的元素时结束程序。
4、如果遍历整个树还没有找到,结束程序。
广度优先搜索(BFS)
简介
广度优先搜索通过队列来实现,一般用来搜索最短路径。
下面图中的数字显示了广度优先搜索顶点被访问的顺序。
可以被形象的描述为“浅尝辄止”,具体一点就是每个顶点只访问它的邻接节点(如果它的邻接节点没有被访问)并且记录这个邻接节点,当访问完它的邻接节点之
后就结束这个顶点的访问。
特点
占内存多,能找到最优解,必须遍历所有分枝。
应用
广度优先搜索使用队列(queue)来实现,整个过程也可以看做一个倒立的树形:
1、把根节点放到队列的末尾。
2、每次从队列的头部取出一个元素,查看这个元素所有的下一级元素,把它们放到队列的末尾。并把这个元素记为它下一级元素的前驱。
3、找到所要找的元素时结束程序。
4、如果遍历整个树还没有找到,结束程序。