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中编写ORM框架的入门指引
Apr 29 Python
详解Python中类的定义与使用
Apr 11 Python
Python语言描述KNN算法与Kd树
Dec 13 Python
Python面向对象编程之继承与多态详解
Jan 16 Python
python Web开发你要理解的WSGI & uwsgi详解
Aug 01 Python
python得到一个excel的全部sheet标签值方法
Dec 10 Python
python实现按行分割文件
Jul 22 Python
Python+Redis实现布隆过滤器
Dec 08 Python
python GUI库图形界面开发之PyQt5动态加载QSS样式文件
Feb 25 Python
python正则表达式实例代码
Mar 03 Python
Python爬虫基础讲解之请求
May 13 Python
pytorch 如何使用amp进行混合精度训练
May 24 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
linux下为php添加curl扩展的方法
2011/07/29 PHP
Thinkphp将二维数组变为标签适用的一维数组方法总结
2014/10/30 PHP
jQuery 剧场版 你必须知道的javascript
2009/05/27 Javascript
Ext.get() 和 Ext.query()组合使用实现最灵活的取元素方式
2011/09/26 Javascript
JS获取DropDownList的value值与text值的示例代码
2014/01/07 Javascript
jQuery中Form相关知识汇总
2015/01/06 Javascript
NodeJS Web应用监听sock文件实例
2015/02/18 NodeJs
jQuery选择器源码解读(三):tokenize方法
2015/03/31 Javascript
JS iFrame加载慢怎么解决
2016/05/13 Javascript
js实现浏览器倒计时跳转页面效果
2016/08/12 Javascript
iOS和Android用同一个二维码实现跳转下载链接的方法
2016/09/28 Javascript
jquery实现手机端单店铺购物车结算删除功能
2017/02/22 Javascript
JavaScript验证知识整理
2017/03/24 Javascript
解决vue中使用swiper插件问题及swiper在vue中的用法
2018/04/04 Javascript
jQuery 操作 HTML 元素和属性的方法
2018/11/12 jQuery
Vue CLI2升级至Vue CLI3的方法步骤
2019/05/20 Javascript
[50:15]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
[51:43]OG vs LGD 2018国际邀请赛淘汰赛BO3 第五场 8.26
2018/08/30 DOTA
巧用Python装饰器 免去调用父类构造函数的麻烦
2012/05/18 Python
python爬取各类文档方法归类汇总
2018/03/22 Python
Python3中的json模块使用详解
2018/05/05 Python
pycharm 实现显示project 选项卡的方法
2019/01/17 Python
在python plt图表中文字大小调节的方法
2019/07/08 Python
linux环境下Django的安装配置详解
2019/07/22 Python
python 动态迁移solr数据过程解析
2019/09/04 Python
使用Pytorch来拟合函数方式
2020/01/14 Python
Softmax函数原理及Python实现过程解析
2020/05/22 Python
通过Python扫描代码关键字并进行预警的实现方法
2020/05/24 Python
Python urllib2运行过程原理解析
2020/06/04 Python
绝对经典成功的大学生推荐信
2013/11/08 职场文书
环保公益广告语
2014/03/13 职场文书
2015年征兵工作总结
2015/07/23 职场文书
2015年幼儿园师德师风建设工作总结
2015/10/23 职场文书
送给自己的励志语句:要安静的优秀,悄无声息的坚强
2019/11/26 职场文书
PyQt5实现多张图片显示并滚动
2021/06/11 Python
python scrapy简单模拟登录的代码分析
2021/07/21 Python