热门标签 | 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 Big Sur全新设计大版本更新,10+个值得关注的新功能
    本文介绍了Apple发布的新一代操作系统macOS Big Sur,该系统采用全新的界面设计,包括图标、应用界面、程序坞和菜单栏等方面的变化。新系统还增加了通知中心、桌面小组件、强化的Safari浏览器以及隐私保护等多项功能。文章指出,macOS Big Sur的设计与iPadOS越来越接近,结合了去年iPadOS对鼠标的完善等功能。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 006_Redis的List数据类型
    1.List类型是一个链表结构的集合,主要功能有push,pop,获取元素等。List类型是一个双端链表的结构,我们可以通过相关操作进行集合的头部或者尾部添加删除元素,List的设 ... [详细]
  • 栈和队列的共同处和不同处
    本文主要介绍了栈和队列的共同处和不同处。栈和队列都是由几个数据特性相同的元素组成的有限序列,也就是线性表。队列是限定仅在表的一端插入元素、在另一端删除元素的线性表,遵循先进先出的原则。栈是限定仅在表尾进行插入或删除操作的线性表,遵循后进先出的原则。 ... [详细]
  • 众筹商城与传统商城的区别及php众筹网站的程序源码
    本文介绍了众筹商城与传统商城的区别,包括所售产品和玩法不同以及运营方式不同。同时还提到了php众筹网站的程序源码和方维众筹的安装和环境问题。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
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社区 版权所有