6.3.1广度优先搜索

ヾ(≧O≦)〃好喜欢你

各位同学大家好,上一节课我们介绍了。各位同学大家好,上一节课我们介绍了有关图的基本操作,那么除了上一节课我们介绍的那些相关基本操作之外,还有一种非常重要的操作,就是有关图的遍历,那么图的遍历是有两种有广度优先搜索,也就是广东地还有深度优先搜索本节看我们就来学习图的广度优先搜索,那么首先我们先来了解一下图的遍历是什么呢?其实他与书的便利与纤纤绿,那么首先我们来介绍一下,什么是图的遍历奇实图的便利与树的遍历即现行的便利是类似的,他是从图中某一顶点出发,按照某种搜索方法,沿着图中的编队图中的所有顶点放了一次并且只放一次,这就是土的便利,那么提到土的便利,提到广东一些搜索,其实它与我们之前学习过树的层次遍历的顺序是类似的,那么首先我们先来复习一下树的层次遍历。广度优先搜索,其实它与我们之前学习过树的层次遍历的顺序是类似的,那么首先我们先来复习一下树的层次遍历,那么这样编号的顺序是不是就是数的层次,便利的顺序啊?我们按照编号的顺序依次的访问数中的每一个节点,并且每个节点只访问一次。术中的每一个节点,并且每一个节点只访问一次。注重到每一个节点,并且每个节点只访问一次。力的过程,那么其实如果我们把该数看作成一个图的话术的层次,遍历的过程就是图的广度,优先搜索的这样一个顺序,那么接下来我们就来介绍一下图的广度,优先搜索首先我们要访问起始的一个顶点,顶点位置,接下来我们由该顶点出发依次访问,回到各个位被访问的连接顶点,w1w1,w2b是叫wi投资人应该如何访问呢,我们要访问他们的所有未被访问过的一些经典,那么接着我们只要重复的过程,从这些防护的顶点出发,再访问他们未被反驳的一些经典,然后以此类推就可以访问该图中的所有定点了,这就是广度与探索的过程靠近。然后以此类推就可以访问该图中的所有定点了,这就是广度与它搜索过程,我们发现在广度优先搜索当中,其实我们是优先先锋的,靠近歧视顶点的那些顶点的,这一点与数的层次变变是一致的,那么广度有一些搜索与数的层次变更也是完全一样的吗?我们可以直接把数的层次面积算法直接搬到广度优先思路上吧,答案是不是的,我们发现在广东音搜索的描述过程当中,我们强调了一定是位被访过的各个顶点,他为什么要强调的是位被访过的那些经典呢?我们来看这样一个例子,这是我们刚刚举的那一个图的例子,我们对他进行广度优先搜索剧,它对应数的层次,遍历的顺序是一致的,那么此时我们在0.4和0.5之间增加这样一条向边,且依旧从0.1开始对它进行广度优先搜索。此时我们在0.4和0.5之间增加这样一条,不像编写依旧从0.1开始对他进行广度优先搜索,我们发现此时的管还会有些搜索汇于我们之前类似树的那一个图的网络会产生差异,为什么呢?因为这里有一个类似环状的结构,24有这样一个顶点组成的环,那么我们来看它的广东,现在搜索过程,我们从顶点一出发访问点点1然后访问它的所有的连接,零点就是0.2和0.3,接着我们从顶点二出发访问顶点,二剩下的这4道临界顶点。它的所有的一些零点就是0.2和0.3,接着我们从0.2出发访问顶点,2,剩下的14~0件零点就是0.4和0.5,那么我们依旧访问0.3~0.0.0.6,接着我们从0.4出发依旧访问0.4所有的节能点,此时我们就会发生错误,为什么呢?因为0.5是不是被访问了两次啊?这样就与数的层次变异就不同了,因为在图中是多对多多关系,那么在图中会形成类似的话砖的结构,所以仅仅按照树的层次边界去访问的话,某一个顶点就会出现被访问多次的情况,这样就不符合我们要求的每一个顶点,要被只访问一次,所以我们不能仅仅按照树的层次变异的我们知道输了一种特殊的我们知道输了一种特殊的结构。只访问一次,所以我们不能仅仅按照数的层次变异的那一种算法来实现图的广度,先搜索,那么应该怎么样实现呢?我们知道数的层次变更是进入了一种特殊的数据结构,也就是并列来实现的,那么图我们不仅仅要依靠对列,还要依靠什么呢?还要依靠一个数数组,这个辅助数组的作用就是标记顶点是否会被访问,如果它未被访问的话,我们再定义到它是我们要访问它,如果它。是否未被访问,如果他未被访问的话,我们在变异到他,是我们要反问他,如果他已经被访问的话,我们说不要在访问他,这样就可以了,所以实现广度优先搜索的算法,我们要介绍对列和一个辅助的标记数组好,接下来我们就来看一下,如何用对面加上这样一个辅助的标记数组来实现广图优先的搜索的过程,这是一个意思,我们刚刚举报的那一个无向图的例子,首先我们要画出一个辅助的队列,还有对手和对位,接着我还要写出它的复数的标记数字,我们给他取名字为visit,因为该物像素当中有7个顶点,所以杯子上需要7个数组元素,那么它的下标是从零开始的,大家要注意一下我们要对他进行如何如果我们我们要对他进行如何如果我们要初始化。一下先让我们要对它进行初始化,过程如何初始化呢?如果威胁他是整形的,我们要将它都初始化为0,也就是说这位凌表示光这个顶点未被访问而一表示这个零点已经被封过了。这个数组是-2类型的,那么我们说用false表示被被访问处表示被反过了,也就是说如果单数组是波尔类型的话,则说是化石要把它都初始化为false,好处就是数字初始化的过程,我们就来实现我们所的过程,还是从点一出发实现网络锁的这样一个变异过程,那么我们首先要将顶点一进行入队操作,入队之后呢,我们只要修改辅助数字当中一对应线不要吓得直,也就是下标为0的值将它修改,为什么呢?就让他修改为一表示我们要将0.1进行访问了,然后进行数据操作出对对手元素对数人数是0.1,所以我们访问了0.1,并且此时我们要将0.1所有的连接顶点进行入队操作,其实有一个没有。激情入队操作,此时有一节0.2以及一节0.3要向0.20.3进行入队操作,接着我们还要修改它们对应的数组下标下的值,也就是下面为一和下标为2的值,将它们有理由取百为一表示它们也要将被访问了,就让我们出对对手元素,那么出对了0.20.2对他进行访问,记者依旧降低点2所有的连接的顶点进行入队操作,我们发现0.2是不是有三个连接顶点啊?有顶点10.4和0.5这里我们只录对了0.4和0.5,为什么呢?其实我们有一个条件判断过程,就是利用了我们下面的这个辅助数组vc套,这里有我们的判断条件,不仅仅要是0.2的所有明星的顶点他们是否交。他们是否已经被反驳了,也就是他把对腰被这个数字强调的是是否被零,如果没0的话我们将它进行入队,如果唯一的话,我们则不向它进行部队操作,这里0.4和0.5会被访问,所以它们对应下面的值为0,这个已经点1已经被入队过了,所以它的下降值为1,我们并不对它进行部队操作,号数对了0.4和0.5,接着依旧修改,他们对杨树下个吓得直叫他们修改为1,然后修改为1之后,我们就要出对对手元素出对点点3,那么符合定点3之后,我们还要交点点30接的顶点,并且未入队过的顶点进行入队操作,也就是0.6,那么录入0.6之后,我还要修改它的树下标下的值,将它修改为一出对策之后。改为第一接着你就进行出队操作,0.4你就对他进行访问,那么9:04完之后,还要将他的所有满足条件的点点进行入队操作,这个月我们只入队了得练习,大家发现我们是不是就避免了之前所叙述的那样一个地段啊,就是顶点我会重复进行路队的这样一个弊端,那么这里如果没有这个辅助数组,今天我们就会再次进行入队操作,那么我们就会对顶尖武器系统两次访问,这样就发生了错误,所以我们加入了这样一个辅助数组,就会避免0.5的再次入队,因为此时0.5对应数组相关的值是不是唯一了,所以我们不要对它进行入队操作,只入对了0.7做出对对。7如果对0.7之后,你就习惯它对应数下标下的值为1,接着进行数,对操作数,对对数元素访问0.5,并且要入队所有满足条件的连接点,那么没有这样的礼节点,所以没有任何定点对接着,你就进行出对元素操作出对,并且访问地点61就没有任何的一些经典不对,接着最后访问点点击那么好,这样我们就结束了整个编辑过程,那么我们利用了这样一个辅助数组,没有重复的访问了每一个顶点,并且编辑完之后,数字下标对应的所有的值都会由零点~1表示它所有的顶点已经被访问过了,已经入队伍了,好,这就是广东的邮箱,搜索利用数组和队列来实现的一个过程,所以说我们来看广东邮箱搜索如何用代码来实现它。所以说我们来看广度优先搜索如何用代码来实现它,这就是我昨天搜索的代码实现,那么他有两个函数,我们首先来看第2个函数,第2个函数叫做bfs,它是我们今天搜索的一个缩写,接着我们来看参数表,参数表流表的参数,第1个参数是to j,我们搜索了这个图,第2个参数是一个整形变量,它表示的是我们初始的这个顶点,也就是第1个搜索顶点的一个编号,v介绍在函数体内部,我们首先要访问这个听见basically,然后修改对应数组下标下的值为处表示它已经要入队了,那么这里我们发现单数组是一个或者类型变量,我们用处表示已经入队了,用false表示未入队,那么接下来我们就要将它用这个操作入对到这个q当中循环的。用这个操作入队到这个q当中,那么之后是一个循环,语句就是循环的一个过程,那么循环条件就是判断该对应是否为空,如果为通的话,表词表示啊,搜索完毕,如果为空的话所表示其中还有顶点,我们还要继续进行搜索,那么在循环体当中,内容首先是一个出对操作出对对手元素,并把它复制到会议当中,然后是一个循环语句,这个循环语句是什么呢?其实是找到所有符合条件的连接顶点,我们来看循环的条件,循环条件,首先我们初始化了一个值w,一个变量w将它复制,为什么呢?将它复制为这个函数的返回值,这函数是不是就是我们之前介绍的那个函数啊?求某一个顶点第1个可以接到顶点第一个如果他是。他说求某一个顶点,第1个你接到顶点的叫first温饱,那么我们求出了第1个菱形的顶点之后,我们要对它进行判断,w是否大于等于0,如果它是-1的瓦斯表示没有理解零点了,如果它大于等于0的话,所以表示它是该连接顶点的编号,那么接着每次执行完for循环循环体当中内容之后,我们要加它指向下一个连接的顶点,还是利用了我们之前学习过的那一个函数next number,求出该定点到下一个给界定点,那么并把它复制给w,那么在循环点当中内容是什么呢?首先是一个条件判断语句是否已经背负了是否已经入队了飞表示这个词他是一个变量如果他问。该景点是否已经被访问过了?是否已经入队了,那么这个月我们要非威胁它,它又来表示那么这个我们知道这个值数字三标的值,它是一个倍儿的一项变量,如果它未被访问称为false,那么false在取非是不是就为除了,如果为除是不是不是叫直销条件判断判断题当中的内容,也就是说他如果未入队广,我们要是像下面的内容,那么如果他未被罚过,我们首先要访问该金店,并且要将它们对应的标记为父治违处表示,他已经被反过了,并且已经入队过了,介绍两家a景点进行入住销售,为什么呢?因为我们下一次宣贯是不是还要将它进行出兑啊?出兑之后我们还要。叫入队操作为什么呢?因为我们下一次循环是不是还要将它进行出,对啊,出对之后我们还要将它叫临界定点,像它所符合条件的那些定点进行入队并且访问的操作,那么大家可能会发现,bfs是不是就是我们之前秒出的那一个访问的过程啊,一个广度因为搜索便利的过程,那么之前的这个函数已经是第1个函数,是什么样的作用呢?我们来看这一个图,那么这一个五象图,它是不是一个联通图啊?我们发现如果是联通图的话,我们由一个顶点出发,是不是可以由它们的边放到每一个顶点啊?但是如果它是一个非联通图的,我们来看,如果我们加上了两个顶点并且一条边的话,它是不是变成了一个不变通的图啊,那么这样我们只从顶点一出发所有的不是的是不会被没有一条边是他们。所有的顶点吗?答案是不是的?是不是在这里0.8克的烟酒永远都不会被封了,因为没有一条边是与它们相连的,所以这个月我们还需要第1个函数第1个函数,第1个函数,最重要的就是这样一个作用,那么首先在该函数当中是两个初始化的过程,第1个初始化,第1个初始化是初始化,我们对应的这一个vc上数组相差的都是初始化为false,那么第2个初始化可能数是化成一个我们辅助的对列竖式化对列q,那么之后这个for循环就是我们实现这个非联通图的,我们搜索的一个循环,这在单循环当中是写的是哪些过程呢?其实非常简单了,我们是循环了所有顶点,那么对于每个顶点我们有这样的条件判断语句,如果该顶点已经被反问过了,则不执行下面的。已经被反问过了,则不执行下面的搜索过程,如果该点位被反过说我们要执行,就先搜索到这样一个函数,也就是调用下面的这样一个函数,那么我们来看这样一个例子,例如是这样一个无效图,如果首先我们从0.1出发,我们对它进行过。下面的我们就先搜索过程,如果该顶点未被反过,所以我们要执行,我就先搜索到这样一个函数,也就是调用下面的这样一个函数,那么我们来看这样一个例子,例如是这样一个5象图,如果首先我们从顶点一出发,我们对他进行广度优先搜索,是不是0.1~0.7所有的顶点都被反过了,那么它对应数字下标的时候是不是都没处啊?我们在从这样一个循环语句循环的判断,0.2~0.70就会发现他们的对应数的相对论值都为负,这样就不会对它进行dfs的一个搜索过程,那么直到循环到0.8时,我们发现0.8对应到数据下标依旧为false,那么此时我们要执行对于0.8的一个BS负x的函数所以之后也不会对。也被副市委处了,所以循环到顶点久之后,也不会对它进行bfs这样一个函数的调用,所以我们利用了这样一个循环,每个顶点的一个for循环来实现了对于这样一种cm通道图进行过读学前搜索的这样一个过程,这就是第1个函数的作用,那么接下来我们再分析一下蝙蝠的算法的性能,首先我们来看它的空间复杂度,我们知道pmf算法需要两个辅助变量,第1个是一个辅助的数组,第2个是一个辅助的队列,我们首先来看辅助的数组辅助数组,我们需要一个顶点数量的大小,所以它的空间复杂度为大o顶点的数表对操作最大的数量大小那么数量。那么综合起来空间复杂的数量级就是点数量,也就是大ov的绝对值,v的绝对值表示的就是定点的数量抛出,就是该算法的空间复杂度,就这样我们再来看它的时间复杂度,我们知道如果我们采用不同的测试结构,也就是比线矩阵或者是比列表,对它的算法会产生影响,所以我们首先来看它的零件矩阵表示法,如果对于这样的连接矩阵,它的时间复杂度是多少呢?它是打了节点数量的平方,为什么是这样一个数量级的呢?在该算法当中,我们要对每一个定点进行一次入队操作,它是大ov的数量级的,那么在该算法当中,首先我们要对每个节点都要进行一个数对操作是什么样子。找到所有符合条件的邻接顶点,那么找到这样的界定点的过程,在临街军人法当中是什么样子呢?我们只要队友某一行循环的找,每一个只看他是否为1,如果唯一的话则表示存在这样一条边,它就是它的零点,那么这样一个循环过程,我们循环的大小是不是就是景点的数量,所以每一个定点都要有这样一个循环找临界顶点的过程,所以它的数量级是大o顶点数量的平方,这就是连接区身法下的该算法的数量级,也就是时间复杂度,实际上我们再来看,如果我们采用临界表法,它是怎样的数量级呢?它是大o顶点的数量加上点的数量,我们来看为什么同样每一个定点,是不是也要对它进行一次分类操作一次访问操作对于每一个。知道它是大o顶点的数量加上点的数量,我们来看为什么同样每一个定点,是不是也要对它进行一次物流操作一次访问操作,所以呢,加上这个意思是什么呢?也是一个找边的一个过程,那么对于每一个定点,我们要找到它所有连接到符合条件的边,其实是对于某一个顶点编表的一个编辑过程,也就是属于它店面表的一个电影过程,那么所有的定点我们都要有这样一个找到符合条件的一个临界点的过程,所以我们要找寻到所有的符合条件的给它编,那么对于临界表格当中存储了多少个临街的颠倒,那么它的大小就是e的大小也就是边的这样一个数量级,所以说它的时间复杂度为大ov的数量级加上e的数量限如果的话如果。边的这样一个数量级,所以说它的时间复杂度为大ob的数量计算器加上e的数量c,那么其实这个复杂度是不是还表示如果它是一个稠密图的话,那么它是不是就相当于相当于边的数量积啊?如果他是一个稀疏图的话,那么他就会接近一个顶点的数量记好,这就是邻接矩阵表示法下,邻接表表示法下辨法算法的时间复杂多好,这就是广东现搜索以及它的代码实现,那么同学们可能会有疑问,我们学习这样代码这样的算法过程,我们只是局限于它本身嘛,也就是说它只是实现了一个广度优先搜索的方法吗?答案是不是的?其实我们可以利用这样的思索过程,实现很多集聚问题的解决方法,那么我们其实学习的是一种思想,一种便利的思想之后的学习或者是考试当中问题。考试当中我们会令他来解决许多实际的算法问题,那么本节课我们就来介绍一个与考研比较相关的一个问题,就是利用广播员搜索解决无权图单元最短路径的问题,可能大家对于这样一个问题,它的题目会有一些疑惑,我们来看,首先这个问题已经针对的是无权阻挡,也就是说边是没有权重的,其实这里可以扩展一下,如果边它的权重都是一个相同到正数也是可以的,其次我再来看单元单元是什么意思啊,也就是说从一个顶点为初始顶点即将出发,求解该顶点所有到达其他顶点的c端行,这就是单元的意思,那么接下来我们还要定义的是什么呢?定义的是什么?表示最短我们来看,我们这样定义最短的我们定义从顶点u到顶点,a的最短路径为duv,我们用这样的符号来表示。从顶点哟顶点味道任何路径当中边数最少的那一条路叫,所以这里我们定义最短路线的最短是用边数最少的一道,如果从物流到a没有通路,也就是说它们之间没有路径可以达到的话,我们走应该变调为正,不可以达到好,我们来看这样一个无向图的例子,怎么找到0.1的所有的单元,最早路就那么我们来看一个例子,从0.1到达0.5,我们是不是有这样两条路径,我们可以从0.10.20.4再到达0.5这样经历了三条边,然后我们还可以从0.10.2直接到达0.5经历了两条边,所以我们选取最短的也就是0.10.2到达0.5这一个路径为它的最短路径,那么如何可以用广州元搜索来解决这样的问题呢他醉心变。我应该搜索会员搜索来解决这样的问题呢,其实我们院搜索之前,我们提到过它最新便利的,是不是与初始景点较近的那一个,所以广播音乐搜索刚好符合了,求出这样的单元最短路径的问题目,我们最先便利等一定的时候是边数,最少就是路径最短的那一个顶点,那么跟大家回忆一下,它的过程我们访问了0.1之后,最先入队的是不是都是它边数,唯一的也是路径长度唯一的那一个,你记得零点了是不是就是0.2和0.3,然后入队的第2批顶点是边数为2的4个顶点,按照这样特点,我们是不是就是依次找到了所有可以到达而且边数最少的那一些顶点啊,所以我们可以搜索可以实现解决这样问题的方法发现相同的。这样的代码实现与我们之前的呢,我们这些搜索代码是比较相同的,只不过在这里有没有一个小的带动,就是我们要保存该最短的路径要导直,我们用一个数组d来表示,那么它的参数也就比较高,第1个是这个图g,第2个也就是出发的顶点,它的编号u,然后这一个for循环是什么意思啊?这一个for循环,其实我们是叫每一个鹿叫复制为了一个最大值,这个最大值则是我们之前所说的一个无穷大,那么因为在语言当中我们并没有无穷大,所以我们可以定义麦克斯为无穷大,然后将每个数字的这个数字的值复制为麦克斯,表示它是无穷大的,比如说一开始我们从舒适顶点到其于到每个顶点之间都是没有入镜的,接着我们依旧要将对应出是钉钉的一个访问的数组下标复制为处表示他已经被访问了干嘛。标复制为数表示它已经被访问了,那么因为初始顶点到初始顶点它之间的路径长度为0,所以我们要将du的值复制为0,接下来我们要将由入队这与广东研究所是一样的,之后依旧是一个循环语句,它与广州原先搜索也是一样的一个循环的一个过程,第1个焦点语序也就是一个数据操作,然后就是这样一个循环语句在循环当中条件与我们之前的广东音乐搜索的循环条件是一模一样的介绍,在其中依旧是一个f条件判断,语句判断该经典是否已经被录对过了,或者是已经被否认过了,现在我们依旧要将这个顶点复制为处,然后这也不同了,这里我们增加了一条语句增加是什么?就是我们要保存对应两个顶点之间最短的是一条路径,我们用du加e来表示,这里为什么可以用du加e来表示。表示这里为什么可以用du加e来表示初始顶点到该顶点w的一个最短路径啊,因为因为现在是不是与w相邻的这一个顶点,而u到出水顶点的最短路径,再加上u到w的这一个边,是不是就是w到出示顶点的这一个最短路径,所以我们可以用这样的语句来求说d>6,接着又是一个你的操作,对我们这样一个顶点,w好,这就是求单元最短路径的一个实现代码,我发现了,其实它与广度线搜索是不是就增加了三个语句的三个有关保存句的无尽的语句好,这就是我们利用了广度电搜索的一个代码思想来实现了解决了一个实际的问题,最后我们再来介绍一个小考点,就是广读一篇生成术。一个实际的问题,最后我们再来介绍一个小考点,就是我们有点生成树它是什么呢?它是我们在广东现变现的过程当中会得到一颗便利的树,也就是我们经历的所有的边和顶点,组成了一颗便利的数称为广东优先什么树,当然这里如果我们原先的那样一个图是联通图的话,我们会得到的是一个生成数,如果它是非联通的话,我们会得到。得到的是一颗生成树,我会得到一颗生成的森林,好,接下来我们一起看一个小例子,这是一个我们之前举的那一个我们相同的例子,一秀从0.1出发进行广度优先搜索,那么他的恐怖片的双向树是什么样子的呢?是这个样子的,他的边是所有我们搜索经历的边,我们发现这个时候没有0.4~0.5的变了,因为0.5分的是不是顶点2到底。4~0.5的变了,因为0.5是由哪一个点点进行访问的?是不是顶点2到达的顶点5啊,所以在该商标书上并没有0.4到达0.5的这一个边,这就是一个属于他的广州音搜索沈长树,那么接下来我们来看,有一个小的知识点就是民间学身法的广度优先生成树是唯一的人民先描法的生产数是不唯一的,因为我们知道一个图,它的邻接矩阵表示法的邻接矩阵是唯一的。所以我们在实现算法的过程当中,他的遍历的过程也是唯一的,那么我们知道评鉴表表示上当中对于一个图的表示他是不唯一的,因为我们戍边的次序不唯一,它对应生产的编表就会不为1,那么对于我们实现算法时,他便立地变的过程,它便利的变的次序也会不为1,所以如果一个图是你这边买的法术到他身上的仙术就不一定唯一了好,这就是本节课的全部内容。

 


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值