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脚本将Bing的每日图片作为桌面的教程
May 04 Python
Python有序查找算法之二分法实例分析
Dec 11 Python
Python简单生成随机数的方法示例
Mar 31 Python
Python浅复制中对象生存周期实例分析
Apr 02 Python
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
Jun 28 Python
python获取交互式ssh shell的方法
Feb 14 Python
wxPython窗体拆分布局基础组件
Nov 19 Python
使用python检查yaml配置文件是否符合要求
Apr 09 Python
Python多线程实现支付模拟请求过程解析
Apr 21 Python
给keras层命名,并提取中间层输出值,保存到文档的实例
May 23 Python
基于pytorch中的Sequential用法说明
Jun 24 Python
Django如何创作一个简单的最小程序
May 12 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
Trying to clone an uncloneable object of class Imagic的解决方法
2012/01/11 PHP
php接口数据加密、解密、验证签名
2015/03/12 PHP
php使用glob函数遍历文件和目录详解
2016/09/23 PHP
PHP后端银联支付及退款实例代码
2017/06/23 PHP
PHP中单例模式的使用场景与使用方法讲解
2019/03/18 PHP
Laravel框架实现的上传图片到七牛功能详解
2019/09/06 PHP
JS获取页面窗口大小的代码解读
2011/12/01 Javascript
jquery 操作iframe的几种方法总结
2013/12/13 Javascript
JQUERY 设置SELECT选中项代码
2014/02/07 Javascript
使用js画图之圆、弧、扇形
2015/01/12 Javascript
JS显示日历和天气的方法
2016/03/01 Javascript
利用JavaScript实现拖拽改变元素大小
2016/12/14 Javascript
基于JS实现移动端左滑删除功能
2017/07/28 Javascript
实现两个文本框同时输入的实例
2017/09/25 Javascript
详细分析vue响应式原理
2020/06/22 Javascript
VUE UPLOAD 通过ACTION返回上传结果操作
2020/09/07 Javascript
解决vue-router 嵌套路由没反应的问题
2020/09/22 Javascript
Python实现两个list对应元素相减操作示例
2017/06/09 Python
pytorch中使用cuda扩展的实现示例
2020/02/12 Python
django form和field具体方法和属性说明
2020/07/09 Python
Python爬虫过程解析之多线程获取小米应用商店数据
2020/11/14 Python
HTML5调用手机发短信和打电话功能
2020/04/29 HTML / CSS
Html5原生拖拽相关事件简介以及基础实现
2020/11/19 HTML / CSS
采购员岗位职责
2013/11/15 职场文书
户外拓展活动方案
2014/02/11 职场文书
创业者迈进成功第一步:如何写创业计划书?
2014/03/22 职场文书
中学生旷课检讨书模板
2014/10/08 职场文书
欢迎词范文
2015/01/27 职场文书
2015年社区居委会工作总结
2015/05/18 职场文书
党支部季度考核意见
2015/06/02 职场文书
《我的长生果》教学反思
2016/02/20 职场文书
年会邀请函的格式及范文五篇
2019/11/02 职场文书
Python 批量下载阴阳师网站壁纸
2021/05/19 Python
这样写python注释让代码更加的优雅
2021/06/02 Python
解析在浏览器地址栏输入一个URL后发生了什么
2021/06/21 Servers
Java 超详细讲解设计模式之中的抽象工厂模式
2022/03/25 Java/Android