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中logging模块的用法实例
Sep 29 Python
Python多线程下载文件的方法
Jul 10 Python
浅析Python中的赋值和深浅拷贝
Aug 15 Python
python+numpy+matplotalib实现梯度下降法
Aug 31 Python
python队列Queue的详解
May 10 Python
详解python pandas 分组统计的方法
Jul 30 Python
python3.6编写的单元测试示例
Aug 17 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
Dec 02 Python
Python configparser模块配置文件过程解析
Mar 03 Python
python3让print输出不换行的方法
Aug 24 Python
总结Python变量的相关知识
Jun 28 Python
你需要掌握的20个Python常用技巧
Feb 28 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与paypal整合方法
2010/11/28 PHP
PHP中使用memcache存储session的三种配置方法
2014/04/05 PHP
php使用pclzip类实现文件压缩的方法(附pclzip类下载地址)
2016/04/30 PHP
php使用socket调用http和smtp协议实例小结
2019/07/26 PHP
关于Laravel-admin的基础用法总结和自定义model详解
2019/10/08 PHP
jQuery入门知识简介
2010/03/04 Javascript
三级下拉菜单的js实现代码
2011/05/23 Javascript
imgAreaSelect 中文文档帮助说明
2011/10/08 Javascript
jquery 操作两个select实现值之间的互相传递
2014/03/07 Javascript
JQuery 在线引用及测试引用是否成功
2014/06/24 Javascript
JavaScript中的this陷阱的最全收集并整理(没有之一)
2017/02/21 Javascript
axios基本入门用法教程
2017/03/25 Javascript
详解vue2.0的Element UI的表格table列时间戳格式化
2017/06/13 Javascript
JavaScript实现短信倒计时60s
2017/10/09 Javascript
vue中eslintrc.js配置最详细介绍
2018/12/21 Javascript
vue实现手机号码的校验实例代码(防抖函数的应用场景)
2019/09/05 Javascript
[01:23:45]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第一场 1月22日
2021/03/11 DOTA
Python中字典创建、遍历、添加等实用操作技巧合集
2015/06/02 Python
Python实现变量数值交换及判断数组是否含有某个元素的方法
2017/09/18 Python
500行代码使用python写个微信小游戏飞机大战游戏
2019/10/16 Python
Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签
2019/12/04 Python
pytorch-神经网络拟合曲线实例
2020/01/15 Python
Python实现结构体代码实例
2020/02/10 Python
python+selenium+chrome批量文件下载并自动创建文件夹实例
2020/04/27 Python
Django-celery-beat动态添加周期性任务实现过程解析
2020/11/26 Python
HTML5 File接口在web页面上使用文件下载
2017/02/27 HTML / CSS
HTML5 input placeholder 颜色修改示例
2014/05/30 HTML / CSS
美体小铺瑞典官方网站:The Body Shop瑞典
2018/01/27 全球购物
土耳其新趋势女装购物网站:Addax
2020/01/07 全球购物
如何使用PHP session
2015/04/21 面试题
SQL注入攻击的种类有哪些
2013/12/30 面试题
假期安全教育广播稿
2014/10/04 职场文书
公司业务员管理制度
2015/08/05 职场文书
小学感恩主题班会
2015/08/12 职场文书
Python字典的基础操作
2021/11/01 Python
解决Mysql中的innoDB幻读问题
2022/04/29 MySQL