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中的anydbm模版和shelve模版使用指南
Jul 09 Python
深入理解Python中的super()方法
Nov 20 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
May 29 Python
python使用Paramiko模块实现远程文件拷贝
Apr 30 Python
Python中使用双下划线防止类属性被覆盖问题
Jun 27 Python
Python函数装饰器原理与用法详解
Aug 16 Python
基于python实现上传文件到OSS代码实例
May 09 Python
基于Python绘制个人足迹地图
Jun 01 Python
查看keras的默认backend实现方式
Jun 19 Python
解决Windows下python和pip命令无法使用的问题
Aug 31 Python
使用gunicorn部署django项目的问题
Dec 30 Python
详解pandas映射与数据转换
Jan 22 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中防止SQL注入实现代码
2011/02/19 PHP
THINKPHP内容分页代码分享
2015/01/14 PHP
PHP4和PHP5版本下解析XML文档的操作方法实例分析
2017/05/20 PHP
基于Jquery 解决Ajax请求的页面 浏览器后退前进功能,页面刷新功能实效问题
2010/12/11 Javascript
JavaScript字符串对象的concat方法实例(用于连接两个或多个字符串)
2014/10/16 Javascript
javascript事件冒泡和事件捕获详解
2015/05/26 Javascript
javascript实现网页子页面遍历回调的方法(涉及 window.frames、递归函数、函数上下文)
2015/07/27 Javascript
Java框架SSH结合Easyui控件实现省市县三级联动示例解析
2016/06/12 Javascript
js判断出两个字符串最大子串的函数实现方法
2016/11/01 Javascript
JS匿名函数实例分析
2016/11/26 Javascript
electron demo项目npm install安装失败的解决方法
2018/02/06 Javascript
NodeJS实现自定义流的方法
2018/08/01 NodeJs
vue首次赋值不触发watch的解决方法
2018/09/11 Javascript
vue项目持久化存储数据的实现代码
2018/10/01 Javascript
小程序获取周围IBeacon设备的方法
2018/10/31 Javascript
发布Angular应用至生产环境的方法
2018/12/10 Javascript
JavaScript对象属性操作实例解析
2020/02/04 Javascript
javascript实现贪吃蛇经典游戏
2020/04/10 Javascript
HTML元素拖拽功能实现的完整实例
2020/12/04 Javascript
[01:05:40]VG vs Newbee 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python字符串对其居中显示的方法
2015/07/11 Python
NumPy 如何生成多维数组的方法
2018/02/05 Python
火车票抢票python代码公开揭秘!
2018/03/08 Python
python实现飞机大战
2018/09/11 Python
Python闭包和装饰器用法实例详解
2019/05/22 Python
Ubuntu18.04安装 PyCharm并使用 Anaconda 管理的Python环境
2020/04/08 Python
锐步美国官方网站:Reebok美国
2018/01/10 全球购物
《乌鸦和狐狸》教学反思
2014/02/08 职场文书
会计岗位描述
2014/02/22 职场文书
活动总结格式
2014/08/30 职场文书
2014年语文教学工作总结
2014/12/17 职场文书
单位工作证明范本
2015/06/15 职场文书
2016党性教育学习心得体会
2016/01/21 职场文书
技术入股协议书
2016/03/22 职场文书
2019关于实习生工作安排及待遇的管理方案!
2019/07/16 职场文书
JS中一些高效的魔法运算符总结
2021/05/06 Javascript