算法图解之广度优先搜索

广度优先搜索的应用场景,如下:
(1)编写国际跳棋AI,计算最少走多少步就可获胜;
(2)编写拼写检查器,计算最少编辑多个地方就可将错拼的单词改为正确的单词,如将READED改为READER需要编辑一个地方;
(3)根据你的人际关系网络找到关系最近的医生;

图简介

假设你居住在旧金山,要从双子峰前往金门大桥。你想乘公交车前往,并希望换乘最少。可乘坐的公交车如下:

由图可知,换乘最少的路线是:步行->44路公交车->28路公交车(一共三步,这种问题也被称作为最短路径问题,解决最短路径问题的算法,又称广度优先搜索)

要确定如何从双子峰前往金门大桥,需要两个步骤:
(1)使用图来建立问题模型;
(2)使用广度优先搜索解决问题;

什么是图

图模拟一组连接。

例如,假设你与朋友玩牌,并要模拟谁欠谁钱,可像下面这样指出Alex欠Rama前,如图:

完整的欠钱图可能类似于下面这样。

Alex欠Rama钱、Tom欠Adit钱,等等。

图由节点和边组成,如图所示:

一个节点可能与众多节点直接相连,这些节点被称为邻居。
在起前面的欠钱图中,Rama是Alex的邻居。Adit不是Alex的邻居,因为他们不直接相连。但Adit既是Rama的邻居,又是Tom的邻居。

图用于模拟不同的东西是如何相连的。

联系工程研发:
通常研发工程师面对业务需求,需要画流程图帮助自己梳理一下业务流程,减少编码过程中的不必要的错误(这个不必要主要包含业务理解等)。
业务流程图其实也相当于在模拟业务在实际中是如何运作的。

广度优先搜索

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

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

查找最短路径问题

这个图主要反映的是解决第一类问题看你周围的朋友有哪些是芒果商。

第二类问题,主要强调是是哪个芒果商与你的关系最近。例如,朋友是一度关系,朋友的朋友是二度关系。

下图可形象生动的表现出来:

搜索范围从起点开始逐渐向外延伸,即先检查一度关系,再检查二度关系。
首先按照顺序检查名单中的每个人,看看他是否是芒果销售商。这将在一度关系种查找,再在二度关系中查找,因此找到的是关系最近的芒果销售商。广度优先搜索不仅查找从A到B的路径,而且找到的是最短的路径。

如图分析:

注意,只有按添加顺序查找时,才能实现这样的目的。换句话说,如果Claire先于Anuj加入名单,就需要先检查Claire,再检查Anuj。如果Claire和Anuj都是芒果销售商,而你先检查Anuj再检查Claire,结果将如何呢?找到的芒果销售商并非是与你关系最近的,因为Anuj是你朋友的朋友,而Claire是你的朋友。因此,你需要按添加顺序进行检查。有一个可实现这种目的的数据结构,那就是队列。

队列

队列的工作原理与现实生活中的队列完全相同。

假设你与朋友一起在公交车站排队,如果你排在他的前面,你将先上车。队列的工作原理与此相同。队列类似于栈。你不能随机地访问队列中的元素。队列只支持两种操作:入队和出队。

如果你将两个元素加入队列,先加入的元素将在后加入的元素之前出队。因此,你可使用队列来表示查找名单。这样,先加入的人将先出队并先被检查。 队列是一种先进先出的数据结构,而栈是一种后进先出的数据结构,如图:

实现图

图由多个节点组成。

每个节点都与邻近节点相连,如果表示类似于”you->Bob”这样的关系,可以使用散列表。

关于有向图和无向图,如下所示:

关于运行时间:
如果你在你的整个人际关系网中搜索芒果销售商,就意味着你将沿每条边前行(记住,边是从一个人到另外一个人的箭头或连接),因此运行时间至少为O(边数)

你还使用了一个队列,其中包含要检查的每个人。将一个人添加到队列需要的时间是固定的,即为O(1),因此对每个人都这样做需要的总时间为O(人数)。所以,广度优先搜索的运行时间为O(人数+边数),这通常写作O(V+E),其中V为顶点数,E为边数。

原文地址:https://www.cnblogs.com/youcong/p/11032856.html

时间: 2024-12-20 15:11:44

算法图解之广度优先搜索的相关文章

算法图解之广度优先算法

一.用途 广度优先算法是为了解决两样东西之间的最短距离,其中最短距离的含义很多,如: 编写国际跳棋AI,计算最少走多少步就可获胜 编写拼写检查器, 计算最少编辑多少个地方就可将错拼的单词改成正确的单词 根据你的人际关系网络找到关系最近的医生 二.图 图由节点和边组成,模拟一组链接. 三.广度优先搜索 应用场景 从节点A出发,有前往节点B的路径吗? 从节点A出发,前往节点B的哪条路径最短? 问题:你经营着一个芒果农场,你要找一个芒果销售商并把芒果卖给他. 解决思路:你需要优先从你的朋友中开始找,朋

基础算法 --- BFS(广度优先搜索/宽度优先搜索)

