一、广度优先搜索

广度优先搜索算法(又称宽度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。

广度优先搜索是一种用于图的查找方法,可以帮助解决两个问题:

  • 从节点A出发,有前往B节点的路径码?
  • 从节点A出发,前往B节点的最短路径?

二、图的表示Python

1.先介绍下图结构

  • 图模拟不同东西是如何相连的。
  • 图由节点(node)边(edge)组成
  • 一个节点可能与众多节点直接相连,这些节点被称为邻居(neighbor)

如图:

图模拟不同东西是如何相连的。

图由节点(node)边(edge)组成,

一个节点可能与众多节点直接相连,这些节点被称为邻居(neighbor)

2.图的Python实现

我们使用散列表数据结构实现,在Python中字典(dict)是最常用的散列表。

散列表是无序的所以,字典中节点的添加是没有时序的,先添加和后添加并没有区别。

我们将上图用代码实现

graph={}
graph['你']=['刘备','曹操','孙权']
graph['刘备']=['诸葛亮','法正']
graph['曹操']=['郭嘉','荀彧','关羽']
graph['孙权']=['周瑜','鲁肃']
graph['诸葛亮']=['关羽']
print(graph)'''
输入如下:
{'你': ['刘备', '曹操', '孙权'], '刘备': ['诸葛亮', '法正'], '曹操': ['郭嘉', '荀彧', '关羽'], '孙权': ['周瑜', '鲁肃'], '诸葛亮': ['关羽']}
'''

3.有向图和无向图

虽然有箭头指向节点’诸葛亮‘,但是没有从他出发的箭头,这被称为有向图。因此’诸葛亮‘是刘备的邻居,但刘备不是诸葛亮的邻居。

无向图没有箭头,直接相连的节点互为邻居


三、广度优先算法原理及Python实现代码

广度优先搜索算法步骤

  1. 使用一个辅助队列 q,首先将出发节点 v 入队,将其标记为已访问,然后循环检测队列是否为空。
  2. 如果队列不为空,则取出队列第一个元素,并将与该元素相关联的所有未被访问的节点入队,将这些节点标记为已访问。
  3. 如果队列为空,则说明已经按照广度优先遍历了所有的节点。

算法原理图解

  • 建立待搜索队列搜索完成节点集合将初始节点加入待搜索队列

  • 初始节点进行搜索,查看邻居是否为目标节点,
  • 并将1.有子节点且2.未搜索的邻居加入待搜索队列,注意需要满足两个条件才能加入带搜索队列
  • 将搜索完成的节点加入搜索完成节点集合

  • 不断循环直到找到目标节点或者待搜索队列为空

Python实现代码:

from collections import dequedef BFSearch(graph,target,start_node):# 辅助队列,用于存储待检查的节点search_queue=deque()search_queue.append(start_node)# 检查过节点,集合,用于避免一个节点是另外多个节点邻居时,造成的重复检查searched_set=set()# 只要还有未检查的数据,就循环while search_queue:# 弹出最先加入的节点node=search_queue.popleft()# 将节点邻居取出来for neighbor in graph[node]:# 判断是否为 目标节点if neighbor ==target:print('找到了{}'.format(target))return Trueelif (neighbor in graph.keys()) and (neighbor not in searched_set):# 不是目标节点,判断加入搜索队列的两个条件# 1.自身为系欸但# 2.未检查过search_queue.append(neighbor)searched_set.add(node)print('没有找到')return False

看一下运行结果

if __name__=='__main__':graph={}graph['你']=['刘备','曹操','孙权']graph['刘备']=['诸葛亮','法正']graph['曹操']=['郭嘉','荀彧','关羽']graph['孙权']=['周瑜','鲁肃']graph['诸葛亮']=['关羽']print(graph)BFSearch(graph,target='鲁肃',start_node='你')'''
输出如下:
{'你': ['刘备', '曹操', '孙权'], '刘备': ['诸葛亮', '法正'], '曹操': ['郭嘉', '荀彧', '关羽'], '孙权': ['周瑜', '鲁肃'], '诸葛亮': ['关羽']}
找到了鲁肃
'''

广度优先搜索算法(又称宽度优先搜索)是最简便的图的搜索算法之一。他的计算过程并不复杂,就像是剥洋葱,一层一层的寻找直到找到目标

广度优先搜索、宽度优先搜索,《学点算法吧,Python》相关推荐

  1. 广度优先搜索 - 宽度优先搜索 - 横向优先搜索 (breadth-first search,BFS)

    广度优先搜索 - 宽度优先搜索 - 横向优先搜索 (breadth-first search,BFS) 1. 广度优先搜索 - 宽度优先搜索 - 横向优先搜索 (breadth-first searc ...

  2. 生成图-深度优先搜索/宽度优先搜索

    问题提出: 考虑如下图所示的简单图所表示的缅因州的道路系统.在冬天里保持道路通路通畅的唯一方式就是经常扫雪.高速公路部分希望只扫尽可能少的道路上的雪,而确保总是存在连接任何两个乡镇的干净道路.如何才能 ...

  3. 广度优先搜索 宽度优先搜索 迷宫问题 最短路径 最少操作 由近及远 队列

    广度优先搜索,也叫宽度优先搜索,从开始状态,到第一次能到达的状态,再从第一次能到达的状态到下一个能到达的状态,直到探索所有可到达的状态,其时间复杂度为O(状态数×转移的方式). 广度优先搜索使用了队列 ...

  4. 迷宫问题 深度优先搜索 广度优先搜索 宽度优先搜索【python】

    文章目录 一.实验内容 二.深度优先搜索和广度优先搜索总结 1.深度优先搜索算法 2.广度优先搜索算法 三.实验代码和用于测试的迷宫 1.实验代码 2.测试迷宫 2.1 maze1.txt 2.2 m ...

  5. BFS(宽度优先搜索、广度优先搜索)

    宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型.Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想.其别名又 ...

  6. 【算法入门】广度/宽度优先搜索(BFS)

    广度/宽度优先搜索(BFS) [算法入门] 郭志伟@SYSU:raphealguo(at)qq.com 2012/04/27 1.前言 广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述) ...

  7. 八数码宽度优先搜索python代码_图之遍历--广度优先遍历

    何为广度优先遍历呢? 广度优先遍历(BFS),又叫宽度优先搜索或横向优先搜索,是从根结点开始沿着树的宽度搜索遍历,将离根节点最近的节点先遍历出来,在继续深挖下去. 基本思想是: 1.从图中某个顶点V0 ...

  8. 算法学习(九)之“宽度优先搜索”

    什么是宽度优先搜索? 面试题: 小岛问题 题目: 给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量. 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相 ...

  9. ACM算法笔记(十)深度优先搜索与宽度优先搜索

    深度优先搜索 事实上,深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次. 下面 ...

最新文章

  1. 元宇宙中可跨语种交流,Meta 发布新语音模型,支持128种语言无障碍对话
  2. MySql数据库连接超时处理
  3. 如何保证进程间同步工作_软件测试新玩法,看这5家科技巨头如何组织质量保证工作?...
  4. php网站白页面_php页面空白怎么回事 php出现空白页的解决方法
  5. 程序员要如何学英语?
  6. FFmpeg - 音频解码过程
  7. 语音识别准确率永远达不到100%?
  8. Android数据库一些源码分析
  9. 做一款仿映客的直播App
  10. 智能优化算法:猎食者优化算法-附代码
  11. yum快速安装mysql
  12. AdaBoost--从原理到实现
  13. 读书笔记-人月神话5
  14. Rxjava中的Hot Observable 和 Cold Observable
  15. java爬虫爬取B站弹幕
  16. 【Android 教程系列第 27 篇】如何使用 Keytool 工具生成 keystore 签名文件
  17. Git版本控制管理——补丁
  18. 520最浪漫表白:QQ打开基于Python实现的无法拒绝的音乐表白代码!别让等待,成了遗憾!
  19. 手术及切口分类与伤口愈合分级以及ASA麻醉分级
  20. 王佩丰excel2010基础教程学习笔记(第六讲到第十讲)

热门文章

  1. 速看 2021-2022年23项重大网络犯罪统计数据
  2. [234] 回文链表
  3. 唯品会商品详情API接口(item_get-获得唯品会商品详情接口),唯品会详情API接口
  4. 鼻炎舒宁治过敏性鼻炎
  5. linux命令查询网站
  6. Android开发 PDA网络调试
  7. 淘宝上的差评,笑抽了
  8. PTA 7-153 循环结构_ 求数列和
  9. 78L05高耐压版本40V规格书
  10. 笔记-迎难而上之Java基础进阶8