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生成随机数的方法
Jan 14 Python
python实现根据窗口标题调用窗口的方法
Mar 13 Python
Python使用Flask框架获取当前查询参数的方法
Mar 21 Python
python实现统计代码行数的方法
May 22 Python
python实现的文件同步服务器实例
Jun 02 Python
Python读取和处理文件后缀为.sqlite的数据文件(实例讲解)
Jun 27 Python
浅谈python中copy和deepcopy中的区别
Oct 23 Python
动态规划之矩阵连乘问题Python实现方法
Nov 27 Python
浅谈关于Python3中venv虚拟环境
Aug 01 Python
python3 sorted 如何实现自定义排序标准
Mar 12 Python
Python HTMLTestRunner可视化报告实现过程解析
Apr 10 Python
Python中Numpy和Matplotlib的基本使用指南
Nov 02 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数组相加 array(“a”)+array(“b”)结果还是array(“a”)
2012/09/19 PHP
浅谈PHP中foreach/in_array的使用
2015/11/02 PHP
PHP查询附近的人及其距离的实现方法
2016/05/11 PHP
PHP生成zip压缩包的常用方法示例
2019/08/22 PHP
javascript 兼容鼠标滚轮事件
2009/04/07 Javascript
使用JS+plupload直接批量上传图片到又拍云
2014/12/01 Javascript
express的中间件basicAuth详解
2014/12/04 Javascript
Javascript基于AJAX回调函数传递参数实例分析
2015/12/15 Javascript
详解JS-- 浮点数运算处理
2016/11/28 Javascript
利用jquery禁止外层滚动条的滚动
2017/01/05 Javascript
Angularjs单选改为多选的开发过程及问题解析
2017/02/17 Javascript
AngularJS实现表格的增删改查(仅限前端)
2017/07/04 Javascript
ES6中javascript实现函数绑定及类的事件绑定功能详解
2017/11/08 Javascript
js 取消页面可以选中文字的功能方法
2018/01/02 Javascript
three.js 入门案例详解
2018/01/23 Javascript
Makefile/cmake/node-gyp中区分判断不同平台的方法
2018/12/18 Javascript
微信小程序实现二维码签到考勤系统
2020/01/16 Javascript
浅谈JavaScript窗体Window.ShowModalDialog使用
2020/07/22 Javascript
[04:03]DOTA2肉山黑名单梦之声 风暴之灵中文配音鉴赏
2013/07/03 DOTA
[01:34]2016国际邀请赛中国区预选赛IG战队教练采访
2016/06/27 DOTA
Python 可爱的大小写
2008/09/06 Python
Python运行的17个时新手常见错误小结
2012/08/07 Python
Python素数检测的方法
2015/05/11 Python
node.js获取参数的常用方法(总结)
2017/05/29 Python
python利用高阶函数实现剪枝函数
2018/03/20 Python
python实现打砖块游戏
2020/02/25 Python
python3注册全局热键的实现
2020/03/22 Python
HTML5实现移动端弹幕动画效果
2019/08/01 HTML / CSS
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
职业生涯规划书基本格式
2014/01/06 职场文书
采购部部长岗位职责
2014/02/06 职场文书
岗位安全生产责任书
2014/07/28 职场文书
2014年秋季开学寄语
2014/08/02 职场文书
小学竞选班干部演讲稿
2014/08/20 职场文书
Python 流媒体播放器的实现(基于VLC)
2021/04/28 Python
苹果macOS 13开发者预览版Beta 8发布 正式版10月发布
2022/09/23 数码科技