06-广度优先搜索:图、队列

数据结构和算法
基于《算法图解》—Aditya Bhargava 和《数据结构》—严蔚敏

第6章广度优先搜索

6.1 简介
广度优先搜索—breadth-first search,BFS.
主要内容图和队列。
广度优先搜索能让你能够找出两样东西之间的最短距离,比如:编写国际跳棋AI(Artificial Intelligence),计算最少走多少步可以获胜;或者根据你的人际关系网络找到关系最近的医生。

需要两个步骤:

(1)使用图来建立问题模型。
(2)使用广度优先搜索解决问题。

6.2 什么是图
图由节点和边组成。一个节点可能与众多节点直接相连,这些节点被称为邻居。
在这里插入图片描述

6.3 广度优先搜索
广度优先搜索是一种用于图的查找算法,可帮助回答两类问题:

  • 第一类问题:从节点A出发,有前往节点B的路径吗?
  • 第二类问题:从节点A出发,前往节点B的哪条路径最短?

假设你经营着一个芒果农场,需要寻找芒果销售商,以便将芒果卖给他。为此,你可在朋友中查找。
在这里插入图片描述

首先创建一个朋友名单,然后依次检查名单中的每个人,是否是芒果销售商:
在这里插入图片描述

假设你没有朋友是芒果销售商,那么你就必须在朋友的朋友中查找。
在这里插入图片描述

检查名单中的每个人时,你都将其朋友加入名单。
在这里插入图片描述

6.3.1 查找最短路径
一度关系胜过二度关系,二度关系胜过三度关系,以此类推。
在这里插入图片描述

广度优先搜索不仅查找从A到B的路径,而且找到的是最短的路径。

只有按添加顺序查找时,才能实现这样的目的。
在这里插入图片描述

队列(queue):实现按添加顺序进行检查的数据结构。

6.3.2 队列
队列能够实现按添加顺序进行检查的需求。
队列不能随机访问,只能支持两种操作:入队和出队。
在这里插入图片描述

先加入的元素将先出队并被检查。

队列是一种先进先出(First In First Out)的数据结构;
栈是一种后进先出(Last In First Out)的数据结构。
在这里插入图片描述

6.4 实现图
图是由多个节点组成,需要使用代码来实现图。
每个结点都与邻近结点相连,散列表可以很好的实现这种关系。

散列表将键映射到值,比如将你这个节点映射到所有邻居。
在这里插入图片描述
在这里插入图片描述

表示这种映射关系的Python代码如下,

graph = {}  #前面提到Python中是用字典来实现散列表。{}表示生成空字典。
graph["you"] = ["alice", "bob", "claire"]
#"you"被映射到了一个数组,因此graph["you"]是一个数组,包含了"you"的所有邻居。 

在这里插入图片描述

graph = {}
graph["you"] = ["alice", "bob", "claire"]
graph["bob"] = ["anuj", "peggy"]
graph["alice"] = ["peggy"]
graph["claire"] = ["thom", "jonny"]
graph["anuj"] = []
graph["peggy"] = []
graph["thom"] = []
graph["jonny"] = []
#散列表是无序的,因此添加键-值对的顺序不关紧要。

有向图(directed graph):有一个节点指向相邻节点,单向关系。上图中Anuj,Peggy,Thom,Jonny都没有邻居,因为他们没有指向其他节点。

无向图(undirected graph):没有箭头,直接连接的节点互为邻居。
下面两图等效:
在这里插入图片描述

6.5 实现算法
队列实现原理
在这里插入图片描述

#首先使用函数deque来创建一个双端队列。
from collections import deque
def search(name):search_queue = deque() #创建一个队列search_queue += graph[name]  #将邻居都加入到这个搜索队列中。searched = []  #这个数组用于记录检查过的人,避免无限循环。#进行对每个人进行检查while search_queue: #只要队列不为空,person = search_queue.popleft() #就取出其中的第一个人(左端)if person not in searched:  #仅当这个人没检查过时才检查if person_is_seller(person): #检查此人是否是芒果销售商print(person + "is a mango seller!")return Trueelse:search_queue += graph[person] #如果不是,将此人的朋友(相邻节点)都加入搜索队列。searched.append(person) #并将此人添加到以搜索过的列表,避免再次搜索此人。return False  #如果到达这里,说明队列中没有芒果销售商#假设以姓名结尾为m的人为芒果销售商。
def person_is_seller(name):return name[-1] == 'm' #名字末尾为msearch("you") #函数调用

