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 相关文章推荐
wxPython学习之主框架实例
Sep 28 Python
python数据结构之图深度优先和广度优先实例详解
Jul 08 Python
Python中交换两个元素的实现方法
Jun 29 Python
Python3的介绍、安装和命令行的认识(推荐)
Oct 20 Python
解决pyinstaller打包pyqt5的问题
Jan 08 Python
Python实现的ftp服务器功能详解【附源码下载】
Jun 26 Python
详细介绍Python进度条tqdm的使用
Jul 31 Python
Python实现语音识别和语音合成功能
Sep 20 Python
详解python itertools功能
Feb 07 Python
python IDLE添加行号显示教程
Apr 25 Python
Python字节单位转换(将字节转换为K M G T)
Mar 02 Python
Python集合set()使用的方法详解
Mar 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
PHP从数组中删除元素的四种方法实例
2017/05/12 PHP
PHP函数积累总结
2019/03/19 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
2020/04/23 PHP
jquery插件jquery倒计时插件分享
2013/12/27 Javascript
推荐8款jQuery轻量级树形Tree插件
2014/11/12 Javascript
js实现Select列表各项上移和下移的方法
2015/08/14 Javascript
jQuery拖动元素并对元素进行重新排序
2015/12/30 Javascript
解决js函数闭包内存泄露问题的办法
2016/01/25 Javascript
提高Web性能的前端优化技巧总结
2017/02/27 Javascript
使用vue构建移动应用实战代码
2017/08/02 Javascript
vue完成项目后,打包成静态文件的方法
2018/09/03 Javascript
对angularJs中2种自定义服务的实例讲解
2018/09/30 Javascript
使用微信小程序开发弹出框应用实例详解
2018/10/18 Javascript
vue 路由守卫(导航守卫)及其具体使用
2020/02/25 Javascript
nodejs脚本centos开机启动实操方法
2020/03/04 NodeJs
[16:21]教你分分钟做大人:圣堂刺客
2014/12/03 DOTA
[50:45]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第一场
2018/04/10 DOTA
[04:45]DOTA2-DPC中国联赛正赛 iG vs LBZS 赛后选手采访
2021/03/11 DOTA
Python算法之图的遍历
2017/11/16 Python
pandas or sql计算前后两行数据间的增值方法
2018/04/20 Python
python中selenium操作下拉滚动条的几种方法汇总
2019/07/14 Python
python实现通过队列完成进程间的多任务功能示例
2019/10/28 Python
你应该知道的Python3.6、3.7、3.8新特性小结
2020/05/12 Python
python3环境搭建过程(利用Anaconda+pycharm)完整版
2020/08/19 Python
python使用隐式循环快速求和的实现示例
2020/09/11 Python
解决pycharm修改代码后第一次运行不生效的问题
2021/02/06 Python
html5实现输入框fixed定位在屏幕最底部兼容性
2020/07/03 HTML / CSS
DJI美国:消费类无人机领域的领导者
2018/04/27 全球购物
会话Bean的种类
2013/11/07 面试题
益模软件Java笔试题
2012/03/27 面试题
中专生职业生涯规划书范文
2013/12/29 职场文书
小学毕业演讲稿
2014/04/25 职场文书
实习单位评语
2014/04/26 职场文书
2015年公司中秋节致辞
2015/07/31 职场文书
数学复习课教学反思
2016/02/18 职场文书
高质量“欢迎词”
2019/04/03 职场文书