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中类的继承代码实例
Oct 28 Python
Python文件处理
Feb 29 Python
实例探究Python以并发方式编写高性能端口扫描器的方法
Jun 14 Python
深度定制Python的Flask框架开发环境的一些技巧总结
Jul 12 Python
Python实现对字符串的加密解密方法示例
Apr 29 Python
Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例
Mar 15 Python
python实现停车管理系统
Nov 30 Python
Python 加密与解密小结
Dec 06 Python
Python中的 enum 模块源码详析
Jan 09 Python
python中列表的切片与修改知识点总结
Jul 23 Python
Python 脚本实现淘宝准点秒杀功能
Nov 13 Python
详解用selenium来下载小姐姐图片并保存
Jan 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 数字左侧自动补0
2008/03/31 PHP
PHP 编写大型网站问题集
2010/05/07 PHP
关于ob_get_contents(),ob_end_clean(),ob_start(),的具体用法详解
2013/06/24 PHP
Linux系统下php获得系统分区信息的方法
2015/03/30 PHP
PHP实现QQ登录的开原理和实现过程
2018/02/04 PHP
js刷新框架子页面的七种方法代码
2008/11/20 Javascript
jquery.validate分组验证代码
2011/03/17 Javascript
基于JQuery实现滚动到页面底端时自动加载更多信息
2014/01/31 Javascript
javascript根据时间生成m位随机数最大13位
2014/10/30 Javascript
Boostrap入门准备之border box
2016/05/09 Javascript
JQuery点击事件回到页面顶部效果的实现代码
2016/05/24 Javascript
轻松掌握JavaScript享元模式
2016/08/27 Javascript
js中字符型和数值型数字的互相转化方法(必看)
2017/04/25 Javascript
vue-devtools的安装步骤
2018/04/23 Javascript
js 图片转base64的方式(两种)
2018/04/24 Javascript
Angular5中状态管理的实现
2018/09/03 Javascript
JS中数据结构之栈
2019/01/01 Javascript
Layui多选只有最后一个值的解决方法
2019/09/02 Javascript
vue语法自动转typescript(解放双手)
2019/09/18 Javascript
js实现淘宝首页的banner栏效果
2019/11/26 Javascript
[00:34]拔城逐梦,热血永恒!2020(秋)完美世界城市挑战赛报名开启
2020/10/09 DOTA
决策树的python实现方法
2014/11/18 Python
Django自定义用户认证示例详解
2018/03/14 Python
python生成器与迭代器详解
2019/01/01 Python
树莓派+摄像头实现对移动物体的检测
2019/06/22 Python
Python使用sklearn实现的各种回归算法示例
2019/07/04 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
2020/05/11 Python
django创建超级用户时指定添加其它字段方式
2020/05/14 Python
Pandas读取csv时如何设置列名
2020/06/02 Python
python3.7中安装paddleocr及paddlepaddle包的多种方法
2020/11/27 Python
Linux文件系统类型
2012/09/16 面试题
民事诉讼代理委托书
2014/10/08 职场文书
争先创优个人总结
2015/03/04 职场文书
服务员岗位职责范本
2015/04/09 职场文书
Python3中最常用的5种线程锁实例总结
2021/07/07 Python
Mysql分库分表之后主键处理的几种方法
2022/02/15 MySQL