广度优先搜索

下面我们来来BFS算法策略:

 

  比如:我们要从双子峰---->金门大桥,最短路径如何?

  我们利用广度优先搜索来一步步求解,注意广度优先搜索在于的关键在于“广”,也就是说以双子峰为起点,我们要尽可能的多比较与之相邻的周边路径,从其中选取一条最优路径。

  第一步:

  

我们沿着两个箭头方向路径探索到a点和b点后,发现并没有到达想要去的地方,于是我继续往下探索。

  

同样,我们发现还没有到达目的地,继续往下探索。

  

  到达这一步后,我们发现其中有一条路径已经到达金门大桥,而其他两条路径仅仅到达c点。因此,我们寻找到的最短路径为:双子峰->a->c->金门大桥。

  所以,由上我们可以知道,广度优先搜索其实就是用来探索最短路径的一种方式。

  根据上面实例,我们想要寻找一条到某地的最短路径,需要一下两个步骤:

    (1)使用图来建立问题模型。

    (2)使用广度优先搜索解决问题。

  利用广度优先搜索,我们可以回答两个问题:

    1.从节点A出发,有前往B节点的路径吗?

    2.从节点A出发,前往B节点哪条路径最短?

 首先,我们来看看如何构建一张图。

   这里我们要使用一种能够表示映射关系的数据结构---散列表。至于什么是散列表,这里就不再赘述。

  例如:

    

    graph = {}

    grapu['you'] = ['alice','bob','mar','rain','cat']

    这里的“you”被映射到一个数组。在'you'的这个数组里面,包含所有与你相邻的元素。

      有了以上方式,我们就可以构建一张更大图。

 算法实现策略:

    

    首先,创建一个双端队列,将需要查找的压入队列中。

   from collections import deque

   def person_is_seller(name):

      return name[-1] == 'm'  #如果这个名字是以M结尾,则是

   graph = {}

   grapu['you'] = ['alice','bob','mar','rain','cat']

   search_queue = deque()  #创建一个队列

     search_queue += graph['you'] #将you压入队列

   while search_queue:  #只要队列不为空

      person = search_queue.popleft()  #取出左边第一个人

      if person_is_seller(person):  #检查这个人是否为芒果商

        print person += ' is a mango seller! '

        return True

      else:

        search_queue += graph[person]  #将这个人的朋友加入队列

      return False  #没有芒果商  

   但是,上面算法有一个明显的问题,如果你的朋友alice和bob都有这一个好友,那么在查找的过程中就会陷入循环状态。要解决这个问题,我们可以设置一个列表,来标记那些已经被查找过的人。因此,最终代码如下:

      def search(name):

        search_queue = deque()  #创建一个队列

          search_queue += graph[name] #将需要查找的压入队列

                 searcher = []  # 用于记录已经查找过的

        while search_queue:  #只要队列不为空

            person = search_queue.popleft()  #取出左边第一个人

            if not person in searched:   #当这个人不在searched中才继续往下查找

              if person_is_seller(person):  #检查这个人是否为芒果商

                print person += ' is a mango seller! '

                return True

              else:

                search_queue += graph[person]  #将这个人的朋友加入队列

                searched.append(person)

        return False  #没有芒果商 

 性能分析:

    首先沿着每条边进行查找,如果边数为n,查找效率为O(V)

    再次,我们在每次查找过程中需要对已经搜索的列表进行二次判断,判断所需时间为P(n)

    因此,广度优先搜索总的查找效率为O(V+n)

  

