参见《算法笔记》--胡凡
DFS
介绍:深度优先搜索(Depth First Search),以走迷宫为例,当碰到岔道口时,总是选择其中一条岔路前进,在岔路上如果又遇到新的岔道口,仍然选择新岔道口的其中一条岔路前进,直到碰到死胡同才回退到最近的岔道口选择另一条路,不碰到死胡同就不回头。
疑问:现实中该如何回退到最近的岔道口,一个两个可能还记得,要是多个咋返回,其实只需要一直贴着某一边墙壁走就行了(例如右边)。不过写代码中其实并没有这个问题,对于程序的回退就是函数执行结束返回。
流程:
从例子中可看出,深度搜索会走遍所有路径,并且每次走到死胡同就代表一条完整的路径,也就是说,深度搜索是一种枚举所有完整路径以遍历所有情况的搜索方法。
实现:递归或者栈
BFS
介绍:广度优先搜索(Breadth First Search),从中心向四周扩散。例如走迷宫,碰到岔道口时,总是先依此访问从该岔道口能直接到达的所有节点。,然后再按这些节点被访问的顺序去依此访问它们能直接到达的所有节点。例如求解从迷宫起点到终点的路径,且路径要最小。
流程:
实现:队列
对比:如果用dfs的话,相信很容易实现,不过dfs需要把所有路径都遍历完才能得到最小的路径(一条路径一条路径的访问)。而bfs只要找到出口,那条路径就是最短的,因为它每次都会把最近的所有节点纳入考虑。