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转码问题的解决方法
Oct 07 Python
Python实现股市信息下载的方法
Jun 15 Python
python实现爬虫统计学校BBS男女比例之多线程爬虫(二)
Dec 31 Python
python监控文件或目录变化
Jun 07 Python
Python使用dis模块把Python反编译为字节码的用法详解
Jun 14 Python
再谈Python中的字符串与字符编码(推荐)
Dec 14 Python
2018年Python值得关注的开源库、工具和开发者(总结篇)
Jan 04 Python
使用pandas批量处理矢量化字符串的实例讲解
Jul 10 Python
python读写csv文件方法详细总结
Jul 05 Python
理解Django 中Call Stack机制的小Demo
Sep 01 Python
Python中使用Selenium环境安装的方法步骤
Feb 22 Python
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
Apr 06 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下使用以下代码连接并测试
2008/04/09 PHP
php实现首页链接查询 友情链接检查的代码
2010/01/05 PHP
PHP源代码数组统计count分析
2011/08/02 PHP
微信支付开发订单查询实例
2016/07/12 PHP
PHP对XML内容进行修改和删除实例代码
2016/10/26 PHP
JavaScript创建类/对象的几种方式概述及实例
2013/05/06 Javascript
js中文逗号转英文实现
2014/02/11 Javascript
javascript删除一个html元素节点的方法
2014/12/20 Javascript
JavaScript实现信用卡校验方法
2015/04/07 Javascript
JS实现点击上移下移LI行数据的方法
2015/08/05 Javascript
关注jquery技巧提高jquery技能(前端开发必学)
2015/11/02 Javascript
详解Javascript中的Object对象
2016/02/28 Javascript
jQuery 如何给Carousel插件添加新的功能
2016/04/18 Javascript
JS学习之表格的排序简单实例
2016/05/16 Javascript
JavaScript的兼容性与调试技巧
2016/11/22 Javascript
canvas绘制多边形
2017/02/24 Javascript
打字效果动画的4种实现方法(超简单)
2017/10/18 Javascript
AngularJS 将再发布一个重要版本 然后进入长期支持阶段
2018/01/31 Javascript
Layui tree 下拉菜单树的实例代码
2019/09/21 Javascript
Python3 适合初学者学习的银行账户登录系统实例
2017/08/08 Python
Windows下anaconda安装第三方包的方法小结(tensorflow、gensim为例)
2018/04/05 Python
用python脚本24小时刷浏览器的访问量方法
2018/12/07 Python
Python 循环终止语句的三种方法小结
2019/06/24 Python
Python3+PyInstall+Sciter解决报错缺少dll、html等文件问题
2019/07/15 Python
Python如何优雅删除字符列表空字符及None元素
2020/06/25 Python
Python实现删除某列中含有空值的行的示例代码
2020/07/20 Python
Tory Burch美国官方网站:美国时尚生活品牌
2016/08/01 全球购物
英国专业美容产品在线:Mylee(从指甲到脱毛)
2020/07/06 全球购物
早餐连锁店计划书
2014/01/08 职场文书
军训自我鉴定
2014/01/22 职场文书
校园文化建设方案
2014/02/03 职场文书
公务员转正考察材料
2014/02/07 职场文书
军训自我鉴定范文
2014/02/13 职场文书
入党申请书怎么写?
2019/06/11 职场文书
准备去美国留学,那么大学申请文书应该怎么写?
2019/08/12 职场文书
Python序列化模块JSON与Pickle
2022/06/05 Python