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解析html开发库pyquery使用方法
Feb 07 Python
Python异常学习笔记
Feb 03 Python
python函数的5种参数详解
Feb 24 Python
Python中表达式x += y和x = x+y 的区别详解
Jun 20 Python
Python简单实现网页内容抓取功能示例
Jun 07 Python
Django框架会话技术实例分析【Cookie与Session】
May 24 Python
使用pyinstaller打包PyQt4程序遇到的问题及解决方法
Jun 24 Python
Python中一个for循环循环多个变量的示例
Jul 16 Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
Oct 04 Python
python 计算方位角实例(根据两点的坐标计算)
Jan 17 Python
Python入门之使用pandas分析excel数据
May 12 Python
Python中的程序流程控制语句
Feb 24 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生成不重复随机数的方法汇总
2014/11/19 PHP
thinkphp5框架调用其它控制器方法 实现自定义跳转界面功能示例
2019/07/03 PHP
使用Javascript和DOM Interfaces来处理HTML
2006/10/09 Javascript
js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME
2011/12/20 Javascript
jQuery结合HTML5制作的爱心树表白动画
2015/02/01 Javascript
JavaScript阻止浏览器返回按钮的方法
2015/03/18 Javascript
一种Javascript解释ajax返回的json的好方法(推荐)
2016/06/02 Javascript
AngularJS Ajax详解及示例代码
2016/08/17 Javascript
AngularJS中的DOM操作用法分析
2016/11/04 Javascript
Bootstrap popover用法详解
2016/12/22 Javascript
JS批量替换内容中关键词为超链接
2017/02/20 Javascript
Vue.js对象转换实例
2017/06/07 Javascript
利用nginx + node在阿里云部署https的步骤详解
2017/12/19 Javascript
微信小程序自定义导航教程(兼容各种手机)
2018/12/12 Javascript
详解javascript中var与ES6规范中let、const区别与用法
2020/01/11 Javascript
ant design pro中可控的筛选和排序实例
2020/11/17 Javascript
用Python和MD5实现网站挂马检测程序
2014/03/13 Python
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
2017/05/08 Python
Window10+Python3.5安装opencv的教程推荐
2018/04/02 Python
用Django写天气预报查询网站
2018/10/21 Python
Python批量生成幻影坦克图片实例代码
2019/06/04 Python
python生成并处理uuid的实现方式
2020/03/03 Python
python如何用matplotlib创建三维图表
2021/01/26 Python
梅西百货澳大利亚:Macy’s Australia
2017/07/26 全球购物
英国玛莎百货美国官网:Marks & Spencer美国
2018/11/06 全球购物
英国排名第一的冲浪店:Ann’s Cottage
2020/06/21 全球购物
公关关系专员的自我评价分享
2013/11/20 职场文书
毕业生求职找工作的自我评价范文
2013/11/27 职场文书
国际贸易专业个人鉴定
2014/02/22 职场文书
加强作风建设工作总结
2014/10/23 职场文书
毕业实习计划书
2015/01/16 职场文书
个人先进事迹总结
2015/02/26 职场文书
微观世界观后感
2015/06/10 职场文书
2016师德师风学习心得体会
2016/01/12 职场文书
selenium.webdriver中add_argument方法常用参数表
2021/04/08 Python
正确的理解和使用Django信号(Signals)
2021/04/14 Python