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创建和使用字典实例详解
Nov 01 Python
Python中的with语句与上下文管理器学习总结
Jun 28 Python
python获取指定时间差的时间实例详解
Apr 11 Python
python中模块的__all__属性详解
Oct 26 Python
Python数据类型中的“冒号“[::]——分片与步长操作示例
Jan 24 Python
PyQt 实现使窗口中的元素跟随窗口大小的变化而变化
Jun 18 Python
一篇文章了解Python中常见的序列化操作
Jun 20 Python
django admin 自定义替换change页面模板的方法
Aug 23 Python
在Python3 numpy中mean和average的区别详解
Aug 24 Python
Python scipy的二维图像卷积运算与图像模糊处理操作示例
Sep 06 Python
python安装第三方库如xlrd的方法
Oct 31 Python
python基础之错误和异常处理
Oct 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
基于Zend的Captcha机制的应用
2013/05/02 PHP
PHP中的self关键字详解
2019/06/23 PHP
JavaScript入门教程(8) Location地址对象
2009/01/31 Javascript
jquery 操作日期、星期、元素的追加的实现代码
2012/02/07 Javascript
JavaScript实现数据类型的相互转换
2016/03/06 Javascript
基于jQuery实现点击列表加载更多效果
2016/05/31 Javascript
JavaScript 中对象的深拷贝
2016/12/04 Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
2017/03/02 Javascript
JS实现提交表单前的数字及邮箱校检功能
2017/11/13 Javascript
基于Vue的SPA动态修改页面title的方法(推荐)
2018/01/02 Javascript
vue页面加载闪烁问题的解决方法
2018/03/28 Javascript
基于Vue实现关键词实时搜索高亮显示关键词
2018/07/21 Javascript
解决vue中虚拟dom,无法实时更新的问题
2018/09/15 Javascript
微信小程序事件对象中e.target和e.currentTarget的区别详解
2019/05/08 Javascript
LayUi使用switch开关,动态的去控制它是否被启用的方法
2019/09/21 Javascript
vue中英文切换实例代码
2020/01/21 Javascript
[01:46]TI4西雅图DOTA2前线报道 中国选手抱团调时差
2014/07/08 DOTA
[51:36]EG vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
python paramiko实现ssh远程访问的方法
2013/12/03 Python
用于统计项目中代码总行数的Python脚本分享
2015/04/21 Python
Python安装第三方库的3种方法
2015/06/21 Python
详解Python连接MySQL数据库的多种方式
2019/04/16 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
2019/10/14 Python
如何在python中实现随机选择
2019/11/02 Python
Python 实现国产SM3加密算法的示例代码
2020/09/21 Python
html5使用canvas画空心圆与实心圆
2014/12/15 HTML / CSS
Answear匈牙利:来自全球200多个知名时尚品牌
2017/04/21 全球购物
前台文员我鉴定
2014/01/12 职场文书
酒店保安员岗位职责
2014/01/31 职场文书
现金出纳岗位职责
2014/03/15 职场文书
网络编辑岗位职责
2014/03/18 职场文书
三万活动总结
2014/04/28 职场文书
学校安全生产月活动总结
2014/07/05 职场文书
思想作风整顿个人剖析材料
2014/10/06 职场文书
Springboot配置suffix指定mvc视图的后缀方法
2021/07/03 Java/Android
Java代码规范与质量检测插件SonarLint的使用
2022/08/05 Java/Android