dfs和bfs的总结

本文介绍了DFS和BFS算法,DFS借用递归,从选定的点出发一条路走到底;BFS运用队列和函数内循环,从选定的点出发每次各方向走一步。二者多用于图处理,如迷宫、八皇后等问题。还对比了它们的适用场景,大内存或层次深的树用BFS,判断初始状态能否得到目的解用DFS。

dfs:
dfs算法是一个对连通图进行遍历的算法。它的思想是从一个被选定的点出发一条路走到底,如果得不到目的解,那就返回到上一个节点,然后换一条路继续走到底,直到找到目的解返回或者全部遍历完返回一个事先定好的值。dfs一般借用递归完成整个算法的构造。
dfs算法的一般框架经我总结大致为下:

int dfs()
{
    If(达到目的)处理return;
    else
    {
        处理;
        dfs();
    }
}

bfs:
bfs算法是也一个对连通图进行遍历的算法。它的思想是从一个被选定的点出发;然后从这个点的所有方向每次只走一步的走的到底(即其中一个方向走完一步之后换下一个方向继续走);就像池塘中被扔进一颗石子随后向四周荡起的波纹。如果得不到目的解,那就返回事先定好的值,如果找到直接返回目的解。与dfs不同的是,bfs不是运用的递归,而是运用队列和函数内循环构造的。
bfs算法的一般构架经我总结大致如下:

void bfs()
{
    queue<数据类型>q;
    q.push(数据变量);
    while(!q.empty())
    {
        数据类型 t;
        t=q.front();
        q.pop();
        (根据题意可做变形处理);
    }
}

总的来说,dfs和bfs大都运用在图的处理上:如迷宫,八皇后,n皇后,油田,连通块,数独等,在这些类型的题上几乎全需要dfs或bfs来解,或者说有些难度更大的需要bfs+dfs或bfs+bfs才能完成。
对比dfs和bfs:

  1. 当遇到一些层次较深的树图时,dfs一读到底的风格就不太适合一些限制时间的题,因为针对这些内存巨大的,使用dfs就会比较耗时,比方说一个数有1000个树枝,每个树枝有100个子叶,第1000的第一颗叶子就是正解,但是在遍历的时候却选择从第一个树枝开始遍历且一读到底,遍历到正解得时候已经做了999*100次遍历了,这时只要把dfs换成bfs,就会节约许多时间,只需要1000次的遍历就可以找到答案,所以由上可得,在一些大的内存或者层次比较的大树,应选择使用bfs来解决;反之,则使用dfs。c
  2. 还有一些根据题意就可以看出来是选择dfs还是bfs;比如题中需要的目的解是需要判断从最初的状态能否得到,这个时候就应该选择dfs了。像一些需要一步一步的完成就要选择bfs。
### 关于 DFS BFS 的练习题及学习资料 #### 经典练习题推荐 1. **洛谷平台上的经典题目** 可以通过洛谷平台找到许多经典的 DFS BFS 题目。例如,引用中的【XR-2】奇迹 - 洛谷是一个很好的例子[^2]。该题目涉及 BFS 的应用,适合初学者理解广度优先搜索的核心思想。 2. **LeetCode 平台上的相关题目** LeetCode 提供了许多与图遍历相关的题目,以下是几个典型题目: - **岛屿数量 (Number of Islands)**:这是一道典型的 BFS/DFS 应用题,目标是计算二维网格中由 '1' 表示的连通区域的数量。 ```python from collections import deque def numIslands(grid): if not grid or not grid[0]: return 0 rows, cols = len(grid), len(grid[0]) visited = [[False]*cols for _ in range(rows)] islands = 0 def bfs(r, c): queue = deque([(r, c)]) while queue: row, col = queue.popleft() directions = [(row-1,col),(row+1,col),(row,col-1),(row,col+1)] for dr, dc in directions: if 0<=dr<rows and 0<=dc<cols and not visited[dr][dc] and grid[dr][dc]=='1': visited[dr][dc]=True queue.append((dr,dc)) for r in range(rows): for c in range(cols): if grid[r][c] == '1' and not visited[r][c]: visited[r][c] = True bfs(r, c) islands += 1 return islands ``` 3. **二叉树合并问题** 使用队列实现的二叉树合并问题是另一个不错的 BFS 实践案例[^3]。此问题可以通过迭代方式解决,非常适合用来巩固对队列操作的理解。 #### 学习资源推荐 1. **书籍推荐** 对于深入学习 DFS BFS,可以参考《算法导论》的相关章节。这本书详细介绍了这两种搜索策略及其应用场景,并提供了丰富的伪代码实例。 2. **在线课程** Coursera 上有斯坦福大学开设的数据结构与算法专项课程,其中专门讲解了图的遍历技术,包括 DFS BFS 的原理实践技巧[^1]。 3. **博客文章** 许多编程博主分享了自己的经验总结,比如如何选择合适的场景使用 DFS 或者 BFS。这些文章通常附带详细的代码解析实际案例分析。 #### 总结 无论是理论学习还是实战演练,掌握好 DFS BFS 是非常重要的。建议从简单的模板题入手逐步过渡到复杂的应用场景,同时不断积累解题思路并优化自己的编码能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值