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 greenlet实现原理和使用示例
Sep 24 Python
Python备份目录及目录下的全部内容的实现方法
Jun 12 Python
python 3.0 模拟用户登录功能并实现三次错误锁定
Nov 01 Python
python flask中静态文件的管理方法
Mar 20 Python
Python socket 套接字实现通信详解
Aug 27 Python
Pytorch 保存模型生成图片方式
Jan 10 Python
python列表删除和多重循环退出原理详解
Mar 26 Python
python 弧度与角度互转实例
Apr 15 Python
Python 中如何写注释
Aug 28 Python
python创建文本文件的简单方法
Aug 30 Python
Python利用matplotlib绘制散点图的新手教程
Nov 05 Python
python函数超时自动退出的实操方法
Dec 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
百度ping方法使用示例 自动ping百度
2014/01/26 PHP
实例讲解如何在PHP的Yii框架中进行错误和异常处理
2016/03/17 PHP
Yii CGridView用法实例详解
2016/07/12 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
2017/09/21 PHP
CSS中一些@规则的用法小结
2021/03/09 HTML / CSS
javascript 写类方式之三
2009/07/05 Javascript
Jquery实战_读书笔记2 选择器
2010/01/22 Javascript
Jquery常用技巧收集整理篇
2010/11/14 Javascript
用函数模板,写一个简单高效的 JSON 查询器的方法介绍
2013/04/17 Javascript
Javascript中查找不以XX字符结尾的单词示例代码
2013/10/15 Javascript
Node.js中的流(Stream)介绍
2015/03/30 Javascript
javascript文件加载管理简单实现方法
2015/07/25 Javascript
JavaScript 2048 游戏实例代码(简单易懂)
2016/03/25 Javascript
微信小程序实战之运维小项目
2017/01/17 Javascript
详解html-webpack-plugin用法全解
2018/01/22 Javascript
解决Jquery下拉框数据动态获取的问题
2018/01/25 jQuery
vue 优化CDN加速的方法示例
2018/09/19 Javascript
js实现前面自动补全位数的方法
2018/10/10 Javascript
微信小程序使用swiper组件实现层叠轮播图
2018/11/04 Javascript
微信小程序 Storage更新详解
2019/07/16 Javascript
Vue过渡效果之CSS过渡详解(结合transition,animation,animate.css)
2020/02/05 Javascript
基于ajax实现上传图片代码示例解析
2020/12/03 Javascript
用Python编写生成树状结构的文件目录的脚本的教程
2015/05/04 Python
Python实现的RSS阅读器实例
2015/07/25 Python
Python对列表中的各项进行关联详解
2017/08/15 Python
在django view中给form传入参数的例子
2019/07/19 Python
Django3.0 异步通信初体验(小结)
2019/12/04 Python
Python实现链表反转的方法分析【迭代法与递归法】
2020/02/22 Python
pycharm 快速解决python代码冲突的问题
2021/01/15 Python
全球最大的在线橄榄球商店:Lovell Rugby
2018/05/20 全球购物
绘画设计学生的个人自我评价
2013/09/20 职场文书
优秀英语专业毕业生求职信
2013/11/23 职场文书
项目施工员岗位职责
2014/03/09 职场文书
高三高考决心书
2014/03/11 职场文书
酒店总经理岗位职责范本
2014/08/08 职场文书
PyTorch中permute的使用方法
2022/04/26 Python