Python数据结构与算法之图的广度优先与深度优先搜索算法示例

 更新时间:2017年12月14日 11:56:53   转载 作者:hanahimi  
这篇文章主要介绍了Python数据结构与算法之图的广度优先与深度优先搜索算法,结合实例形式分析了图的广度优先与深度优先搜索算法原理与相关实现技巧,需要的朋友可以参考下

本文实例讲述了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加密解密算法与技巧总结》、《Python编码操作技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程

希望本文所述对大家Python程序设计有所帮助。

相关文章

  • python实现彩票系统

    python实现彩票系统

    这篇文章主要介绍了python实现彩票系统,主要采用面向对象的方法,信息存储方式采用pickle模块来进行存储,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • python使用xlrd模块读取xlsx文件中的ip方法

    python使用xlrd模块读取xlsx文件中的ip方法

    今天小编就为大家分享一篇python使用xlrd模块读取xlsx文件中的ip方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • python开发环境PyScripter中文乱码问题解决方案

    python开发环境PyScripter中文乱码问题解决方案

    PyScripter是一个使用Delphi开发的开源的Python集成开发环境(IDE),PyScripter支持Python2.4、2.5、2.6、2.7、3.0、3.1、3.2,而且可以根据需要切换。
    2016-09-09
  • python在TXT文件中按照某一字符串取出该字符串所在的行方法

    python在TXT文件中按照某一字符串取出该字符串所在的行方法

    今天小编就为大家分享一篇python在TXT文件中按照某一字符串取出该字符串所在的行方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python中is和==的区别详解

    Python中is和==的区别详解

    这篇文章主要介绍了Python中is和==的区别详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • python实现微信跳一跳辅助工具步骤详解

    python实现微信跳一跳辅助工具步骤详解

    这篇文章主要介绍了python实现微信跳一跳辅助工具的步骤详解以及使用说明,需要的朋友可以参考下
    2018-01-01
  • 基于python3生成标签云代码解析

    基于python3生成标签云代码解析

    这篇文章主要介绍了基于python3生成标签云代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 分析python动态规划的递归、非递归实现

    分析python动态规划的递归、非递归实现

    本文小编给大家详细分析了python动态规划的递归、非递归实现过程以及相关代码,有兴趣的朋友可以学习下。
    2018-03-03
  • Python内置模块logging用法实例分析

    Python内置模块logging用法实例分析

    这篇文章主要介绍了Python内置模块logging用法,结合实例形式较为详细的分析了Python基于logging模块的日志配置、输出等常用操作技巧,需要的朋友可以参考下
    2018-02-02
  • Python中字典和集合学习小结

    Python中字典和集合学习小结

    本文通过实例给大家介绍了python中字典和集合的知识小结,非常不错,具有参考借鉴价值,需要的的朋友参考下吧
    2017-07-07

最新评论