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 sqlobject(mysql)中文乱码解决方法
Nov 14 Python
python实现带声音的摩斯码翻译实现方法
May 20 Python
Python中的字典与成员运算符初步探究
Oct 13 Python
Flask的图形化管理界面搭建框架Flask-Admin的使用教程
Jun 13 Python
更改Ubuntu默认python版本的两种方法python-> Anaconda
Dec 18 Python
python中将字典形式的数据循环插入Excel
Jan 16 Python
numpy 计算两个数组重复程度的方法
Nov 07 Python
python利用itertools生成密码字典并多线程撞库破解rar密码
Aug 12 Python
python并发编程多进程之守护进程原理解析
Aug 20 Python
python 循环数据赋值实例
Dec 02 Python
python+opencv实现车牌定位功能(实例代码)
Dec 24 Python
Java Spring项目国际化(i18n)详细方法与实例
Mar 20 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
漫荒推荐:画风超赞的国风漫画推荐 超长假期不无聊
2020/03/08 国漫
PHP通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
PHP限制页面只能在微信自带浏览器访问的代码
2014/01/15 PHP
php跨域cookie共享使用方法
2014/02/20 PHP
PHP合并数组的2种方法小结
2016/11/24 PHP
laravel 多图上传及图片的存储例子
2019/10/14 PHP
js兼容火狐获取图片宽和高的方法
2015/05/21 Javascript
AngularJS仿苹果滑屏删除控件
2016/01/18 Javascript
jQuery中Ajax全局事件引用方式及各个事件(全局/局部)执行顺序
2016/06/02 Javascript
JS实现touch 点击滑动轮播实例代码
2017/01/19 Javascript
利用Angular.js编写公共提示模块的方法教程
2017/05/28 Javascript
jQuery为某个div加入行样式
2017/06/09 jQuery
详解jquery选择器的原理
2017/08/01 jQuery
JavaScript实现AOP详解(面向切面编程,装饰者模式)
2017/12/19 Javascript
vue.js根据代码运行环境选择baseurl的方法
2018/02/28 Javascript
Javascript的console['']常用输入方法汇总
2018/04/26 Javascript
微信小程序在地图选择地址并返回经纬度简单示例
2018/12/03 Javascript
node.js中path路径模块的使用方法实例分析
2020/02/13 Javascript
[01:09]DOTA2次级职业联赛 - ishow.HMM战队宣传片
2014/12/01 DOTA
举例讲解Python中的list列表数据结构用法
2016/03/12 Python
Python创建一个空的dataframe,并循环赋值的方法
2018/11/08 Python
使用pandas把某一列的字符值转换为数字的实例
2019/01/29 Python
Python的bit_length函数来二进制的位数方法
2019/08/27 Python
TensorFlow MNIST手写数据集的实现方法
2020/02/05 Python
Python内存映射文件读写方式
2020/04/24 Python
python 基于Apscheduler实现定时任务
2020/12/15 Python
东方电视购物:东方CJ
2016/10/12 全球购物
智能电子秤、手表和健康监测仪:Withings(之前为诺基亚健康)
2018/10/30 全球购物
木工主管岗位职责
2013/12/08 职场文书
店长职务说明书
2014/02/04 职场文书
离婚协议书怎么写2014
2014/09/30 职场文书
旗帜观后感
2015/06/08 职场文书
七年级作文之雪景
2019/11/18 职场文书
简述Java中throw-throws异常抛出
2021/08/07 Java/Android
Python Pandas解析读写 CSV 文件
2022/04/11 Python
MySQL示例讲解数据库约束以及表的设计
2022/06/16 MySQL