算法学习(五)—— 广度优先搜索
系列文章目录
第一章:二分查找及大O表示法
第二章:选择排序
第三章:递归和快速排序
第四章:散列表
第五章:广度优先搜索
文章目录
- 系列文章目录
- 前言
- 一、图简介
- 二、广度优先搜索
- 1、查找有无路径?
- 2、查找最短路径
- 3、队列
- 三、代码实现
- 1、实现图
- 2、实现算法
- 3、运行时间
- 四、总结
前言
积累算法,记录学习
一、图简介
图模拟一组连接。由节点(node)和边(edge)组成。
比如《图解算法》中给出的生动例子,这个图指出欠钱关系,比如ALEX欠了EAMA的钱,RAME又欠了ADIT钱,以此类推。
并且,一个节点可能与众多节点直接相连,这样的节点被称为邻居,也有一些互不相连的节点,可以通过彼此的邻居进行关系连接。因此直接相连称为“一度关系”,经过一个邻居相连(比如ALEX和ADIT)被称为“二度关系”,依此类推。
总之,图用来模拟不同对象是怎么相连的。在我认为的所有算法中,图算法应该是最有用的。
二、广度优先搜索
广度优先搜索是一种用于图的查找算法,用于解决最短路径问题,可以帮助回答两类问题:
- 从节点A出发,有前往节点B的路吗?
- 从节点A出发,前往节点B的哪条路径最短?
1、查找有无路径?
1)依次检查一度关系,查看能否相连
2)如果能相连,则成功结束
3)不能相连,将每一个一度关系的邻居加入查找名单
4)循环,直到寻找到路径或者循环完毕
2、查找最短路径
最短路径肯定会优先出现在一度关系,然后是二度关系,依次类推
因此只有按顺序查找,才能实现这个目的,可实现这种目的的数据结构是队列(queue)
3、队列
队列的工作原理与现实生活中的队列完全相同,是一种先进先出(First In First Out,FIFO)的数据结构,与栈的后进先出(Last In First Out)区别开来。
三、代码实现
1、实现图
使用上一节讲到的散列表来表示图
比如和“我”有一度关系的是:BOB、CLAIRE、ALICE,散列表将键映射到值,我们将节点映射到所有邻居:
>>> graph = {}
>>> graph["you"] = ["alice", "bob", "claire"]
>>> graph
{'you': ['alice', 'bob', 'claire']}
当我们需要表示一个更大的图:
表示它的代码就是
>>> graph = {}
>>> graph["you"] = ["alice", "bob", "claire"]
>>> graph["bob"] = ["anuj", "peggy"]
>>> graph["claire"] = ["thom", "jonny"]
>>> graph["alice"] = ["peggy"]
>>> graph["anuj"] = []
>>> graph["peggy"] = []
>>> graph["thom"] = []
>>> graph["jonny"] = []
>>> graph
{'you': ['alice', 'bob', 'claire'], 'bob': ['anuj', 'peggy'], 'claire': ['thom', 'jonny'], 'alice': ['peggy'], 'anuj': [], 'peggy': [], 'thom': [], 'jonny': []}
并且要注意,散列表是无序的,因此他们的顺序无关紧要
没有邻居的几个人anuj、Peggy、Thom、jonny只有指向他们的,没有他们指出的箭头,这种叫做有向图,其中的关系是单向的。另一种图叫做无向图,其用直线相连,互为邻居。下面这两个图是等价的。
2、实现算法
算法原理:
1)创建一个队列
2)弹出一个对象,查看它是否符合要求
3)符合就大功告成
4)不符合就将他的所有邻居加入队列
5)回到第二步
6)直到队列为空,表示
首先我们创造一个队列,在python中可以使用函数deque来创建一个双端队列。并且为了避免有互相的邻居从而一直循环下去,要设置一个检查数组,来进行查重,将已经搜索过的对象进行一个屏蔽。我们设置一个寻找对象:芒果商mango seller,当名字最后一个字母是m就代表他是芒果商。嘻嘻。
实现如下:
>>> def search(name):search_queue = deque() # 创建队列search_queue += graph[name] # 将name的邻居加入到队列searched = [] # 检查数组while search_queue: # 当队列不为空person = search_queue.popleft() # 左边弹出一个对象if not person in searched:if person_is_seller(person):print(person+"is a mango seller.")return Trueelse:search_queue += graph[person]searched.append(person)return False>>> def person_is_seller(name):return name[-1] == 'm'>>> search("you")
thomis a mango seller.
True
3、运行时间
广度优先搜索的运行时间为O(人数 + 边数),这通常写作O(V + E),其中V为顶点( vertice)数, E为边数。
四、总结
- 广度优先搜索指出是否有从A到B的路径。
- 如果有,广度优先搜索将找出最短路径。
- 面临类似于寻找最短路径的问题时,可尝试使用图来建立模型,再使用广度优先搜索来
解决问题。 - 有向图中的边为箭头,箭头的方向指定了关系的方向,例如, rama→adit表示rama欠adit钱。
- 无向图中的边不带箭头,其中的关系是双向的,例如, ross - rachel表示“ross与rachel约
会,而rachel也与ross约会”。 - 队列是先进先出( FIFO)的。
- 栈是后进先出( LIFO)的。
- 你需要按加入顺序检查搜索列表中的人,否则找到的就不是最短路径,因此搜索列表必 须是队列。
- 对于检查过的人,务必不要再去检查,否则可能导致无限循环。
算法学习(五)—— 广度优先搜索相关推荐
- 数据结构与算法--图的广度优先搜索 (BFS)
广度优先搜索即是 一种"地毯式"层层推进的搜索策略,即先查找离起始顶点最近的,然后是次近的,依次往外搜索. BFS解决的最短路径问题. 采用BFS进行遍历的话,需要依赖队列,先进先 ...
- 算法复习|广度优先搜索BFS
广度优先搜索BFS 文章目录 广度优先搜索BFS HDU-1253 胜利大逃亡 HDU-1241 Oil Deposits 算法思想 从初始状态S开始,利用一定的规则,生成所有下一层的状态,依次入队 ...
- 算法学习(五)---队列
package com.tw.dst.sq; /** * <p>队列是一种先进先出(FIFO)的线性数据结构,常用操作有插入(insert)和删除(remove)</p> * ...
- 《算法图解》学习笔记(六):图和广度优先搜索(附代码)
欢迎关注WX公众号:[程序员管小亮] python学习之路 - 从入门到精通到大师 文章目录 欢迎关注WX公众号:[程序员管小亮] [python学习之路 - 从入门到精通到大师](https://b ...
- 广度优先搜索_计算机入门必备算法——广度优先遍历搜索
1. 序言 又很久没有学习了,上次学到哈希表又称散列表的相关知识,这次我们学习一种新的数据结构来建立网络模型.这种数据结构被称作图.首先,我们先应该先了解一下什么是图,其次学习第一种图的算法,这种图 ...
- 小白的算法初识课堂(part6)--广度优先搜索
学习笔记 学习书目:<算法图解>- Aditya Bhargava 文章目录 图简介 图是啥 广度优先搜索 寻找最短路径 队列 实现图 实现算法 运行时间 图简介 今天是五一,假如我要从家 ...
- 【算法学习】图相关算法编程实现-深度优先遍历和广度优先遍历
一.图的表示 图G=(V,E).要表示一个图,通常有两种方法:邻接表和邻接矩阵.两种方法都既可以表示有向图,也可以表示无向图. 邻接表表示由一个包含|V|个列表的数组组成,其中每个列表对应V中的一个顶 ...
- 原创 | 初学者友好!最全算法学习资源汇总(附链接)
在计算机发展飞速的今天,也许有人会问,"今天计算机这么快,算法还重要吗?"其实永远不会有太快的计算机,因为我们总会想出新的应用.虽然在摩尔定律的作用下,计算机的计算能力每年都在飞快 ...
- 超级干货 :最全算法学习资源汇总(附链接)
在计算机发展飞速的今天,也许有人会问,"今天计算机这么快,算法还重要吗?"其实永远不会有太快的计算机,因为我们总会想出新的应用.虽然在摩尔定律的作用下,计算机的计算能力每年都在飞快 ...
- python二叉树广度遍历_黄哥Python: 二叉树的广度优先搜索的二种方法
特别提示,转行的朋友,2019年不学习数据结构和算法,不刷Leetcode 等面试题库,是找不到程序员工作或者说找不到好的工作.黄哥:黄哥Python:提醒要转行当程序员的朋友,学习要分先后主次zh ...
最新文章
- 使用Java企业级技术开发大型系统(3)
- 代码审查工具 sonarqube 简介
- hdu5062 简单题
- python列表解析式如何使用_python列表推导式操作解析
- SFTP例子2----使用JSch实现SFTP文件传输
- python爬虫-初步使用Scrapy分布式爬虫(爬取mcbbs整合包保存名称及主要mod),大爱MC
- python使用线性回归实现房价预测
- Kotlin 第三讲——集合篇1
- jquery在html中显示文字居中,jquery单击文字或图片内容放大并居中显示
- Linux内核开发:内核模块参数
- swift 如何在IOS应用图标上添加消息数
- 如何在 Mac 上重命名 Apple Magic Mouse?
- Java SSM 分布式开发框架/套件源码
- easyui datagrid添加合计行
- 纯电动汽车整车控制器(VCU)详细介绍
- 46招健脑秘笈,让你变得更聪明
- SAP商超订单统一管理系统
- TiFlink: 使用 TiKV 和 Flink 实现强一致的物化视图
- java 图片质量压缩_java图片高质量压缩
- BZOJ 4605 崂山白花蛇草水 权值线段树+K-D树
热门文章
- vue子组件给父组件传值
- java文本框失去焦点事件,jQuery 文本框得失焦点的简单实例
- 数字图像处理:对数变换
- 游戏开发 | 基于 EasyX 库开发经典90坦克大战游戏
- angular-6大主流前端框架(一)
- 第044篇:VBA之三种单元格引用小结(Range、Cells、[单元格区域])
- 用CSS实现对话气泡框!
- 计算机为啥启用不了网络发现,Win7“网络发现”功能启用不了的原因和解决方法...
- 记一次 WebBrowser 打开 PDF 文件失败问题的排查过程
- CSS雪碧图Sprite