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解决简单的zip文件解压密码

    手把手教你使用Python解决简单的zip文件解压密码

    本文主要介绍了Python解决简单的zip文件解压密码,使用的核心模块是python标准库中的zipfile模块。具有一定的参考价值,感兴趣的可以了解一下
    2021-11-11
  • Python 中面向接口编程详情

    Python 中面向接口编程详情

    这篇文章主要介绍了Python 中面向接口编程详情,Python 中的接口与大多数其它语言的处理方式不同,它们的设计复杂性也不同,关于Python 接口编程的介绍,需要的小伙伴可以参考下面文章内容
    2022-05-05
  • Python实现的插入排序,冒泡排序,快速排序,选择排序算法示例

    Python实现的插入排序,冒泡排序,快速排序,选择排序算法示例

    这篇文章主要介绍了Python实现的插入排序,冒泡排序,快速排序,选择排序算法,结合实例形式总结分析了Python插入排序,冒泡排序,快速排序,选择排序等算法的实现与使用技巧,需要的朋友可以参考下
    2019-05-05
  • QML用PathView实现轮播图

    QML用PathView实现轮播图

    这篇文章主要为大家详细介绍了QML用PathView实现轮播图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • Python代码打开本地.mp4格式文件的方法

    Python代码打开本地.mp4格式文件的方法

    今天小编就为大家分享一篇Python代码打开本地.mp4格式文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • python时间time模块处理大全

    python时间time模块处理大全

    这篇文章主要给大家介绍了关于python时间time模块处理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • VSCode安装Django插件后实现html语法提示的方法步骤

    VSCode安装Django插件后实现html语法提示的方法步骤

    Vscode是微软推出的一款优秀的ide开发工具,界面简洁美观、默认支持中文,拥有丰富的插件,支持Windows,OS X和Linux,下面这篇文章主要给大家介绍了关于VSCode安装Django插件后实现html语法提示的方法步骤,需要的朋友可以参考下
    2022-08-08
  • 基于Python开发PDF转PNG的可视化工具

    基于Python开发PDF转PNG的可视化工具

    在数字文档处理领域,PDF到图像格式的转换是常见需求,本文介绍如何利用Python的PyMuPDF库和Tkinter框架开发一个带图形界面的PDF转PNG工具,需要的可以参考下
    2025-03-03
  • 使用Python设置,更新和获取Excel单元格的值

    使用Python设置,更新和获取Excel单元格的值

    Excel工作簿作为一款广泛使用的数据管理工具,与Python相结合,可以使得自动化处理大量数据成为可能,本文将演示如何使用Python设置、更新以及获取Excel文件中单元格的值,希望对大家有所帮助
    2024-10-10
  • python如何在循环引用中管理内存

    python如何在循环引用中管理内存

    这篇文章主要为大家详细介绍了python如何在循环引用中管理内存,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03

最新评论