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笔记(叁)继续学习
Oct 24 Python
一个检测OpenSSL心脏出血漏洞的Python脚本分享
Apr 10 Python
详解Python编程中包的概念与管理
Oct 16 Python
python 写入csv乱码问题解决方法
Oct 23 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
Jun 12 Python
python和opencv实现抠图
Jul 18 Python
对python中字典keys,values,items的使用详解
Feb 03 Python
Django ImageFiled上传照片并显示的方法
Jul 28 Python
pygame实现烟雨蒙蒙下彩虹雨
Nov 11 Python
Pycharm中切换pytorch的环境和配置的教程详解
Mar 13 Python
Anaconda配置pytorch-gpu虚拟环境的图文教程
Apr 16 Python
Java爬虫技术框架之Heritrix框架详解
Jul 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
一个简单的自动发送邮件系统(二)
2006/10/09 PHP
PHPMailer邮件发送的实现代码
2013/05/04 PHP
推荐十款免费 WordPress 插件
2015/03/24 PHP
laravel创建类似ThinPHP中functions.php的全局函数
2016/11/26 PHP
Laravel 批量更新多条数据的示例
2017/11/27 PHP
JavaScript 在各个浏览器中执行的耐性
2009/04/06 Javascript
基于jquery的button默认enter事件(回车事件)。
2011/05/18 Javascript
js跨浏览器实现将字符串转化为xml对象的方法
2013/09/25 Javascript
捕获和分析JavaScript Error的方法
2014/03/25 Javascript
JavaScript知识点总结(十一)之js中的Object类详解
2016/05/31 Javascript
Angular学习笔记之angular的$filter服务浅析
2016/11/12 Javascript
Vue.js使用v-show和v-if的注意事项
2016/12/13 Javascript
基于jQuery实现顶部导航栏功能
2016/12/27 Javascript
JavaScript函数的特性与应用实践深入详解
2018/12/30 Javascript
jQuery实现的点击图片居中放大缩小功能示例
2019/01/16 jQuery
分享一个vue项目“脚手架”项目的实现步骤
2019/05/26 Javascript
python中enumerate函数遍历元素用法分析
2016/03/11 Python
python使用SMTP发送qq或sina邮件
2017/10/21 Python
python3利用smtplib通过qq邮箱发送邮件方法示例
2017/12/03 Python
python如何发布自已pip项目的方法步骤
2018/10/09 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
2019/03/01 Python
python pillow模块使用方法详解
2019/08/30 Python
np.newaxis 实现为 numpy.ndarray(多维数组)增加一个轴
2019/11/30 Python
python实现TCP文件传输
2020/03/20 Python
协程Python 中实现多任务耗资源最小的方式
2020/10/19 Python
求两个数的乘积和商数,该作用由宏定义来实现
2013/03/13 面试题
iostream与iostream.h的区别
2015/01/16 面试题
学年自我鉴定范文
2013/10/01 职场文书
团组织关系介绍信
2014/01/12 职场文书
主要领导对照检查材料
2014/08/26 职场文书
卖车协议书范例
2014/09/16 职场文书
组织委员竞选稿
2015/11/21 职场文书
2019年汽车租赁合同范本!
2019/08/12 职场文书
深入理解python多线程编程
2021/04/18 Python
浅谈什么是SpringBoot异常处理自动配置的原理
2021/06/21 Java/Android
浅谈Python实现opencv之图片色素的数值运算和逻辑运算
2021/06/23 Python