python-广度优先搜索的更多相关文章

  1. python 实现图的深度优先和广度优先搜索

    在介绍 python 实现图的深度优先和广度优先搜索前,我们先来了解下什么是"图". 1 一些定义 顶点 顶点(也称为"节点")是图的基本部分.它可以有一个名称 ...

  2. python实现广度优先搜索和深度优先搜索

    图的概念 图表示的是多点之间的连接关系,由节点和边组成.类型分为有向图,无向图,加权图等,任何问题只要能抽象为图,那么就可以应用相应的图算法. 用字典来表示图 这里我们以有向图举例,有向图的邻居节点是 ...

  3. 常用算法2 - 广度优先搜索 & 深度优先搜索 (python实现)

    1. 图 定义:图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合. 简单点的说:图由节点和边组成.一 ...

  4. 【数据结构与算法Python版学习笔记】图——词梯问题 广度优先搜索 BFS

    词梯Word Ladder问题 要求是相邻两个单词之间差异只能是1个字母,如FOOL变SAGE: FOOL >> POOL >> POLL >> POLE > ...

  5. 用Python实现广度优先搜索

    图是一种善于处理关系型数据的数据结构,使用它可以很轻松地表示数据之间是如何关联的 图的实现形式有很多,最简单的方法之一就是用散列表 背景 图有两种经典的遍历方式:广度优先搜索和深度优先搜索.两者是相似 ...

  6. 广度优先搜索(BFS)解题总结

    定义 广度优先搜索算法(Breadth-First-Search),是一种图形搜索算法. 简单的说,BFS是从根节点开始,沿着树(图)的宽度遍历树(图)的节点. 如果所有节点均被访问,则算法中止. B ...

  7. 图的广度优先搜索(BFS)

    把以前写过的图的广度优先搜索分享给大家(C语言版) #include<stdio.h> #include<stdlib.h> #define MAX_VERTEX_NUM 20 ...

  8. 广度优先搜索(BFS)

    定义 维基百科:https://en.wikipedia.org/wiki/Breadth-first_search 给定图G=(V,E)和一个可识别的源结点s,广度优先搜索对图G中的边进行系统性的探 ...

  9. 总结A*,Dijkstra,广度优先搜索,深度优先搜索的复杂度比较

    广度优先搜索(BFS) 1.将头结点放入队列Q中 2.while Q!=空 u出队 遍历u的邻接表中的每个节点v 将v插入队列中 当使用无向图的邻接表时,复杂度为O(V^2) 当使用有向图的邻接表时, ...

  10. ACM题目————图的广度优先搜索

    题目描述 图的广度优先搜索类似于树的按层次遍历,即从某个结点开始,先访问该结点,然后访问该结点的所有邻接点,再依次访问各邻接 点的邻接点.如此进行下去,直到所有的结点都访问为止.在该题中,假定所有的结 ...

随机推荐

  1. 关于解决配置Tomact过程中出现的相关问题

    最近在学习JavaWeb, 但是在第一步的时候就出现问题了, 什么问题呢, 就是关于Tomact的配置. 下面我就详细说明一下我配置过程中出现的问题以及怎么解决的,  希望对大家能有所帮助. 首先,我 ...

  2. 分享一本书<<谁都不敢欺负你>>

    有些人,不管在工作还是生活上,总是被人欺负. 分享这本书给大家,能给大家带来正能量.你强大了,就没人敢欺负你. 有的时候,感到为什么倒霉的总是我?为什么我的命运是这样?为什么总欺负我? 也许有很多人会 ...

  3. Omi全新版本来袭 - 指令系统

    写在前面 Omi框架到目前为止有三种版本. omi.js 使用 sodajs 为内置指令系统 omi.lite.js 不包含任何模板引擎 omi.mustache.js 使用 mustache.js为 ...

  4. 使用Dubbox构架分布式服务

    第一部分:Dubbo的背景分析及工作原理 1. Dubbo是什么?Dubbo是一个来自阿里巴巴的开源分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案. 简单的说 ...

  5. java 集合框架(TreeSet操作,自动对数据进行排序,重写CompareTo方法)

    /*TreeSet * treeSet存入数据后自动调用元素的compareTo(Object obj) 方法,自动对数据进行排序 * 所以输出的数据是经过排序的数据 * 注:compareTo方法返 ...

  6. phpmyadmin的初始账号密码是多少

    问这个问题,是不是有点弱智,但是这个问题确实阻塞了我那么几分钟. 实际上问题很简单,初始账号是root,密码为空

  7. mui开发app之cropper裁剪后上传头像的实现

    在大多数app项目中,都需要对用户头像的上传,之前做web开发的时候,我主要是通过input type=file的标签实现的,上传后,使用php对图片进行裁剪,这种方式比较传统简单. 此次app开发中 ...

  8. abstract、virtual、sealed

    abstract与virtual前必有public 1.abstract,抽象 1)只要使用到了abstract定义了方法,那么类就一定得用abstract定义,public abstract,只有抽 ...

  9. QQ互联第三方登陆 redirect uri is illegal(100010)

    想必第一次大家接触QQ第三方登陆都会遇到各种各样的问题,备受折磨,因此,今天我把自己做QQ登陆的过程描述一下,希望给大家提供参考,少走弯路. 在开发之前,我们先了解下QQ登陆的流程 第一:查看熟悉 网 ...

  10. 学习MVC之租房网站(八)- 前台注册和登录

    在上一篇<学习MVC之租房网站(七)-房源管理和配图上传>完成了在后台新增.编辑房源信息以及上传房源配图的功能.到此后台开发便告一段落了,开始实现前台的功能,也是从用户的登录.注册开始. ...