BFS与DFS异同
- 查找空间与查找目的一致,做题时一定要尽量考虑全剪枝的情况,不然容易出现超时的情况
- 查找方式不一致
BFS总结
BFS中,获得一个状态后,立即扩展这个状态,并保证早得到的状态优先得到扩展。因此使用队列的先进先出特性来实现BFS“先得到的状态先扩展”这一特性
- 状态。需要确定所求解问题中的状态,通过扩展状态,遍历所有的状态,从中寻找需要的答案。
- 状态扩展方式。在BFS中,需要尽可能地扩展状态,并对先扩展得到的状态先进行下一次状态扩展。
- 有效状态。对有些状态,并不需要再次扩展它,而是直接舍弃它。因为根据问题的分析可知,目标状态不可能由这些状态经过若干次扩展得到,所以直接舍弃。
- 队列。为了使先得出的状态能够先扩展,于是使用队列,将得到的状态依次放入队尾,每次取队头元素进行扩展。
- 标记。为了判断哪些状态是有效的,哪些是无效的,往往使用标记。
- 有效状态数。问题中的有效状态数与算法的时间复杂度同数量级,所以在进行搜索前,必须估算其是否在能够接受的范围内。
- 最优。宽度优先搜索常被用来求解最优值问题,因为其搜索到的状态总是按照某个关键字递增,这个特性非常适合求解最优值问题。因此,一旦问题中出现最少、最短、最优等关键字,就要考虑是否是宽度优先搜索问题。
DFS总结
在搜索过程中,首先访问起点,之后访问起点的一个邻居,先不访问除该点之外的其他起点的邻居结点,而是访问该点的邻居结点,如此往复,直到找到解,或者当前访问结点已经没有尚未访问过的邻居结点为止,之后回溯到上一个结点并访问它的另一个邻居结点。
对搜索状态而言,获得一个状态后,同样立即扩展这个状态,但需保证“早得到的状态较后得到扩展”。这种先入后出的特点让人想到了栈这种数据结构,不过递归策略也能保证这一特性(要注意递归的层数;具体可以使用的栈大小,会因评判系统的不同而有所差异,需联系实际机试考题做出解题选择)。
没有先入先出的特点,因而适用于求问题是否有解,而一般不使用DFS求解最优问题。