广度优先搜索、宽度优先搜索,《学点算法吧,Python》
一、广度优先搜索
广度优先搜索算法(又称宽度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。
广度优先搜索是一种用于图的查找方法,可以帮助解决两个问题:
- 从节点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实现代码
广度优先搜索算法步骤
- 使用一个辅助队列 q,首先将出发节点 v 入队,将其标记为已访问,然后循环检测队列是否为空。
- 如果队列不为空,则取出队列第一个元素,并将与该元素相关联的所有未被访问的节点入队,将这些节点标记为已访问。
- 如果队列为空,则说明已经按照广度优先遍历了所有的节点。
算法原理图解
- 建立待搜索队列和搜索完成节点集合,将初始节点加入待搜索队列
- 对初始节点进行搜索,查看邻居是否为目标节点,
- 并将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》相关推荐
- 广度优先搜索 - 宽度优先搜索 - 横向优先搜索 (breadth-first search,BFS)
广度优先搜索 - 宽度优先搜索 - 横向优先搜索 (breadth-first search,BFS) 1. 广度优先搜索 - 宽度优先搜索 - 横向优先搜索 (breadth-first searc ...
- 生成图-深度优先搜索/宽度优先搜索
问题提出: 考虑如下图所示的简单图所表示的缅因州的道路系统.在冬天里保持道路通路通畅的唯一方式就是经常扫雪.高速公路部分希望只扫尽可能少的道路上的雪,而确保总是存在连接任何两个乡镇的干净道路.如何才能 ...
- 广度优先搜索 宽度优先搜索 迷宫问题 最短路径 最少操作 由近及远 队列
广度优先搜索,也叫宽度优先搜索,从开始状态,到第一次能到达的状态,再从第一次能到达的状态到下一个能到达的状态,直到探索所有可到达的状态,其时间复杂度为O(状态数×转移的方式). 广度优先搜索使用了队列 ...
- 迷宫问题 深度优先搜索 广度优先搜索 宽度优先搜索【python】
文章目录 一.实验内容 二.深度优先搜索和广度优先搜索总结 1.深度优先搜索算法 2.广度优先搜索算法 三.实验代码和用于测试的迷宫 1.实验代码 2.测试迷宫 2.1 maze1.txt 2.2 m ...
- BFS(宽度优先搜索、广度优先搜索)
宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型.Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想.其别名又 ...
- 【算法入门】广度/宽度优先搜索(BFS)
广度/宽度优先搜索(BFS) [算法入门] 郭志伟@SYSU:raphealguo(at)qq.com 2012/04/27 1.前言 广度优先搜索(也称宽度优先搜索,缩写BFS,以下采用广度来描述) ...
- 八数码宽度优先搜索python代码_图之遍历--广度优先遍历
何为广度优先遍历呢? 广度优先遍历(BFS),又叫宽度优先搜索或横向优先搜索,是从根结点开始沿着树的宽度搜索遍历,将离根节点最近的节点先遍历出来,在继续深挖下去. 基本思想是: 1.从图中某个顶点V0 ...
- 算法学习(九)之“宽度优先搜索”
什么是宽度优先搜索? 面试题: 小岛问题 题目: 给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量. 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相 ...
- ACM算法笔记(十)深度优先搜索与宽度优先搜索
深度优先搜索 事实上,深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次. 下面 ...
最新文章
- 元宇宙中可跨语种交流,Meta 发布新语音模型,支持128种语言无障碍对话
- MySql数据库连接超时处理
- 如何保证进程间同步工作_软件测试新玩法,看这5家科技巨头如何组织质量保证工作?...
- php网站白页面_php页面空白怎么回事 php出现空白页的解决方法
- 程序员要如何学英语?
- FFmpeg - 音频解码过程
- 语音识别准确率永远达不到100%?
- Android数据库一些源码分析
- 做一款仿映客的直播App
- 智能优化算法:猎食者优化算法-附代码
- yum快速安装mysql
- AdaBoost--从原理到实现
- 读书笔记-人月神话5
- Rxjava中的Hot Observable 和 Cold Observable
- java爬虫爬取B站弹幕
- 【Android 教程系列第 27 篇】如何使用 Keytool 工具生成 keystore 签名文件
- Git版本控制管理——补丁
- 520最浪漫表白:QQ打开基于Python实现的无法拒绝的音乐表白代码!别让等待,成了遗憾!
- 手术及切口分类与伤口愈合分级以及ASA麻醉分级
- 王佩丰excel2010基础教程学习笔记(第六讲到第十讲)