首页 > 极客资料 博客日记
深度DFS 和 广度BFS搜索算法学习
2024-09-26 17:30:04极客资料围观20次
这篇文章介绍了深度DFS 和 广度BFS搜索算法学习,分享给大家做个参考,收藏极客之家收获更多编程知识
图的两种遍历方式:
- 深度优先遍历(DFS——Depth First Search)
- 广度优先遍历(BFS——Breath First Search)
图的遍历算法里,处理临时数据,依赖两个抽象数据结构:
- 栈
- 队列
广度优先的动态图
广度优先遍历也叫层序遍历,先遍历第一层(节点 1),再遍历第二层(节点 2,3,4),第三层(5,6,7,8),第四层(9,10)。
深度优先的动态图
从根结点出发,一直向左子节点走,直到左子节点不存在然后返回到上一个节点走这个节点的右子节点,然后一直往右子节点走,同样的也是走不通为止就返回。很显然这种一路走到黑,黑了就回头的方式,就是深度优先遍历的过程。
广度和深度的具体步骤
广度搜索中,存储下层的数据需要用到队列,
深度搜索中,存储一整条路径的数据,需要用到栈 ,用栈去回溯到最开始的顶点,
具体步骤去看《秒懂算法:用常识解读数据结构》,我觉得书分解得很详细了,不需要在搬一次了。
深度和广度的应用场景
我面试过挺多次的,很多面试问题都慢慢淡忘了,但是有一个问题一直记得:
他问,你平时在做爬虫的时候,用深度还是广度?
现在回想起来,觉得他问得真扯淡。
为什么?
选择深度或广度所对应的是不同场景,理论上来说,所有问题,都可以用list解决,但是为什么还要分化出那么多的数据结构?
还不是因为——不同的问题,采用不同的数据结构,这样解决效率才高,资源才省。
比如看这个下面这个家族结构图:
如果想要找到曾祖母Ruby的所有儿女,那么用深度还是广度?
- 肯定是广度最合适。
使用广度优先搜索,那么立刻就能找到她所有直接女儿(Andrea、Xander、CoCo和Maya),不用搜索和她相隔一代的亲人。
如果想要找到Ruby的一个叫Ruth的后代,用深度还是广度?
- 显然是深度合适。
用深度优先搜索,则可以马上移动到图的底部,在几步之内就能找到曾孙一辈。
虽然还是需要遍历整幅图才能找到Ruth,但至少快速找到她是有可能的。而用广度优先搜索则别无选择,必须遍历前两辈的所有人,才能开始搜索曾孙这一辈。
在思考用深度还是广度时?应该是先思考究竟是想先尽可能在初始顶点附近搜索,还是想先尽可能远离它?
- 前者适合用广度优先搜索
- 后者适合用深度优先搜索。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- Nuxt.js 应用中的 prerender:routes 事件钩子详解
- 【问题解决】Tomcat由低于8版本升级到高版本使用Tomcat自带连接池报错无法找到表空间的问题
- 【FAQ】HarmonyOS SDK 闭源开放能力 —Vision Kit
- 六、Spring Boot集成Spring Security之前后分离认证流程最佳方案
- 《JVM第7课》堆区
- .NET 8 高性能跨平台图像处理库 ImageSharp
- 还在为慢速数据传输苦恼?Linux 零拷贝技术来帮你!
- 刚毕业,去做边缘业务,还有救吗?
- 如何避免 HttpClient 丢失请求头:通过 HttpRequestMessage 解决并优化
- 让性能提升56%的Vue3.5响应式重构之“版本计数”