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 寻找优化使成本函数最小的最优解的方法
Dec 28 Python
python OpenCV学习笔记之绘制直方图的方法
Feb 08 Python
Python3 读、写Excel文件的操作方法
Oct 20 Python
解决Python下json.loads()中文字符出错的问题
Dec 19 Python
解决Python3 被PHP程序调用执行返回乱码的问题
Feb 16 Python
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
Mar 14 Python
python绘制地震散点图
Jun 18 Python
python判断自身是否正在运行的方法
Aug 08 Python
parser.add_argument中的action使用
Apr 20 Python
Python实现AES加密,解密的两种方法
Oct 03 Python
python 实现弹球游戏的示例代码
Nov 17 Python
Python 数据可视化神器Pyecharts绘制图像练习
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
应用开发中涉及到的css和php笔记分享
2011/08/02 PHP
thinkphp验证码显示不出来的解决方法
2014/03/29 PHP
PHP使用CURL实现多线程抓取网页
2015/04/30 PHP
PHP处理数组和XML之间的互相转换
2016/06/02 PHP
php获取POST数据的三种方法实例详解
2016/12/20 PHP
php实现socket推送技术的示例
2017/12/20 PHP
ThinkPHP5.0框架使用build 自动生成模块操作示例
2019/04/11 PHP
纯js简单日历实现代码
2013/10/05 Javascript
用javascript删除当前行,添加行(示例代码)
2013/11/25 Javascript
ext中store.load跟store.reload的区别示例介绍
2014/06/17 Javascript
JavaScript代码复用模式详解
2014/11/07 Javascript
javascript获得当前的信息的一些常用命令
2015/02/25 Javascript
jQuery判断浏览器并动态调整select宽度的方法
2016/03/02 Javascript
第二次聊一聊JS require.js模块化工具的基础知识
2016/04/17 Javascript
Javascript表单特效之十大常用原理性样例代码大总结
2016/07/12 Javascript
JS正则表达式修饰符global(/g)用法分析
2016/12/27 Javascript
Vue实现微信支付功能遇到的坑
2019/06/05 Javascript
原生js实现html手机端城市列表索引选择城市
2020/06/24 Javascript
Python操作SQLite数据库的方法详解
2017/06/16 Python
Python使用pip安装报错:is not a supported wheel on this platform的解决方法
2018/01/23 Python
Python简单读写Xls格式文档的方法示例
2018/08/17 Python
Python中实例化class的执行顺序示例详解
2018/10/14 Python
python判断输入日期为第几天的实例
2018/11/13 Python
基于Python中isfile函数和isdir函数使用详解
2019/11/29 Python
python调用c++返回带成员指针的类指针实例
2019/12/12 Python
Python日志logging模块功能与用法详解
2020/04/09 Python
Keras 利用sklearn的ROC-AUC建立评价函数详解
2020/06/15 Python
Lime Crime官网:美国一家主打梦幻精灵系的彩妆品牌
2019/03/22 全球购物
Janie and Jack美国官网:GAP旗下的高档童装品牌
2019/09/09 全球购物
毕业生机械建模求职信
2013/10/14 职场文书
优秀幼教自荐信
2014/02/03 职场文书
2014年母亲节演讲稿范文
2014/05/07 职场文书
争先创优公开承诺书
2014/08/30 职场文书
领导班子三严三实对照检查材料
2014/09/25 职场文书
2019年鼓励无偿献血倡议书
2019/09/17 职场文书
Python中递归以及递归遍历目录详解
2021/10/24 Python