DFS BFS简单理解
@
又水了一篇博客呜呜,第一次尝试写DFS和BFS,做题也迷迷糊糊,看着大佬文章简单写了写总结,后续会补上DFS和BFS的题目。
BFS DFS介绍
DFS:深度优先搜索,又叫回溯算法。这个算法的核心就是不断的往更深的地方搜索,如果更深的地方搜索失败了,就返回来搜,是一个回溯的过程。
BFS:广度优先搜索,也是一种搜索算法,讲究搜索的广度,所以叫广度优先算法。这个算法的核心就是,先把周围的找完,再去找更深的地方。
这里区分下dfs和bfs,dfs就是一条路走到底,发现没路了,返回来,走另一条路,不撞南墙不回头。bfs就是每条路都走一点,这样一点点走总会走到想要的路。
实现思路
这两种算法都可以使用的递归的方式,其中dfs还可以用栈来实现,bfs还可以用队列实现。
DFS和BFS用递归实现的思路:
根据各自传参的优先级的顺序,不断的调用自身。
一般情况下,用递归实现BFS比较为难,所以常用队列实现。
DFS用栈实现的思路:
每遇到一个元素,就把这个元素的所有邻接元素入栈,当栈不为空的时候,不断的从栈顶拿出元素进行操作,直到栈为空。
BFS用队列实现的思路:
每遇到一个元素,就把这个元素的所有邻接元素放入队列,当队列不为空的时候,不断从队首拿出元素进行操作,直到队列为空。
DFS BFS怎么应用
BFS类似于水波纹的扩散,在求解一些最短路径,最优值问题的时候效率很高。
BFS为了遍历,需要保存所有的状态,对空间来说是一个巨大的消耗。(因为通常是无法递归实现的)
而DFS再解决回溯问题上优势很大,通过一个状态变量搜索所有,对空间是很大的节约。(但递归对我这样新手不是很友好ww)
所以一般情况DFS用递归写,BFS用队列写
那么如何使用DFS BFS解决问题呢?
凡是在一个二维矩阵中,找路径,找方法数,搜索东西,想都不要想,一般都可以用上。
去遍历图肯定是可以的。
看到有关找方法的问题,可以尝试使用。
凡是包含搜索思想的,都可以使用。
DFS BFS对比
DFS : 使用递归的方式对于恢复状态非常方便,因为大部分问题在回溯后都需要恢复相应的状态。但是对于递归理解不好的话,就感到很困难
BFS : 一般用队列,队列消耗空间很大,但使用非递归的方式,可能会更好理解,更直观。

浙公网安备 33010602011771号