Python数据结构与算法之图的广度优先与深度优先搜索算法示例


Posted in Python onDecember 14, 2017

本文实例讲述了Python数据结构与算法之图的广度优先与深度优先搜索算法。分享给大家供大家参考,具体如下:

根据维基百科的伪代码实现:

广度优先BFS:

使用队列集合

标记初始结点已被发现,放入队列

每次循环从队列弹出一个结点

将该节点的所有相连结点放入队列,并标记已被发现

通过队列,将迷宫路口所有的门打开,从一个门进去继续打开里面的门,然后返回前一个门处

"""
 procedure BFS(G,v) is
   let Q be a queue
   Q.enqueue(v)
   label v as discovered
   while Q is not empty
    v ← Q.dequeue()
    procedure(v)
    for all edges from v to w in G.adjacentEdges(v) do
      if w is not labeled as discovered
        Q.enqueue(w)
        label w as discovered
"""
def procedure(v):
  pass
def BFS(G,v0):
  """ 广度优先搜索 """
  q, s = [], set()
  q.extend(v0)
  s.add(v0)
  while q:  # 当队列q非空
    v = q.pop(0)
    procedure(v)
    for w in G[v]:   # 对图G中顶点v的所有邻近点w
      if w not in s: # 如果顶点 w 没被发现
        q.extend(w)
        s.add(w)  # 记录w已被发现

深度优先DFS

使用 集合

初始结点入栈

每轮循环从栈中弹出一个结点,并标记已被发现

对每个弹出的结点,将其连接的所有结点放到队列中

通过栈的结构,一步步深入挖掘

""""
Pseudocode[edit]
Input: A graph G and a vertex v of G
Output: All vertices reachable from v labeled as discovered
A recursive implementation of DFS:[5]
1 procedure DFS(G,v):
2   label v as discovered
3   for all edges from v to w in G.adjacentEdges(v) do
4     if vertex w is not labeled as discovered then
5       recursively call DFS(G,w)
A non-recursive implementation of DFS:[6]
1 procedure DFS-iterative(G,v):
2   let S be a stack
3   S.push(v)
4   while S is not empty
5      v = S.pop()
6      if v is not labeled as discovered:
7        label v as discovered
8        for all edges from v to w in G.adjacentEdges(v) do
9          S.push(w)
"""
def DFS(G,v0):
  S = []
  S.append(v0)
  label = set()
  while S:
    v = S.pop()
    if v not in label:
      label.add(v)
      procedure(v)
      for w in G[v]:
        S.append(w)

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
pytorch cnn 识别手写的字实现自建图片数据
May 20 Python
Python实现自定义函数的5种常见形式分析
Jun 16 Python
python 使用sys.stdin和fileinput读入标准输入的方法
Oct 17 Python
PyTorch基本数据类型(一)
May 22 Python
python与mysql数据库交互的实现
Jan 06 Python
tensorflow实现测试时读取任意指定的check point的网络参数
Jan 21 Python
python用TensorFlow做图像识别的实现
Apr 21 Python
利用Python如何实时检测自身内存占用
May 09 Python
pyMySQL SQL语句传参问题,单个参数或多个参数说明
Jun 06 Python
pycharm软件实现设置自动保存操作
Jun 08 Python
python 基于卡方值分箱算法的实现示例
Jul 17 Python
Python函数对象与闭包函数
Apr 13 Python
python实现发送邮件功能代码
Dec 14 #Python
python正则实现计算器功能
Dec 14 #Python
Python数据结构与算法之使用队列解决小猫钓鱼问题
Dec 14 #Python
python实现BackPropagation算法
Dec 14 #Python
python实现随机梯度下降(SGD)
Mar 24 #Python
Python实现将一个正整数分解质因数的方法分析
Dec 14 #Python
Python随机生成均匀分布在三角形内或者任意多边形内的点
Dec 14 #Python
You might like
PHP+APACHE实现用户论证的方法
2006/10/09 PHP
php获取网页内容方法总结
2008/12/04 PHP
Smarty Foreach 使用说明
2010/03/23 PHP
PHP编码规范的深入探讨
2013/06/06 PHP
PHP获取Exif缩略图的方法
2015/07/13 PHP
Laravel中如何轻松容易的输出完整的SQL语句
2020/07/26 PHP
[转]JS宝典学习笔记
2007/02/07 Javascript
文档对象模型DOM通俗讲解
2013/11/01 Javascript
javascript中全局对象的isNaN()方法使用介绍
2013/12/19 Javascript
Area 区域实现post提交数据的js写法
2014/04/22 Javascript
jquery实现表格本地排序的方法
2015/03/11 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
2015/11/09 Javascript
JavaScript操作选择对象的简单实例
2016/05/16 Javascript
微信小程序 利用css实现遮罩效果实例详解
2017/01/21 Javascript
详解js静态资源文件请求的处理
2017/08/01 Javascript
js限制输入框只能输入数字(onkeyup触发)
2018/09/28 Javascript
JavaScript工具库MyTools详解
2020/01/01 Javascript
vue.js中使用微信扫一扫解决invalid signature问题(完美解决)
2020/04/11 Javascript
创建与框架无关的JavaScript插件
2020/12/01 Javascript
[49:27]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第一场
2018/04/05 DOTA
python中sets模块的用法实例
2014/09/30 Python
python写入已存在的excel数据实例
2018/05/03 Python
使用 Supervisor 监控 Python3 进程方式
2019/12/05 Python
动态设置django的model field的默认值操作步骤
2020/03/30 Python
python3中确保枚举值代码分析
2020/12/02 Python
CSS3 旋转立方体问题详解
2020/01/09 HTML / CSS
公务员职务工作的自我评价
2013/11/01 职场文书
领导证婚人证婚词
2014/01/13 职场文书
如何撰写一封出色的求职信
2014/04/27 职场文书
基层党组织建设整改方案
2014/09/16 职场文书
2014年保洁员工作总结
2014/11/19 职场文书
财务出纳岗位职责
2015/03/31 职场文书
学校后勤工作总结2015
2015/05/15 职场文书
优秀范文:《但愿人长久》教学反思3篇
2019/10/24 职场文书
Python+uiautomator2实现自动刷抖音视频功能
2021/04/29 Python
Python OpenCV 彩色与灰度图像的转换实现
2021/06/05 Python