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利用拉链法实现字典方法示例
Mar 25 Python
pandas.dataframe中根据条件获取元素所在的位置方法(索引)
Jun 07 Python
python复制列表时[:]和[::]之间有什么区别
Oct 16 Python
python实现维吉尼亚加密法
Mar 20 Python
Python生成rsa密钥对操作示例
Apr 26 Python
解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题
Jun 21 Python
python的移位操作实现详解
Aug 21 Python
关于ZeroMQ 三种模式python3实现方式
Dec 23 Python
Python log模块logging记录打印用法解析
Jan 20 Python
Python如何实现自带HTTP文件传输服务
Jul 08 Python
python音频处理的示例详解
Dec 23 Python
Python机器学习实战之k-近邻算法的实现
Nov 27 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中输出转义JavaScript代码的实现代码
2011/04/22 PHP
Window 7/XP 安装Apache 2.4与PHP 5.4 的过程详解
2013/06/02 PHP
PDO预处理语句PDOStatement对象使用总结
2014/11/20 PHP
PHP图像处理技术实例总结【绘图、水印、验证码、图像压缩】
2018/12/08 PHP
javascript firefox 自动加载iframe 自动调整高宽示例
2013/08/27 Javascript
js 判断图片是否加载完以及实现图片的预下载
2014/08/14 Javascript
jquery渐隐渐显的图片幻灯闪烁切换实现方法
2015/02/26 Javascript
jQuery的animate函数实现图文切换动画效果
2015/05/03 Javascript
jQuery获取cookie值及删除cookie用法实例
2016/04/15 Javascript
js判断浏览器是否支持严格模式的方法
2016/10/04 Javascript
Canvas + JavaScript 制作图片粒子效果
2017/02/08 Javascript
javascript实现非常简单的小数取整功能示例
2017/06/13 Javascript
微信小程序 共用变量值的实现
2017/07/12 Javascript
基于AngularJS的拖拽文件上传的实例代码
2017/07/15 Javascript
react 应用多入口配置及实践总结
2018/10/17 Javascript
vue框架下部署上线后刷新报404问题的解决方案(推荐)
2019/04/03 Javascript
js实现简单贪吃蛇游戏
2020/05/15 Javascript
浅析VUE防抖与节流
2020/11/24 Vue.js
keep-alive保持组件状态的方法
2020/12/02 Javascript
用python登录Dr.com思路以及代码分享
2014/06/25 Python
Python写的服务监控程序实例
2015/01/31 Python
使用Protocol Buffers的C语言拓展提速Python程序的示例
2015/04/16 Python
python实现提取百度搜索结果的方法
2015/05/19 Python
Python面向对象之接口、抽象类与多态详解
2018/08/27 Python
使用python telnetlib批量备份交换机配置的方法
2019/07/25 Python
python实现斗地主分牌洗牌
2020/06/22 Python
波兰多品牌运动商店:StreetStyle24.pl
2020/09/22 全球购物
什么是Linux虚拟文件系统VFS
2015/08/25 面试题
北大青鸟学生求职信
2013/09/24 职场文书
学校门卫工作职责
2013/12/07 职场文书
小学教师办公室制度
2014/02/03 职场文书
销售主管岗位职责
2014/02/08 职场文书
七匹狼男装广告词
2014/03/21 职场文书
关于奉献的演讲稿
2014/05/21 职场文书
2015年全民国防教育日活动总结
2015/03/23 职场文书
销售区域经理岗位职责
2015/04/10 职场文书