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 相关文章推荐
Python中的深拷贝和浅拷贝详解
Jun 03 Python
浅谈python函数之作用域(python3.5)
Oct 27 Python
python 实现将txt文件多行合并为一行并将中间的空格去掉方法
Dec 20 Python
Python从文件中读取数据的方法讲解
Feb 14 Python
Python常见数据类型转换操作示例
May 08 Python
用Python抢火车票的简单小程序实现解析
Aug 14 Python
Django实现auth模块下的登录注册与注销功能
Oct 10 Python
python将字符串转变成dict格式的实现
Nov 18 Python
python实现名片管理器的示例代码
Dec 17 Python
python多项式拟合之np.polyfit 和 np.polyld详解
Feb 18 Python
Django配置Bootstrap, js实现过程详解
Oct 13 Python
python通配符之glob模块的使用详解
Apr 24 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
搜索引擎技术核心揭密
2006/10/09 PHP
解析func_num_args与func_get_args函数的使用
2013/06/24 PHP
php cookie使用方法学习笔记分享
2013/11/07 PHP
PHP实现简单的计算器
2020/08/28 PHP
IE8 引入跨站数据获取功能说明
2008/07/22 Javascript
js实现Select列表内容自动滚动效果代码
2015/08/20 Javascript
Nodejs的express使用教程
2015/11/23 NodeJs
jquery树形菜单效果的简单实例
2016/06/06 Javascript
基于AngularJS前端云组件最佳实践
2016/10/20 Javascript
Vue.Js中的$watch()方法总结
2017/03/23 Javascript
微信小程序网络封装(简单高效)
2018/08/06 Javascript
微信小程序获取当前位置和城市名
2019/11/13 Javascript
[02:12]2019完美世界全国高校联赛(春季赛)报名开启
2019/03/01 DOTA
Python程序语言快速上手教程
2012/07/18 Python
在Mac OS上搭建Python的开发环境
2015/12/24 Python
Python创建xml文件示例
2017/03/22 Python
Python基于更相减损术实现求解最大公约数的方法
2018/04/04 Python
python3实现字符串的全排列的方法(无重复字符)
2018/07/07 Python
浅谈python3.x pool.map()方法的实质
2019/01/16 Python
Python类的继承用法示例
2019/01/31 Python
django query模块
2019/04/20 Python
对python 中re.sub,replace(),strip()的区别详解
2019/07/22 Python
使用PyTorch实现MNIST手写体识别代码
2020/01/18 Python
Django模型中字段属性choice使用说明
2020/03/30 Python
python接口自动化之ConfigParser配置文件的使用详解
2020/08/03 Python
Pycharm创建python文件自动添加日期作者等信息(步骤详解)
2021/02/03 Python
英国助听器购物网站:Hearing Direct
2018/08/21 全球购物
耐克波兰官方网站:Nike波兰
2019/09/03 全球购物
购买正版游戏和游戏激活码:Green Man Gaming
2019/11/06 全球购物
《记金华的双龙洞》教学反思
2014/04/19 职场文书
七一建党节演讲稿
2014/09/11 职场文书
党的群众路线教育实践活动个人整改方案
2014/09/21 职场文书
2014年班主任德育工作总结
2014/12/05 职场文书
幼儿园教师求职信
2015/03/20 职场文书
小学运动会开幕词
2016/03/04 职场文书
golang switch语句的灵活写法介绍
2021/05/06 Golang