当前位置:网站首页 > 编程语言 > 正文

广度优先搜索是什么(广度优先搜索是什么搜索)



假如你现在位于双子峰,要到金门大桥。设定从一个地点到其相邻的一个地点需要一步,那么你到金门大桥最少要多少步?

我们会怎么想呢?我们肯定会先想,一步行不行,即一步能不能到目的地——有没有一步就到目的地的路——在每个出发地到其相邻地点的路中确认。发现显然不行,那我们又看有没有只再进一步就到目的地的路,确认每一条······这样确认下去直到有想要的结果。


上述地图是一个图(graph)模型。就像雷达逐距离扫描一样,我们的想法就是所谓广度(宽度)优先搜索:

算法首先检查和起点距离为k的所有顶点,若不能达到要求,再去检查和S距离为k+l(l>0)的其他顶点。

显然,广度优先搜索找到的是距起点最近的目标。具体地说,在上述金门大桥的案例中,该算法找到的是可达的最短路径——找到它的同时也解决了存不存在到达那里的路径的问题。

而如果不能由BFS找到到达的路径(层层扫描,直到最后都没有找到能够到达的),那么结果就是不存在到达的路径。

综上所述,BFS找不到路径,那么就不存在到达的路径;BFS找到了路径,那就表明存在到达的路径,也找到了其中最短的。

因此,BFS解决的是这两个问题:存不存在到达的路径,和,最短的到达路径是什么。


假设你经营着一个芒果农场,需要寻找芒果销售商将芒果卖给他。你想在社交网络上找,而且要关系尽量不疏远。

解决:

要关系尽量不疏远,显然这是一个最短到达问题。首先,你在联系人列表中查找;发现没有一个满足,你再在联系人的联系人中找;发现又没有一个满足,你再在联系人的联系人的联系人中找;······直到找到或终究没找到。


顾名思义,队列就是我们生活中排的那种队。比如一群人到银行的同一个柜台办理业务,那么先到先办,排列成队。这就是一个“先进先出”。

因此,我们的办法就是一层关系一层关系的检查。那么如何表示每一层关系呢?

比如说,我的第一层联系人是:A, B,即 me: A, B;

那么我的第二层联系人就是这样:

A: E, F;         B: C, D;

后面层的联系人也是一样——

是的。另外,A是不是销售商,可以用0或1表示,它也是一个value。那么所有的这些键值对可以构成一个散列表(python中已有现成的散列表object:字典)。以人名为键,值为列表,列表的第一个元素为0或1,后面的元素为这个人的第一层联系人。

graph表示了这个关系图:



做法一:我们可以检查到一个人不是销售商时,就把他拥有的第一层关系加入检查序列。检查序列自始至终都是一个队列,变的是队列的元素,直接使用队列结构就行。

代码:

做法二:

事实上我们更容易直接地想到,

也就是说我们不必要用到队列也可以解决问题。

代码:

这两种办法的性能应该没有多少差别。不过实测发现好像做法二快一点点——

据说,set()操作去重是更快的办法。

到此这篇广度优先搜索是什么(广度优先搜索是什么搜索)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • 医院启动绿色代码(医院启动蓝色代码是什么意思)2025-02-06 08:54:05
  • py文件怎么打包成exe(py文件如何打包成exe文件)2025-02-06 08:54:05
  • hpl是什么文件(.hpp是什么文件)2025-02-06 08:54:05
  • yolov3作者(yolov3作者退出)2025-02-06 08:54:05
  • ubuntu 安装qt(ubuntu 安装qt环境)2025-02-06 08:54:05
  • 拆包机器(拆包机器人国内外背景)2025-02-06 08:54:05
  • mt103报文72(MT103报文72项IMAD)2025-02-06 08:54:05
  • 字符串转xml对象(字符串转xml对象是什么)2025-02-06 08:54:05
  • 域名 查ip(域名查ip域名解析)2025-02-06 08:54:05
  • keil破解到2032年(keil破解到2030年)2025-02-06 08:54:05
  • 全屏图片