个人理解 BFS是一种最简便的图搜索算法,通过遍历整张图直到找到目标节点: 从算法的角度看,所有因为展开节点而得到的字节点会被存储到一个FIFO的数据结构中,被遍历过的节点存储在一个容器中(一般是一个set),防止重复搜索 图解 如图所示,我们想要获取从S到E节点的最短路径,运用BFS,如何处理?? 主要思想是:从节点S开始将其所有临近子节点存放到一个队列中,然后标记这些节点到最初顶点S的距离为1: 然后根据队列的先进先出特定,出队列,判断是否为目标节点:如果不是,将出队节点的临近子节点入队,直

【算法】广度优先搜索

广度优先搜索(breadth first search) 图 最短路径问题(shorterst-path problem) 解决最短路径问题的算法被称为广度优先搜索. 最短路径问题解决步骤 (1) 使用图来建立问题模型. (2) 使用广度优先搜索解决问题. 图的定义 图模拟一组连接. 图由节点(node)和边(edge)组成.一个节点可能与众多节点直接相连,这些节点被称为邻居.图用于模拟不同的东西是如何相连的. 广度优先搜索 广度优先搜索是一种用于图的查找算法,可帮助回答两类问题. 第一类问题:

图的遍历之 深度优先搜索和广度优先搜索

本章会先对图的深度优先搜索和广度优先搜索进行介绍,然后再给出C/C++/Java的实现. 目录 1. 深度优先搜索的图文介绍 1.1 深度优先搜索介绍 1.2 深度优先搜索图解 2. 广度优先搜索的图文介绍 2.1 广度优先搜索介绍 2.2 广度优先搜索图解 3. 搜索算法的源码 深度优先搜索的图文介绍 1. 深度优先搜索介绍 图的深度优先搜索(Depth First Search),和树的先序遍历比较类似. 它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然

6广度优先搜索

广度优先搜索是图算法. 广度优先搜索让你能够找出两样东西之间的最短距离.最短距离的含义有很多.使用广度优先搜索可以: 编写国际跳棋AI,计算最少走多少步就可获胜 编写贫血检查器,计算最少编辑多少个地方就可将错拼的单词改成正确的单词 根据人际关系网络找到关系最近的医生 1. 图简介 假设要从双子峰前往金门大桥. 乘公交车前往,并希望换乘最少. 要确定如何从双子峰前往金门大桥,需要两个步骤: 使用图来建立问题模型 使用广度优先搜索解决问题 对比发现,方法1只需3步.解决最短路径问题的算法被称为广度优

基础算法(三)——广度优先搜索

广度优先搜索(Breadth First Search),是很多重要的图的算法的原型. 重要的作用:遍历.对于图的遍历,一般有以下的基本思想: ①从图中某个顶点V0出发,并访问此顶点: ②从V0出发,访问V0的各个未曾访问的邻接点W1,W2,-,Wk;然后,依此从W1,W2,-,Wk 出发访问各自未被访问的邻接点. ③重复②,直到全部顶点都被访问为止. [例]如图1-7,按照广度优先搜索的思想遍历这张图. 正确的方法应该是: [例]编写"连连看"的简单程序 规则是:相连不超过两个弯的相

【算法导论】--C++实现广度优先搜索bfs

一.题目 根据上次随机生成的100个顶点的无向图和有向图,对其进行广度优先搜索. 二.理解广度优先搜索 广度优先搜索可以将其想象成水滴落入水面溅起了的一圈一圈的涟漪,是由一个起始点开始一圈一圈进行扩散搜索的. [课上老师是这样说的,大家想象一下,发现其实非常形象] 广度优先搜索总是从一个起始点出发,首先扩散这个点周围所有的邻居,然后邻居在去扩散邻居的邻居(*^-^*)...然后一直到最后将整张图都扩散完. 三.代码实现 对于第一次随机生成100个顶点的图进行了细节的修改,将每个顶点的类型改为了自

十大基础实用算法之深度优先搜索和广度优先搜索

深度优先搜索算法(Depth-First-Search),是搜索算法的一种.它沿着树的深度遍历树的节点,尽可能深的搜索树的分支.当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点.这一过程一直进行到已发现从源节点可达的所有节点为止.如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止.DFS属于盲目搜索. 深度优先搜索是图论中的经典算法,利用深度优先搜索算法可以产生目标图的相应拓扑排序表,利用拓扑排序表可以方便的解决很多相

广度优先搜索(BreadthFirstSearch)& 迪克斯特拉算法 (Dijkstra's algorithm)

BFS可回答两类问题: 1.从节点A出发,有前往节点B的路径吗? 2.从节点A出发,前往节点B的哪条路径经过的节点最少? BFS中会用到“队列”的概念.队列是一种先进先出(FIFO, first in first out)的数据结构,与栈不同,栈是后进先出(LIFO, last in first out)的数据结构. 还会用到“字典”的概念.字典在现在很多语言中都存在且广泛使用,字典中的元素是一组<键(key),值(value)>对,key的值是不可以重复的.关于字典的详细内容,网上有很多资料