python数据结构之图深度优先和广度优先实例详解


Posted in Python onJuly 08, 2015

本文实例讲述了python数据结构之图深度优先和广度优先用法。分享给大家供大家参考。具体如下:

首先有一个概念:回溯

回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

深度优先算法:

(1)访问初始顶点v并标记顶点v已访问。
(2)查找顶点v的第一个邻接顶点w。
(3)若顶点v的邻接顶点w存在,则继续执行;否则回溯到v,再找v的另外一个未访问过的邻接点。
(4)若顶点w尚未被访问,则访问顶点w并标记顶点w为已访问。
(5)继续查找顶点w的下一个邻接顶点wi,如果v取值wi转到步骤(3)。直到连通图中所有顶点全部访问过为止。

广度优先算法:

(1)顶点v入队列。
(2)当队列非空时则继续执行,否则算法结束。
(3)出队列取得队头顶点v;访问顶点v并标记顶点v已被访问。
(4)查找顶点v的第一个邻接顶点col。
(5)若v的邻接顶点col未被访问过的,则col入队列。
(6)继续查找顶点v的另一个新的邻接顶点col,转到步骤(5)。直到顶点v的所有未被访问过的邻接点处理完。转到步骤(2)。

代码:

#!/usr/bin/python
# -*- coding: utf-8 -*-
class Graph(object):
  def __init__(self,*args,**kwargs):
    self.node_neighbors = {}
    self.visited = {}
  def add_nodes(self,nodelist):
    for node in nodelist:
      self.add_node(node)
  def add_node(self,node):
    if not node in self.nodes():
      self.node_neighbors[node] = []
  def add_edge(self,edge):
    u,v = edge
    if(v not in self.node_neighbors[u]) and ( u not in self.node_neighbors[v]):
      self.node_neighbors[u].append(v)
      if(u!=v):
        self.node_neighbors[v].append(u)
  def nodes(self):
    return self.node_neighbors.keys()
  def depth_first_search(self,root=None):
    order = []
    def dfs(node):
      self.visited[node] = True
      order.append(node)
      for n in self.node_neighbors[node]:
        if not n in self.visited:
          dfs(n)
    if root:
      dfs(root)
    for node in self.nodes():
      if not node in self.visited:
        dfs(node)
    print order
    return order
  def breadth_first_search(self,root=None):
    queue = []
    order = []
    def bfs():
      while len(queue)> 0:
        node = queue.pop(0)
        self.visited[node] = True
        for n in self.node_neighbors[node]:
          if (not n in self.visited) and (not n in queue):
            queue.append(n)
            order.append(n)
    if root:
      queue.append(root)
      order.append(root)
      bfs()
    for node in self.nodes():
      if not node in self.visited:
        queue.append(node)
        order.append(node)
        bfs()
    print order
    return order
if __name__ == '__main__':
  g = Graph()
g.add_nodes([i+1 for i in range(8)])
g.add_edge((1, 2))
g.add_edge((1, 3))
g.add_edge((2, 4))
g.add_edge((2, 5))
g.add_edge((4, 8))
g.add_edge((5, 8))
g.add_edge((3, 6))
g.add_edge((3, 7))
g.add_edge((6, 7))
print "nodes:", g.nodes()
order = g.breadth_first_search(1)
order = g.depth_first_search(1)

结果:

nodes: [1, 2, 3, 4, 5, 6, 7, 8]

广度优先:
[1, 2, 3, 4, 5, 6, 7, 8]

深度优先:

[1, 2, 4, 8, 5, 3, 6, 7]

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

Python 相关文章推荐
Python使用random和tertools模块解一些经典概率问题
Jan 28 Python
用Python实现一个简单的能够发送带附件的邮件程序的教程
Apr 08 Python
仅用50行代码实现一个Python编写的计算器的教程
Apr 17 Python
关于Python 3中print函数的换行详解
Aug 08 Python
python实现二叉查找树实例代码
Feb 08 Python
将python文件打包成EXE应用程序的方法
May 22 Python
安装完Python包然后找不到模块的解决步骤
Feb 13 Python
python实现word文档批量转成自定义格式的excel文档的思路及实例代码
Feb 21 Python
在Python IDLE 下调用anaconda中的库教程
Mar 09 Python
Python3自定义json逐层解析器代码
May 11 Python
Java多线程实现四种方式原理详解
Jun 02 Python
python输出国际象棋棋盘的实例分享
Nov 26 Python
python中偏函数partial用法实例分析
Jul 08 #Python
Python使用bs4获取58同城城市分类的方法
Jul 08 #Python
Python实现批量修改文件名实例
Jul 08 #Python
Python查询阿里巴巴关键字排名的方法
Jul 08 #Python
浅谈Python中的闭包
Jul 08 #Python
Python中atexit模块的基本使用示例
Jul 08 #Python
python登录豆瓣并发帖的方法
Jul 08 #Python
You might like
PHP has encountered an Access Violation
2007/01/15 PHP
解析:通过php socket并借助telnet实现简单的聊天程序
2013/06/18 PHP
PHP让网站移动访问更加友好方法
2019/02/14 PHP
php变量与字符串的增删改查操作示例
2020/05/07 PHP
完美解决JS中汉字显示乱码问题(已解决)
2006/12/27 Javascript
9个javascript语法高亮插件 推荐
2009/07/18 Javascript
25个好玩的JavaScript小游戏分享
2011/04/22 Javascript
js模拟点击事件实现代码
2012/11/06 Javascript
js过滤特殊字符输入适合输入、粘贴、拖拽多种情况
2014/03/22 Javascript
node.js中的fs.realpathSync方法使用说明
2014/12/16 Javascript
Node.js中的缓冲与流模块详细介绍
2015/02/11 Javascript
JQuery记住用户名密码实现下次自动登录功能
2015/04/27 Javascript
js中动态创建json,动态为json添加属性、属性值的实例
2016/12/02 Javascript
Vue form 表单提交+ajax异步请求+分页效果
2017/04/22 Javascript
基于twbsPagination.js分页插件使用心得(分享)
2017/10/21 Javascript
vue 自定义组件 v-model双向绑定、 父子组件同步通信的多种写法
2017/11/27 Javascript
vue 中 beforeRouteEnter 死循环的问题
2019/04/23 Javascript
微信小程序一周时间表功能实现
2019/10/17 Javascript
Vue 嵌套路由使用总结(推荐)
2020/01/13 Javascript
js中调用微信的扫描二维码功能的实现代码
2020/04/11 Javascript
python3使用urllib示例取googletranslate(谷歌翻译)
2014/01/23 Python
Python实现购物车购物小程序
2018/04/18 Python
Python操作注册表详细步骤介绍
2020/02/05 Python
Django使用Celery加redis执行异步任务的实例内容
2020/02/20 Python
python 实现分组求和与分组累加求和代码
2020/05/18 Python
在python3.64中安装pyinstaller库的方法步骤
2020/06/02 Python
俄罗斯在线手表和珠宝商店:AllTime
2019/09/28 全球购物
函授教育个人学习的自我评价
2013/12/31 职场文书
教师绩效考核方案
2014/01/21 职场文书
圣诞节红领巾广播稿
2014/02/03 职场文书
《最大的麦穗》教学反思
2014/04/17 职场文书
战略合作协议书范本
2014/04/18 职场文书
党支部培养考察意见
2015/06/02 职场文书
如何写一份具有法律效力的借款协议书?
2019/07/02 职场文书
HTML5来实现本地文件读取和写入的实现方法
2021/05/25 HTML / CSS
MyBatis-Plus 批量插入数据的操作方法
2021/09/25 Java/Android