系列文章目录

第一章:二分查找及大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)的。
  • 你需要按加入顺序检查搜索列表中的人,否则找到的就不是最短路径,因此搜索列表必 须是队列。
  • 对于检查过的人,务必不要再去检查,否则可能导致无限循环。

算法学习(五)—— 广度优先搜索相关推荐

  1. 数据结构与算法--图的广度优先搜索 (BFS)

    广度优先搜索即是 一种"地毯式"层层推进的搜索策略,即先查找离起始顶点最近的,然后是次近的,依次往外搜索. BFS解决的最短路径问题. 采用BFS进行遍历的话,需要依赖队列,先进先 ...

  2. 算法复习|广度优先搜索BFS

    广度优先搜索BFS 文章目录 广度优先搜索BFS HDU-1253 胜利大逃亡 HDU-1241 Oil Deposits 算法思想 从初始状态S开始,利用一定的规则,生成所有下一层的状态,依次入队 ...

  3. 算法学习(五)---队列

    package com.tw.dst.sq; /** * <p>队列是一种先进先出(FIFO)的线性数据结构,常用操作有插入(insert)和删除(remove)</p> *  ...

  4. 《算法图解》学习笔记(六):图和广度优先搜索(附代码)

    欢迎关注WX公众号:[程序员管小亮] python学习之路 - 从入门到精通到大师 文章目录 欢迎关注WX公众号:[程序员管小亮] [python学习之路 - 从入门到精通到大师](https://b ...

  5. 广度优先搜索_计算机入门必备算法——广度优先遍历搜索

    1.  序言 又很久没有学习了,上次学到哈希表又称散列表的相关知识,这次我们学习一种新的数据结构来建立网络模型.这种数据结构被称作图.首先,我们先应该先了解一下什么是图,其次学习第一种图的算法,这种图 ...

  6. 小白的算法初识课堂(part6)--广度优先搜索

    学习笔记 学习书目:<算法图解>- Aditya Bhargava 文章目录 图简介 图是啥 广度优先搜索 寻找最短路径 队列 实现图 实现算法 运行时间 图简介 今天是五一,假如我要从家 ...

  7. 【算法学习】图相关算法编程实现-深度优先遍历和广度优先遍历

    一.图的表示 图G=(V,E).要表示一个图,通常有两种方法:邻接表和邻接矩阵.两种方法都既可以表示有向图,也可以表示无向图. 邻接表表示由一个包含|V|个列表的数组组成,其中每个列表对应V中的一个顶 ...

  8. 原创 | 初学者友好!最全算法学习资源汇总(附链接)

    在计算机发展飞速的今天,也许有人会问,"今天计算机这么快,算法还重要吗?"其实永远不会有太快的计算机,因为我们总会想出新的应用.虽然在摩尔定律的作用下,计算机的计算能力每年都在飞快 ...

  9. 超级干货 :最全算法学习资源汇总(附链接)

    在计算机发展飞速的今天,也许有人会问,"今天计算机这么快,算法还重要吗?"其实永远不会有太快的计算机,因为我们总会想出新的应用.虽然在摩尔定律的作用下,计算机的计算能力每年都在飞快 ...

  10. python二叉树广度遍历_黄哥Python: 二叉树的广度优先搜索的二种方法

    特别提示,转行的朋友,2019年不学习数据结构和算法,不刷Leetcode 等面试题库,是找不到程序员工作或者说找不到好的工作.黄哥:黄哥Python:提醒要转行当程序员的朋友,学习要分先后主次​zh ...

最新文章

  1. 使用Java企业级技术开发大型系统(3)
  2. 代码审查工具 sonarqube 简介
  3. hdu5062 简单题
  4. python列表解析式如何使用_python列表推导式操作解析
  5. SFTP例子2----使用JSch实现SFTP文件传输
  6. python爬虫-初步使用Scrapy分布式爬虫(爬取mcbbs整合包保存名称及主要mod),大爱MC
  7. python使用线性回归实现房价预测
  8. Kotlin 第三讲——集合篇1
  9. jquery在html中显示文字居中,jquery单击文字或图片内容放大并居中显示
  10. Linux内核开发:内核模块参数
  11. swift 如何在IOS应用图标上添加消息数
  12. 如何在 Mac 上重命名 Apple Magic Mouse?
  13. Java SSM 分布式开发框架/套件源码
  14. easyui datagrid添加合计行
  15. 纯电动汽车整车控制器(VCU)详细介绍
  16. 46招健脑秘笈,让你变得更聪明
  17. SAP商超订单统一管理系统
  18. TiFlink: 使用 TiKV 和 Flink 实现强一致的物化视图
  19. java 图片质量压缩_java图片高质量压缩
  20. BZOJ 4605 崂山白花蛇草水 权值线段树+K-D树

热门文章

  1. vue子组件给父组件传值
  2. java文本框失去焦点事件,jQuery 文本框得失焦点的简单实例
  3. 数字图像处理:对数变换
  4. 游戏开发 | 基于 EasyX 库开发经典90坦克大战游戏
  5. angular-6大主流前端框架(一)
  6. 第044篇:VBA之三种单元格引用小结(Range、Cells、[单元格区域])
  7. 用CSS实现对话气泡框!
  8. 计算机为啥启用不了网络发现,Win7“网络发现”功能启用不了的原因和解决方法...
  9. 记一次 WebBrowser 打开 PDF 文件失败问题的排查过程
  10. CSS雪碧图Sprite