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脚本
Apr 05 Python
python中map()与zip()操作方法
Feb 27 Python
详解MySQL数据类型int(M)中M的含义
Nov 20 Python
详解python里使用正则表达式的分组命名方式
Oct 24 Python
基于Django与ajax之间的json传输方法
May 29 Python
python程序变成软件的实操方法
Jun 24 Python
python 寻找离散序列极值点的方法
Jul 10 Python
python 字典套字典或列表的示例
Dec 16 Python
NumPy统计函数的实现方法
Jan 21 Python
Visual Studio Code搭建django项目的方法步骤
Sep 17 Python
python urllib库的使用详解
Apr 13 Python
Python中的 No Module named ***问题及解决
Jul 23 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 $_SERVER windows系统与linux系统下的区别说明
2014/02/14 PHP
Windows下Apache + PHP SESSION丢失的解决过程全纪录
2015/04/07 PHP
详解PHP的Yii框架中自带的前端资源包的使用
2016/03/31 PHP
解决微信授权回调页面域名只能设置一个的问题
2016/12/11 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
为指定元素增加样式的js代码
2009/12/09 Javascript
JavaScript实现16进制颜色值转RGB的方法
2015/02/09 Javascript
JS根据生日算年龄的方法
2015/05/05 Javascript
jquery插件validation实现验证身份证号等
2015/06/04 Javascript
jquery+CSS实现的多级竖向展开树形TRee菜单效果
2015/08/24 Javascript
js密码强度校验
2015/11/10 Javascript
nodejs个人博客开发第一步 准备工作
2017/04/12 NodeJs
vue.js移动端tab组件的封装实践实例
2017/06/30 Javascript
React注册倒计时功能的实现
2018/09/06 Javascript
vuex实现及简略解析(小结)
2019/03/01 Javascript
简单说说如何使用vue-router插件的方法
2019/04/08 Javascript
原生js实现点击轮播切换图片
2020/02/11 Javascript
vue中实现弹出层动画效果的示例代码
2020/09/25 Javascript
Python实现简单过滤文本段的方法
2017/05/24 Python
pandas groupby 分组取每组的前几行记录方法
2018/04/20 Python
mac安装pytorch及系统的numpy更新方法
2018/07/26 Python
Python常用模块之requests模块用法分析
2019/05/15 Python
python函数与方法的区别总结
2019/06/23 Python
快速解决vue.js 模板和jinja 模板冲突的问题
2019/07/26 Python
Python接收手机短信的代码整理
2020/08/02 Python
Python基于tkinter canvas实现图片裁剪功能
2020/11/05 Python
台湾全方位线上课程与职能学习平台:TibaMe
2019/12/04 全球购物
sealed修饰符是干什么的
2012/10/23 面试题
公司道歉信范文
2014/01/09 职场文书
音乐器材管理制度
2014/01/31 职场文书
党员违纪检讨书
2014/02/18 职场文书
禁止高声喧哗的标语
2014/06/11 职场文书
机关党建工作汇报材料
2014/08/20 职场文书
2015学校年度工作总结
2015/05/11 职场文书
2015年骨干教师工作总结
2015/05/26 职场文书
《狼牙山五壮士》读后感:宁死不屈,视死如归
2019/08/16 职场文书