为什么要避免被重复搜索(检查):
上图中Peggy既是Alice的朋友又是Bob的朋友,因此她将被加入队列两次;因此,搜索队列将包含两个Peggy。

在这里插入图片描述

检查完一个人后,应将其标记为已检查,且不再检查;如果不这样做,就可能会导致无限循环。
在这里插入图片描述

因为搜索队列将在包含你和包含Peggy之间反复切换,从而造成无限循环。
在这里插入图片描述

列表是有序的。如果任务A依赖于任务B,在列表中任务A就必须在任务B后面,这被称为拓扑排序,使用它可根据图创建一个有序表。

6.5.1 树
树是特殊的图,其中没有往后指的边。
在这里插入图片描述

树是图的子集,树都是图,图不一定是树。

6.6 小结

  • 队列是先进先出。
  • 栈是后进先出。
  • 注意避免导致无限循环。

——持续修改完善中…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291856.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虎年云原生落地技术趋势

今天是立春,虎年第一天。去年我写过一篇 牛年 dotnet云原生技术趋势[1],今天再来写一篇虎年云原生落地技术趋势,去年局限在.NET 平台上的云原生落地,我今年在去年探索云原生落地的基础上从多语言云原生技术落地的趋势来谈谈。在 2…

WdatePicker 设置日期第一个比第二个的日期小

WdatePicker 设置日期第一个比第二个的日期小 可以设置&#xff0c;日期只显示某一天的&#xff0c;比如只显示周一&#xff0c;和周日 <input id"Text1" class"Wdate" onFocus"WdatePicker({disabledDays:[0,2,3,4,5,6],maxDate:#F{$dp.$D(\Text2…

07-狄克斯特拉算法

数据结构和算法 基于《算法图解》—Aditya Bhargava 和《数据结构》—严蔚敏 第7章 狄克斯特拉算法 上一章的广度优先搜索&#xff0c;找出的是段数最少的路径&#xff1b; 本章狄克斯特拉算法&#xff0c;找出的是最快的路径。 7.1 使用狄克斯特拉算法 步骤&#xff1a; 第…

聊聊mysql执行过程

在项目开发当中 &#xff0c;很多时候&#xff0c;我们的数据库应用优化都是从表层到里层的一个过程。比如一个查询写下来 &#xff0c;我们的优化方向大多时候都是先看方法执行的时间长短&#xff0c;然后再决定是否去优化它&#xff0c;下意识的第一步操作都是看是否命中索引…

01. Node js Hello world

2019独角兽企业重金招聘Python工程师标准>>> 01. Node js Hello world 环境安装 官网http://nodejs.org/ Node.js is a platform built on Chromes JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, no…

异常检测之浅谈入侵检测

打开微信扫一扫&#xff0c;关注微信公众号【数据与算法联盟】 转载请注明出处&#xff1a;http://blog.csdn.net/gamer_gyt 博主微博&#xff1a;http://weibo.com/234654758 Github&#xff1a;https://github.com/thinkgamer前言 由于业务关系&#xff0c;最近一段时间一直在…

企业知识库在跨地域团队协作中的价值

随着全球化进程的不断加速&#xff0c;越来越多的企业开始面临跨地域协作的挑战。在这种背景下&#xff0c;企业知识库作为一种重要的知识管理工具&#xff0c;对于提高团队协作效率、促进知识共享与创新具有不可替代的价值。接下来就说一下知识库在跨地域团队协作中的重要性及…

Asp-Net-Core开发笔记:接口返回json对象出现套娃递归问题

前言看了下推送记录&#xff0c;一个月前&#xff0c;OK&#xff0c;我又变成月更了o(╯□╰)o&#xff0c;这绝对不行&#xff01;[○&#xff65;&#xff40;Д&#xff65; ○]所以今天来更新了其实不是我懒得更新或者是太忙&#xff0c;其实是最近在写一篇很长的博客&…

spring之二——使用maven创建一个java project

2019独角兽企业重金招聘Python工程师标准>>> maven的安装及Eclipse maven插件安装这里不再说了&#xff0c;安装可以看这篇博客&#xff1a; http://www.blogjava.net/fancydeepin/archive/2012/07/13/eclipse_maven3_plugin.html 需要注意的是&#xff0c;maven在w…

