python深度优先搜索和广度优先搜索


Posted in Python onFebruary 07, 2018

python深度优先搜索和广度优先搜索

1. 深度优先搜索介绍

图的深度优先搜索(Depth First Search),和树的先序遍历比较类似。

它的思想:假设初始状态是图中所有顶点均未被访问,则从某个顶点v出发,首先访问该顶点,然后依次从它的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和v有路径相通的顶点都被访问到。 若此时尚有其他顶点未被访问到,则另选一个未被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。

显然,深度优先搜索是一个递归的过程。

2. 广度优先搜索介绍

广度优先搜索算法(Breadth First Search),又称为"宽度优先搜索"或"横向优先搜索",简称BFS。

它的思想是:从图中某顶点v出发,在访问了v之后依次访问v的各个未曾访问过的邻接点,然后分别从这些邻接点出发依次访问它们的邻接点,并使得“先被访问的顶点的邻接点先于后被访问的顶点的邻接点被访问,直至图中所有已被访问的顶点的邻接点都被访问到。如果此时图中尚有顶点未被访问,则需要另选一个未曾被访问过的顶点作为新的起始点,重复上述过程,直至图中所有顶点都被访问到为止。

换句话说,广度优先搜索遍历图的过程是以v为起点,由近至远,依次访问和v有路径相通且路径长度为1,2...的顶点。

# -*- coding: utf-8 -*-
"""
Created on Wed Sep 27 00:41:25 2017
@author: my
"""
from collections import OrderedDict
class graph:
 nodes=OrderedDict({})#有序字典
 def toString(self):
 for key in self.nodes:
 print key+'邻接点为'+str(self.nodes[key].adj) 
 def add(self,data,adj,tag):
 n=Node(data,adj)
 self.nodes[tag]=n
 
 for vTag in n.adj:
 if self.nodes.has_key(vTag) and tag not in self.nodes[vTag].adj:
 self.nodes[vTag].adj.append(tag)
 visited=[]
 def dfs(self,v):
 if v not in self.visited:
 self.visited.append(v)
 print v
 for adjTag in self.nodes[v].adj:
 self.dfs(adjTag)
 visited2=[]
 def bfs(self,v): 
 queue=[]
 queue.insert(0,v)
 self.visited2.append(v)
 while(len(queue)!=0):
 top=queue[len(queue)-1]
 for temp in self.nodes[top].adj:
 if temp not in self.visited2:
  self.visited2.append(temp)
  queue.insert(0,temp)
 print top
 queue.pop()
class Node:
 data=0
 adj=[]
 def __init__(self,data,adj):
 self.data=data
 self.adj=adj
g=graph()
g.add(0,['e','c'],'a')
g.add(0,['a','g'],'b')
g.add(0,['a','e'],'c')
g.add(0,['a','f'],'d')
g.add(0,['a','c','f'],'e')
g.add(0,['d','g','e'],'f')
g.add(0,['b','f'],'g')
g.toString()
print '深度优先遍历的结构为'
g.dfs('c')
print '广度优先遍历的结构为'
g.bfs('c')
Python 相关文章推荐
Python数据结构之Array用法实例
Oct 09 Python
Python类的定义、继承及类对象使用方法简明教程
May 08 Python
详解Python3中yield生成器的用法
Aug 20 Python
浅析Python中return和finally共同挖的坑
Aug 18 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
Apr 25 Python
对python中的logger模块全面讲解
Apr 28 Python
使用CodeMirror实现Python3在线编辑器的示例代码
Jan 14 Python
python实现字符串加密 生成唯一固定长度字符串
Mar 22 Python
python初学者,用python实现基本的学生管理系统(python3)代码实例
Apr 10 Python
Pytorch1.5.1版本安装的方法步骤
Dec 31 Python
python使用matplotlib的savefig保存时图片保存不完整的问题
Jan 08 Python
详解Python requests模块
Jun 21 Python
Python Flask基础教程示例代码
Feb 07 #Python
Python装饰器用法实例总结
Feb 07 #Python
使用apidocJs快速生成在线文档的实例讲解
Feb 07 #Python
Python自定义线程池实现方法分析
Feb 07 #Python
使用apidoc管理RESTful风格Flask项目接口文档方法
Feb 07 #Python
Python列表推导式、字典推导式与集合推导式用法实例分析
Feb 07 #Python
浅析Python3爬虫登录模拟
Feb 07 #Python
You might like
PHP+DBM的同学录程序(4)
2006/10/09 PHP
通过Email发送PHP错误的方法
2015/07/20 PHP
php常用字符函数实例小结
2016/12/29 PHP
js截取函数(indexOf,join等)
2010/09/01 Javascript
jquery.artwl.thickbox.js  一个非常简单好用的jQuery弹出层插件
2012/03/01 Javascript
JavaScript mapreduce工作原理简析
2012/11/25 Javascript
定时器(setTimeout/setInterval)调用带参函数失效解决方法
2013/03/26 Javascript
javascript if条件判断方法小结
2014/05/17 Javascript
jQuery+css3动画属性制作猎豹浏览器宽屏banner焦点图
2015/03/16 Javascript
JavaScript实现为指定对象添加多个事件处理程序的方法
2015/04/17 Javascript
jQuery和CSS仿京东仿淘宝列表导航菜单
2017/01/04 Javascript
jQuery:unbind方法的使用详解
2017/08/14 jQuery
bootstrap tooltips在 angularJS中的使用方法
2019/04/10 Javascript
javscript 数组扁平化的实现
2020/02/03 Javascript
Vue中的this.$options.data()和this.$data用法说明
2020/07/26 Javascript
js实现磁性吸附的示例
2020/10/26 Javascript
[47:02]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS paiN
2018/03/30 DOTA
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
2015/08/10 Python
怎样使用Python脚本日志功能
2016/08/14 Python
Python高级用法总结
2018/05/26 Python
pandas读取csv文件,分隔符参数sep的实例
2018/12/12 Python
Python lxml解析HTML并用xpath获取元素的方法
2019/01/02 Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
2020/03/20 Python
css3 column实现卡片瀑布流布局的示例代码
2018/06/22 HTML / CSS
使用Canvas操作像素的方法
2018/06/14 HTML / CSS
html5 postMessage解决跨域、跨窗口消息传递方案
2016/12/20 HTML / CSS
.NET现在共支持多少种语言
2014/02/26 面试题
团员的自我评价
2013/12/01 职场文书
2014端午节活动策划方案
2014/01/27 职场文书
工作决心书
2014/03/11 职场文书
关于青春的演讲稿三分钟
2014/08/22 职场文书
献爱心大型公益活动策划方案
2014/09/15 职场文书
《鸡兔同笼》教学反思
2016/02/19 职场文书
使用HTML+Css+transform实现3D导航栏的示例代码
2021/03/31 HTML / CSS
matlab xlabel位置的设置方式
2021/05/21 Python
mysql中如何用命令创建联合唯一索引
2022/04/20 MySQL