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脚本生成caffe train_list.txt的方法
Apr 27 Python
pandas DataFrame 根据多列的值做判断,生成新的列值实例
May 18 Python
python爬取微信公众号文章
Aug 31 Python
Python3 修改默认环境的方法
Feb 16 Python
python的schedule定时任务模块二次封装方法
Feb 19 Python
python 杀死自身进程的实现方法
Jul 01 Python
python爬虫的一个常见简单js反爬详解
Jul 09 Python
python日志模块logbook使用方法
Sep 19 Python
pycharm导入源码的具体步骤
Aug 04 Python
Python制作简单的剪刀石头布游戏
Dec 10 Python
python四种出行路线规划的实现
Jun 23 Python
Python装饰器详细介绍
Mar 25 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中var_dump方法的使用详解
2013/06/24 PHP
javascript  Error 对象 错误处理
2008/05/18 Javascript
JavaScript学习笔记(二) js对象
2011/10/25 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
jquery ajax分页插件的简单实现
2016/01/27 Javascript
jQuery UI Draggable + Sortable 结合使用(实例讲解)
2017/09/07 jQuery
详解vue组件基础
2018/05/04 Javascript
AngularJS中的作用域实例分析
2018/05/16 Javascript
AngularJS自定义表单验证功能实例详解
2018/08/24 Javascript
详解离线安装npm包的几种方法
2018/11/25 Javascript
JavaScript深入V8引擎以及编写优化代码的5个技巧
2019/06/24 Javascript
Vue商品控件与购物车联动效果的实例代码
2019/07/21 Javascript
解决一个微信号同时支持多个环境网页授权问题
2019/08/07 Javascript
JQuery使用数组遍历跳出each循环
2020/09/01 jQuery
python备份文件以及mysql数据库的脚本代码
2013/06/10 Python
简单总结Python中序列与字典的相同和不同之处
2016/01/19 Python
python生成器表达式和列表解析
2016/03/10 Python
LRUCache的实现原理及利用python实现的方法
2017/11/21 Python
python 类对象和实例对象动态添加方法(分享)
2017/12/31 Python
python发送邮件脚本
2018/05/22 Python
浅谈Django的缓存机制
2018/08/23 Python
利用python将图片版PDF转文字版PDF
2019/05/03 Python
python使用minimax算法实现五子棋
2019/07/29 Python
jupyter notebook 的工作空间设置操作
2020/04/20 Python
python爬虫爬取某网站视频的示例代码
2021/02/20 Python
荷兰男士时尚网上商店:Suitable
2017/12/25 全球购物
【魔兽争霸3重制版】原版画面与淬火MOD画面对比
2021/03/26 魔兽争霸
家长写给老师的建议书
2014/03/13 职场文书
英语求职信范文
2014/05/23 职场文书
幼儿园爱国卫生月活动总结
2014/06/30 职场文书
大学毕业生管理学求职信
2014/09/01 职场文书
政风行风自查自纠报告
2014/10/21 职场文书
单位实习工作证明怎么写
2014/11/02 职场文书
2015年敬老月活动总结
2015/03/27 职场文书
邹越演讲观后感
2015/06/15 职场文书
MySQL 使用事件(Events)完成计划任务
2021/05/24 MySQL