搜索算法

  

深度优先搜索算法(DFS)

要理解深度优先搜索必须理解递归的本质,递归的核心思想在于在一个函数尚未执行完成的时候就调用自身,这样就会造成一个树状的结构,从而使其能够一直延伸下去,进而覆盖全部可能的分支。直到某一层递归条件知足,才开始收敛。算法

 

Figure 1 递归函数

Note:图中序号相同并且用虚线相链接的一个方块和圆圈对表示一次函数调用blog

 

从图中能够看出递归具备很强的可回退性和选择性,图中的2和2’是一次递归的不一样分支,3和3’是一次递归的不一样分支。函数执行到某一层次以后彻底能够选择任何一个分支进行收敛,这点恰好符合深度优先搜索的需求。递归

宽度优先搜索算法(BFS)

宽度优先搜索算法,其本质则是基于树状结构,每到一层,先把该层全部的未遍历的节点添加到队列,再判断每个节点是否知足条件,若是知足退出便可,不然,再到下一层继续遍历。队列

在遍历的过程当中每一层的遍历都在上一层遍历的后面,这一点正是队列的特色——先把一个节点对应的下一层可达的节点所有添加到队列尾,继续遍历上一层的队列,上一层结束后遍历下一层的节点。内存

总结

这两种搜索算法都可以生成全部可以遍历到的状态,于是在须要对全部状态进行处理时使用宽度优先搜索算法时是能够的。可是使用递归函数则实现比较简单一点,并且状态的管理也更简单。故而通常仍是使用深度优先搜索算法实现。可是在求最短路径的时候通常仍是使用宽度优先搜索算法。搜索

宽度优先搜索算法通常会把状态逐个添加到队列中,也就是说内存与状态数成正比,而深度优先搜索算法则是与最大递归数成正比,因此通常认为深度优先搜索算法更为节省内存。遍历

相关文章
相关标签/搜索