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 解析html之BeautifulSoup
Jul 07 Python
使用python实现扫描端口示例
Mar 29 Python
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
Apr 25 Python
Python实现统计英文单词个数及字符串分割代码
May 28 Python
Python发送邮件测试报告操作实例详解
Dec 08 Python
Python调用服务接口的实例
Jan 03 Python
python判断文件夹内是否存在指定后缀文件的实例
Jun 10 Python
Python imageio读取视频并进行编解码详解
Dec 10 Python
谈谈Python:为什么类中的私有属性可以在外部赋值并访问
Mar 05 Python
解决Python Matplotlib绘图数据点位置错乱问题
May 16 Python
Python3如何使用range函数替代xrange函数
Oct 05 Python
教你利用python实现企业微信发送消息
May 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 Class&Object -- PHP 自排序二叉树的深入解析
2013/06/25 PHP
php验证码生成代码
2015/11/11 PHP
PHP实现批量删除(封装)
2017/04/28 PHP
PHP反射实际应用示例
2019/04/03 PHP
JavaScript 核心参考教程 内置对象
2009/10/13 Javascript
jquery遍历select元素(实例讲解)
2013/12/31 Javascript
基于React.js实现原生js拖拽效果引发的思考
2016/03/30 Javascript
js判断空对象的实例(超简单)
2016/07/26 Javascript
EasyUI创建对话框的两种方式
2016/08/23 Javascript
js自制图片放大镜功能
2017/01/24 Javascript
AngularJS自定义指令之复制指令实现方法
2017/05/18 Javascript
React Native中的RefreshContorl下拉刷新使用
2017/10/09 Javascript
vue组件name的作用小结
2018/05/23 Javascript
原生JS+HTML5实现的可调节写字板功能示例
2018/08/30 Javascript
详解nodejs 开发企业微信第三方应用入门教程
2019/03/12 NodeJs
微信小程序学习笔记之文件上传、下载操作图文详解
2019/03/29 Javascript
js抽奖转盘实现方法分析
2020/05/16 Javascript
python实现在pandas.DataFrame添加一行
2018/04/04 Python
在ubuntu16.04中将python3设置为默认的命令写法
2018/10/31 Python
使用Python计算玩彩票赢钱概率
2019/06/26 Python
wxPython实现画图板
2020/08/27 Python
Python无损压缩图片的示例代码
2020/08/06 Python
python利用后缀表达式实现计算器功能
2021/02/22 Python
python 如何用urllib与服务端交互(发送和接收数据)
2021/03/04 Python
家长给老师的道歉信
2014/01/13 职场文书
英文留学推荐信范文
2014/01/25 职场文书
学生会竞选演讲稿
2014/04/24 职场文书
应届毕业生求职信范文
2014/05/08 职场文书
2015年大学元旦晚会活动策划书
2014/12/09 职场文书
幼儿园学前班幼儿评语
2014/12/29 职场文书
工程质检员岗位职责
2015/04/08 职场文书
2016秋季田径运动会广播稿
2015/12/21 职场文书
2016年教师党员创先争优承诺书
2016/03/24 职场文书
Go语言实现Snowflake雪花算法
2021/06/08 Golang
Java反应式框架Reactor中的Mono和Flux
2021/07/25 Java/Android
奥特曼十大神器:奥特手镯在榜,第一是贝利亚的神器
2022/03/18 日漫