python-广度优先搜索
广度优先搜索
下面我们来来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-广度优先搜索的更多相关文章
- python 实现图的深度优先和广度优先搜索
在介绍 python 实现图的深度优先和广度优先搜索前,我们先来了解下什么是"图". 1 一些定义 顶点 顶点(也称为"节点")是图的基本部分.它可以有一个名称 ...
- python实现广度优先搜索和深度优先搜索
图的概念 图表示的是多点之间的连接关系,由节点和边组成.类型分为有向图,无向图,加权图等,任何问题只要能抽象为图,那么就可以应用相应的图算法. 用字典来表示图 这里我们以有向图举例,有向图的邻居节点是 ...
- 常用算法2 - 广度优先搜索 & 深度优先搜索 (python实现)
1. 图 定义:图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合. 简单点的说:图由节点和边组成.一 ...
- 【数据结构与算法Python版学习笔记】图——词梯问题 广度优先搜索 BFS
词梯Word Ladder问题 要求是相邻两个单词之间差异只能是1个字母,如FOOL变SAGE: FOOL >> POOL >> POLL >> POLE > ...
- 用Python实现广度优先搜索
图是一种善于处理关系型数据的数据结构,使用它可以很轻松地表示数据之间是如何关联的 图的实现形式有很多,最简单的方法之一就是用散列表 背景 图有两种经典的遍历方式:广度优先搜索和深度优先搜索.两者是相似 ...
- 广度优先搜索(BFS)解题总结
定义 广度优先搜索算法(Breadth-First-Search),是一种图形搜索算法. 简单的说,BFS是从根节点开始,沿着树(图)的宽度遍历树(图)的节点. 如果所有节点均被访问,则算法中止. B ...
- 图的广度优先搜索(BFS)
把以前写过的图的广度优先搜索分享给大家(C语言版) #include<stdio.h> #include<stdlib.h> #define MAX_VERTEX_NUM 20 ...
- 广度优先搜索(BFS)
定义 维基百科:https://en.wikipedia.org/wiki/Breadth-first_search 给定图G=(V,E)和一个可识别的源结点s,广度优先搜索对图G中的边进行系统性的探 ...
- 总结A*,Dijkstra,广度优先搜索,深度优先搜索的复杂度比较
广度优先搜索(BFS) 1.将头结点放入队列Q中 2.while Q!=空 u出队 遍历u的邻接表中的每个节点v 将v插入队列中 当使用无向图的邻接表时,复杂度为O(V^2) 当使用有向图的邻接表时, ...
- ACM题目————图的广度优先搜索
题目描述 图的广度优先搜索类似于树的按层次遍历,即从某个结点开始,先访问该结点,然后访问该结点的所有邻接点,再依次访问各邻接 点的邻接点.如此进行下去,直到所有的结点都访问为止.在该题中,假定所有的结 ...
随机推荐
- CPP--借助神器VS理解内存存储
之前也有想了解这些,第一个不是学底层的不知道从何理解,第二个上网搜概念,大牛们三言两语就结束了,举得例子也比较复杂,对于非C方向的可能有点吃力,所以一直没理解. 今天偶然发现原来还要内存窗口之说,就慢 ...
- HTML ——Flex弹性布局
弹性盒布局的使用 1.为父容器添加display:flex或inline-flex属性 (Webkit内核的浏览器,必须加上-webkit前缀.) 容器默认存在两根轴:主轴(main axis)和交叉 ...
- 利用子集构造法实现NFA到DFA的转换
概述 NFA非有穷自动机,即当前状态识别某个转换条件后到达的后继状态不唯一,这种自动机不便机械实现,而DFA是确定有限状态的自动机,它的状态转换的条件是确定的,且状态数目往往少于NFA,所以DFA能够 ...
- 读 zepto 源码之工具函数
Zepto 提供了丰富的工具函数,下面来一一解读. 源码版本 本文阅读的源码为 zepto1.2.0 $.extend $.extend 方法可以用来扩展目标对象的属性.目标对象的同名属性会被源对象的 ...
- AspNetCore-MVC实战系列(四)之结尾
AspNetCore - MVC实战系列目录 . 爱留图网站诞生 . git源码:https://github.com/shenniubuxing3/LovePicture.Web . AspNetC ...
- UML总结(对九种图的认识和如何使用Rational Rose 画图)
UML是一种建模语言,是系统建模的标准.我们之所以建模是因为大规模的系统设计时相当复杂的,当系统比较复杂时就会涉及到以下这几个问题: 开发人员如何与用户进行沟通来了解系统的需求? 开发人员之间如何沟通 ...
- [ABP实战开源项目]---ABP实时服务-通知系统.发布模式
简介 在ABP中,提供了通知服务.它是一个基于实时通知的基础设施.分为订阅模式和发布模式. 本次会在项目中使用发布模式来演示一个用户注册后,收到的欢迎信息. 发布模式 首先我们在领域层建立" ...
- IOS的UITableView
UITableView 概述 UITableView 一般用来展示表格数据.可以滚动(继承自UIScrollView).性能极佳 UITableView分两种样式: Plain,不分组的样式 Grou ...
- N维法向量与N维超平面的关系的简单证明(日志二)
虽然按照上面的方式证明出来,但感觉之中,似乎依旧是不严密的, 如下: 如果直线是2x+2y+1=0 那么(-1,1)也是其平行向量 ,.那么(1,1)依旧是法向量 此时,直线经过(0,-1/2)这个点 ...
- JS立即执行函数表达式(IIFE)
原文为 http://benalman.com/news/2010/11/immediately-invoked-function-expression/#iife ----------------- ...