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系列之新版本导入httplib模块报ImportError解决方案
May 23 Python
Python中的CURL PycURL使用例子
Jun 01 Python
CentOS 6.X系统下升级Python2.6到Python2.7 的方法
Oct 12 Python
Python获取二维矩阵每列最大值的方法
Apr 03 Python
Python针对给定列表中元素进行翻转操作的方法分析
Apr 27 Python
浅谈Python中的bs4基础
Oct 21 Python
如何在Python中实现goto语句的方法
May 18 Python
python2 中 unicode 和 str 之间的转换及与python3 str 的区别
Jul 25 Python
python根据时间获取周数代码实例
Sep 30 Python
在pycharm中文件取消用 pytest模式打开的操作
Sep 01 Python
详解Python中的编码问题(encoding与decode、str与bytes)
Sep 30 Python
python使用matplotlib的savefig保存时图片保存不完整的问题
Jan 08 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代码飞起来的40条小技巧(提升php效率)
2010/04/12 PHP
php HtmlReplace输入过滤安全函数
2010/07/03 PHP
PHP提示Cannot modify header information - headers already sent by解决方法
2014/09/22 PHP
PHP中常用的字符串格式化函数总结
2014/11/19 PHP
thinkPHP简单遍历数组方法分析
2016/05/16 PHP
PHP编程之设置apache虚拟目录
2016/07/08 PHP
PHP面试常用算法(推荐)
2016/07/22 PHP
PHP使用JpGraph绘制折线图操作示例【附源码下载】
2019/10/18 PHP
PHP For循环字母A-Z当超过26个字母时输出AA,AB,AC
2020/02/16 PHP
可选择和输入的下拉列表框示例
2013/11/05 Javascript
纯JS代码实现气泡效果
2016/05/04 Javascript
js控制li的隐藏和显示实例代码
2016/10/15 Javascript
JS实现图片预加载之无序预加载功能代码
2017/05/12 Javascript
React Native之TextInput组件解析示例
2017/08/22 Javascript
在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解
2017/09/19 NodeJs
微信小程序项目实践之验证码倒计时功能
2018/07/18 Javascript
使用Vue开发自己的Chrome扩展程序过程详解
2019/06/21 Javascript
webpack是如何实现模块化加载的方法
2019/11/06 Javascript
微信小程序基于ColorUI构建皮皮虾短视频去水印组件
2020/11/04 Javascript
python 爬虫一键爬取 淘宝天猫宝贝页面主图颜色图和详情图的教程
2018/05/22 Python
Python3数字求和的实例
2019/02/19 Python
详解Python读取yaml文件多层菜单
2019/03/23 Python
Django框架用户注销功能实现方法分析
2019/05/28 Python
Python @property使用方法解析
2019/09/17 Python
浅谈keras使用预训练模型vgg16分类,损失和准确度不变
2020/07/02 Python
python实现测试工具(一)——命令行发送get请求
2020/10/19 Python
如何用Matlab和Python读取Netcdf文件
2021/02/19 Python
Html5新特性用canvas标签画多条直线附效果截图
2014/06/30 HTML / CSS
canvas 绘图时位置偏离的问题解决
2020/09/16 HTML / CSS
酒店管理专业学生求职信
2013/09/27 职场文书
光电信息专业应届生求职信
2013/10/07 职场文书
车间班组长岗位职责
2013/11/13 职场文书
单位创先争优活动方案
2014/01/26 职场文书
《美丽的丹顶鹤》教学反思
2014/04/22 职场文书
文员求职信
2014/07/15 职场文书
生鲜超市—未来中国最具有潜力零售业态
2019/08/02 职场文书