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 相关文章推荐
在Linux系统上通过uWSGI配置Nginx+Python环境的教程
Dec 25 Python
Python实现网络端口转发和重定向的方法
Sep 19 Python
Python基于递归算法实现的走迷宫问题
Aug 04 Python
python的Crypto模块实现AES加密实例代码
Jan 22 Python
对Python字符串中的换行符和制表符介绍
May 03 Python
python读取文本中的坐标方法
Oct 14 Python
使用python Fabric动态修改远程机器hosts的方法
Oct 26 Python
python pandas库的安装和创建
Jan 10 Python
OpenCV+Python识别车牌和字符分割的实现
Jan 31 Python
Python PyCharm如何进行断点调试
Jul 05 Python
Python Web静态服务器非堵塞模式实现方法示例
Nov 21 Python
68行Python代码实现带难度升级的贪吃蛇
Jan 18 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
星际争霸 Starcraft 编年史
2020/03/14 星际争霸
浅谈PHP5.6 与 PHP7.0 区别
2019/10/09 PHP
javascript事件模型代码
2007/07/01 Javascript
表格单元格交错着色实现思路及代码
2013/04/01 Javascript
Jquery倒计时源码分享
2014/05/16 Javascript
js不能获取隐藏的div的宽度只能先显示后获取
2014/09/04 Javascript
JavaScript跨浏览器获取页面中相同class节点的方法
2015/03/03 Javascript
avalonjs制作响应式瀑布流特效
2015/05/06 Javascript
javascript实现的淘宝旅行通用日历组件用法实例
2015/08/03 Javascript
jQuery.trim() 函数及trim()用法详解
2015/10/26 Javascript
BootStrap Table对前台页面表格的支持实例讲解
2016/12/22 Javascript
bootstarp modal框居中显示的实现代码
2017/02/18 Javascript
nodejs+websocket实时聊天系统改进版
2017/05/18 NodeJs
javascript 跨域问题以及解决办法
2017/07/17 Javascript
vue数据控制视图源码解析
2018/03/28 Javascript
一个基于react的图片裁剪组件示例
2018/04/18 Javascript
Vue 幸运大转盘实现思路详解
2019/05/06 Javascript
详解Python设计模式编程中观察者模式与策略模式的运用
2016/03/02 Python
利用Python破解斗地主残局详解
2017/06/30 Python
Python使用Scrapy保存控制台信息到文本解析
2017/12/27 Python
python消费kafka数据批量插入到es的方法
2018/12/27 Python
对python条件表达式的四种实现方法小结
2019/01/30 Python
python中报错"json.decoder.JSONDecodeError: Expecting value:"的解决
2019/04/29 Python
Python使用itchat模块实现简单的微信控制电脑功能示例
2019/08/26 Python
PyQt中使用QtSql连接MySql数据库的方法
2020/07/28 Python
python爬取天气数据的实例详解
2020/11/20 Python
html5 冒号分隔符对齐的实现
2019/07/31 HTML / CSS
美国知名的网上鞋类及相关服装零售商:Shoes.com
2017/05/06 全球购物
请用Python写一个获取用户输入数字,并根据数字大小输出不同信息的脚本
2014/05/20 面试题
技校教师求职简历的自我评价
2013/10/20 职场文书
学院领导推荐信
2013/10/30 职场文书
最新的咖啡店创业计划书
2013/12/30 职场文书
幼儿园中班教学反思
2014/02/10 职场文书
办公室文员岗位职责范本
2014/06/12 职场文书
2015年社区文体活动总结
2015/03/25 职场文书
2015年医药代表工作总结
2015/04/25 职场文书