自从装了windows神器,再也不用羡慕mac了

1. 命令行神器 1.1 GOW Gow&#xff08;Gnu On Windows&#xff09;是Cygwin的轻量级替代品。 它使用一个方便的NSIS安装程序&#xff0c;安装超过100个非常有用的开源UNIX应用程序&#xff0c;编译为本机win32二进制文件。 它被设计为尽可能小&#xff0c;大约18 MB&#xff…

第1章 绪论

《数据结构》学习笔记 第1章 绪论 1.1 数据结构的研究内容 计算机计算数值时&#xff0c;一般经过一下步骤&#xff1a; 1.从具体问题抽象出数学模型&#xff08;实质是分析问题&#xff09;。 2.设计一个解次数学模型的算法。 3.编写程序&#xff0c;进行测试、调试&#xf…

C#中泛型约束的具体用法

前言上一篇博文简单介绍了泛型的约束&#xff0c;说是通过where<>来实现具体委托占位符的约束。那么约束又有什么类型和次序呢。这篇文章咱们一起看看。目前共5种类型的约束。类名&#xff1a;只有这个类型的类或从它继承的类才能用作类型实参class&#xff1a;任何引用类…

系统架构:Web应用架构的新趋势 前后端分离的想法

最近研究servlet&#xff0c;看书时候书里讲到了c/s架构到b/s架构的演变&#xff0c;讲servlet的书都很老了&#xff0c;现在的b/s架构已经不是几年前的b/s架构&#xff0c;其实b/s架构就是web应用开发&#xff0c;对于这样的架构我们现在应该考虑的是前端和后端的分离&#xf…

Asp-Net-Core学习笔记:身份认证入门

前言过年前我又来更新了~我就说了最近不是在偷懒吧&#xff0c;其实这段时间还是有积累一些东西的&#xff0c;不过还没去整理……所以只能发以前没写完的一些笔记出来就当做是温习一下啦PS&#xff1a;之前说的红包封面我还没搞&#xff0c;得抓紧时间了最近在准备搞一个我之前…

第1章 大数据挖掘及应用概论

《大数据挖掘及应用》学习笔记。 第1章 大数据挖掘及应用概论 数据挖掘是数据分析的提升。 1.1 大数据智能分析处理的普及和应用 1.1.1 云计算(cloud computing) 云计算是一种按使用量付费的模式&#xff0c;这种模式提供可用的、便捷的、按需的网络访问&#xff0c;进入可配…

浮点型数据的输出格式

2019独角兽企业重金招聘Python工程师标准>>> float的占位符为f%,默认输出六位小数&#xff0c;如果要限制位数的输出&#xff0c;可以用%.2f这样的格式&#xff0c;double同上。 如果是浮点型转换成整型不会进行四舍五入&#xff0c;浮点型的输出如果截取了位数进行…

linux网络编程之用socket实现简单客户端和服务端的通信(基于TCP)

一、介绍基于TCP协议通过socket实现网络编程常用API 1、读者如果不是很熟悉,可以先看我之前写的几篇博客,有socket,地址结构的理解,更加方便读者理解 地址分别是: 1)、http://blog.csdn.net/u011068702/article/details/56479927 2)、http://blog.csdn.net/u01106870…

VS2010下Boost1.55.0配置

为什么80%的码农都做不了架构师&#xff1f;>>> 打开程序菜单&#xff0c;选择Visual Studio Tools里面的 Visual Studio 命令提示。转到解压后的Boost所在目录&#xff0c;输入Bootstrap&#xff0c;执行完毕会生成b2.exe。输入&#xff08;目录下的bjam.exe和b2.…

Linux信号实践(3) --信号内核表示

信号在内核中的表示执行信号的处理动作称为信号递达&#xff08;Delivery&#xff09;&#xff0c;信号从产生到递达之间的状态&#xff0c;称为信号未决&#xff08;Pending&#xff09;。进程可以选择阻塞&#xff08;Block&#xff09;某个信号。被阻塞的信号产生时将保持在…

第2章 数据认知与预处理

《大数据挖掘及应用》学习笔记。 第2章 数据认知与预处理 2.1 数据分析的定义和流程 数据分析(data analysis)是指用适当的统计分析方法对收集来的大量数据进行分析和解释&#xff0c;提取出有用的信息形成结论&#xff0c;从而对数据加以详细研究和概括总结的过程。 2.1.1 如…