热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

bfs,dfs的通俗描述

bfs,dfs网上有很多关于它们的博文,学习的还是不要看我的,我只是看能不能用自己的话说出来。我也是小白。bfs中文名称是广度优先搜索,和dfs一样,两者都是搜索可以到达的所有

bfs ,dfs

网上有很多关于它们的博文,学习的还是不要看我的,我只是看能不能用自己的话说出来。我也是小白。

bfs 中文名称是广度优先搜索,和dfs 一样,两者都是搜索可以到达的所有状态。不同点是搜索顺序不同。dfs ,深度优先搜索,故名思议,会从一个状态出发,直到到达目标状态或者不满足某个条件而退回到上一个状态。很抽象是不是?没问题一开始我也看不懂,看完下面的例子再看,应该有点感觉了。
假如,你在一个迷宫寻找出口,来到了一个分岔口,选择其中一个,然后不断往前走,可能找到出口,可能又到达另一个分岔口,或者发现此路不通,此时你就要退回上一个分岔口,或者是起点。为了找到迷宫出口,我们需要把所有的状态记录下来,对当前的迷宫而言,这状态显然就是分岔口,是选择左呢,还是右呢,上还是下呢?都没关系,每一个都走走看。然后这有一个问题了,我们怎么知道这条路通不通呢?没办法,只能一直往下走才能知道通不通,通就最好,不通就退回上一个分岔口,选择另外一个方向。dfs 通常用递归实现。也可以用stack,stack的特点是 先进 后出,很符合dfs的特点,因为处于栈顶的元素(状态) ,就代表了我们目前所在的位置的上一个分岔口,如果此路不通,我们就把stack的元素pop()出来,选择另外一个方向,如果这分岔的所有方向都走过了,并且知道走不通,直接不再加入stack,选择此时的栈顶元素,即上上一个分岔口。当然,stack一开始是空的,因为你在起点还没遇到分岔口。当到达分岔口,把这分岔口入栈,然后选择一个方向往下走。用stack实现dfs比较麻烦,直接用递归最好了,递归本身就是用栈实现的。

如果给一个迷宫你叫你求到达出口的最短路径的长度,这时候我们若用dfs就显得繁琐了,因为我们需要走完整个迷宫,才能知道最短路径的长度。因为dfs是往深处搜索的,每次我们都要走完整条路才能确定这条路能不能到达出口,这对于求最短路径就不适合了。此时,bfs 上场了。它针对最短路径,最少操作非常合适。假设你现在依然在迷宫,并且会影分身,往前走,来到一个分岔口,它2个方向,你就分出一个分身,他走一个,你走一个,当然为了方便,我们假设你影分身很牛逼,分身不但可以分身,还能和分身交换位置。你和分身在不同方向同时往下走。不管先后顺序,你们都遇到了一个分岔口,重复上一步,影分身。继续,快变成篮球队的大家朝着不同方向继续前进了。运气非常好,分身们有一个到达了出口,此时你转移过去,恭喜了,顺利到达出口,并且此时你到达出口的分身走的路径是最短的,因为每一个分岔口都变出了分身,命令他们朝不同方向前进,意味着你从起点开始同时搜索所有可能的道路。可能你会吐槽我,分身一个走得慢,一个走得快,怎么办?很简单,让分身们和你同时走一步就可以了。这样,就能确保,到达出口的分身或者你是最短的路径。
每次前进一步,遇到分岔口,影分身,重复下去。回到这里,编程怎么实现了?怎么来管理这些影分身?可以想到,此时保存分岔口的选择就不太好了,很明显,根据上面的例子,我们要保存我们影分身的位置,每走一步跟新所有影分身的位置,而且每到达一个分岔口,我们影分身就会增加。这时要用队列来实现了。开始,队列只有一个,也就是你拉,拿出来,一直往前走,跟新此时的位置,去到分岔,变出几个影分身,并且加入队列,往前走,在一个一个拿出来,跟新他们的位置,加入队列尾,遇到分岔,就再次变出分身加入队列尾,一直重复下去,直到达出口。此时就break出来。
使用队列可以保证跟新完你和影分身当前位置,在开始跟新下一步。先进来的先处理。

到此吧,明天探讨一下题目。


推荐阅读
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • Codeforces Round #566 (Div. 2) A~F个人题解
    Dashboard-CodeforcesRound#566(Div.2)-CodeforcesA.FillingShapes题意:给你一个的表格,你 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
  • 2018年3月31日,CSDN、火星财经联合中关村区块链产业联盟等机构举办的2018区块链技术及应用峰会(BTA)核心分会场圆满举行。多位业内顶尖专家深入探讨了区块链的核心技术原理及其在实际业务中的应用。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • Netflix利用Druid实现高效实时数据分析
    本文探讨了全球领先的在线娱乐公司Netflix如何通过采用Apache Druid,实现了高效的数据采集、处理和实时分析,从而显著提升了用户体验和业务决策的准确性。文章详细介绍了Netflix在系统架构、数据摄取、管理和查询方面的实践,并展示了Druid在大规模数据处理中的卓越性能。 ... [详细]
author-avatar
狼与鹰的爱_340
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有