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生态系统(Python新手入门指导)
Dec 11 Python
python3 模拟登录v2ex实例讲解
Jul 13 Python
python利用urllib实现爬取京东网站商品图片的爬虫实例
Aug 24 Python
python查找指定文件夹下所有文件并按修改时间倒序排列的方法
Oct 21 Python
Python使用sqlalchemy模块连接数据库操作示例
Mar 13 Python
原生python实现knn分类算法
Oct 24 Python
python pyenv多版本管理工具的使用
Dec 23 Python
Python之多进程与多线程的使用
Feb 23 Python
解决python 输出到csv 出现多空行的情况
Mar 24 Python
Python还能这么玩之用Python做个小游戏的外挂
Jun 04 Python
Python实现照片卡通化
Dec 06 Python
Python安装使用Scrapy框架
Apr 12 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
163的邮件用phpmailer发送(实例详解)
2013/06/24 PHP
PHP 登录完成后如何跳转上一访问页面
2014/01/14 PHP
PHP实现AES256加密算法实例
2014/09/22 PHP
PHP获取数组中指定的一列实例
2017/12/27 PHP
基于PHP实现用户在线状态检测
2020/11/10 PHP
juqery 学习之三 选择器 可见性 元素属性
2010/11/25 Javascript
js前台判断开始时间是否小于结束时间
2012/02/23 Javascript
JavaScript实现点击按钮后变灰避免多次重复提交
2013/07/15 Javascript
浅谈javascript面向对象程序设计
2015/01/21 Javascript
jquery使用经验小结
2015/05/20 Javascript
jquery实现简单的全选和反选功能
2016/01/02 Javascript
AngularJS入门教程之REST和定制服务详解
2016/08/19 Javascript
jQuery图片查看插件Magnify开发详解
2017/12/25 jQuery
Vue 中的compile操作方法
2018/02/26 Javascript
通过nodejs 服务器读取HTML文件渲染到页面的方法
2018/05/17 NodeJs
Spring boot 和Vue开发中CORS跨域问题解决
2018/09/05 Javascript
JS实现盒子跟着鼠标移动及键盘方向键控制盒子移动效果示例
2019/01/29 Javascript
解决vue elementUI中table里数字、字母、中文混合排序问题
2020/01/07 Javascript
JS中this的4种绑定规则详解
2020/02/04 Javascript
[02:34]2016完美“圣”典风云人物:BurNIng专访
2016/12/10 DOTA
python 正则表达式 概述及常用字符
2009/05/04 Python
Python Tkinter基础控件用法
2014/09/03 Python
Python使用win32 COM实现Excel的写入与保存功能示例
2018/05/03 Python
python 读取视频,处理后,实时计算帧数fps的方法
2018/07/10 Python
PyQt5的PyQtGraph实践系列3之实时数据更新绘制图形
2019/05/13 Python
python实现双色球随机选号
2020/01/01 Python
HTML5和以前HTML4的区别整理
2013/10/20 HTML / CSS
HTML5 history新特性pushState、replaceState及两者的区别
2015/12/26 HTML / CSS
澳大利亚票务和娱乐市场领导者:Ticketmaster
2017/03/03 全球购物
Trina Turk官网:美国时装和泳装品牌
2018/06/10 全球购物
J2EE系统只能是基于web
2015/09/08 面试题
《小壁虎借尾巴》教学反思
2014/02/16 职场文书
中学教师师德师风演讲稿
2014/08/22 职场文书
市场部岗位职责范本
2015/04/15 职场文书
MySQL如何快速创建800w条测试数据表
2022/03/17 MySQL
vue使用wavesurfer.js解决音频可视化播放问题
2022/04/04 Vue.js