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之用while来循环
Oct 02 Python
Python中DJANGO简单测试实例
May 11 Python
详解在Python程序中解析并修改XML内容的方法
Nov 16 Python
用python制作游戏外挂
Jan 04 Python
python读取LMDB中图像的方法
Jul 02 Python
python 实现分页显示从es中获取的数据方法
Dec 26 Python
Flask框架学习笔记之使用Flask实现表单开发详解
Aug 12 Python
PyTorch: 梯度下降及反向传播的实例详解
Aug 20 Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
Feb 26 Python
Python实现子类调用父类的初始化实例
Mar 12 Python
详解Python中Pyyaml模块的使用
Oct 08 Python
python百行代码实现汉服圈图片爬取
Nov 23 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 项目的方法
2007/01/02 PHP
php中$_POST与php://input的区别实例分析
2015/01/07 PHP
PHP实现懒加载的方法
2015/03/07 PHP
smarty模板引擎基础知识入门
2015/03/30 PHP
PHP的Laravel框架中使用消息队列queue及异步队列的方法
2016/03/21 PHP
php实现的二分查找算法示例
2017/06/20 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
PHP获取数据库表中的数据插入新的表再原删除数据方法
2018/10/12 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
2018/10/18 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
如果文字过长,则将过长的部分变成省略号显示
2006/06/26 Javascript
js函数使用技巧之 setTimeout(function(){},0)
2009/02/09 Javascript
in.js 一个轻量级的JavaScript颗粒化模块加载和依赖关系管理解决方案
2011/07/26 Javascript
jQuery获取节点和子节点文本的方法
2014/07/22 Javascript
jquery实现鼠标滑过小图查看大图的方法
2015/07/20 Javascript
SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
2015/12/10 Javascript
微信小程序开发animation心跳动画效果
2017/08/16 Javascript
使用vux实现上拉刷新功能遇到的坑
2018/02/08 Javascript
VUEJS 2.0 子组件访问/调用父组件的实例
2018/02/10 Javascript
微信小程序吸底区域适配iPhoneX的实现
2020/04/09 Javascript
Python使用scrapy采集时伪装成HTTP/1.1的方法
2015/04/08 Python
Python简单生成8位随机密码的方法
2017/05/24 Python
Python使用re模块实现信息筛选的方法
2018/04/29 Python
Python实现针对json中某个关键字段进行排序操作示例
2018/12/25 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
2019/01/22 Python
Python中文件的写入读取以及附加文字方法
2019/01/23 Python
pip install 使用国内镜像的方法示例
2020/04/03 Python
通过代码实例了解Python异常本质
2020/09/16 Python
物流经理自我评价
2013/09/23 职场文书
实习自我鉴定模板
2013/09/28 职场文书
美术毕业生求职信
2014/02/25 职场文书
歌颂党的演讲稿
2014/09/10 职场文书
《水浒传》读后感3篇(范文)
2019/09/19 职场文书
将图片保存到mysql数据库并展示在前端页面的实现代码
2021/05/02 MySQL
警用民用对讲机找不同
2022/02/18 无线电
pandas中pd.groupby()的用法详解
2022/06/16 Python