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数组条件过滤filter函数使用示例
Jul 22 Python
python删除指定类型(或非指定)的文件实例详解
Jul 06 Python
Python排序搜索基本算法之选择排序实例分析
Dec 09 Python
Windows下Anaconda的安装和简单使用方法
Jan 04 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
Feb 01 Python
用tensorflow搭建CNN的方法
Mar 05 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
Mar 19 Python
关于python写入文件自动换行的问题
Jun 23 Python
pyqt 实现在Widgets中显示图片和文字的方法
Jun 13 Python
Django 外键的使用方法详解
Jul 19 Python
使用 tf.nn.dynamic_rnn 展开时间维度方式
Jan 21 Python
用 Python 元类的特性实现 ORM 框架
May 19 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中SimpleXML函数用法分析
2014/11/26 PHP
ThinkPHP中redirect用法分析
2014/12/05 PHP
详细解读php的命名空间(一)
2018/02/21 PHP
javascript 文档的编码问题解决
2009/03/01 Javascript
写了10年的Javascript也未必全了解的连续赋值运算
2011/03/25 Javascript
js获得鼠标的坐标值的方法
2013/03/13 Javascript
通过Javascript读取本地Excel文件内容的代码示例
2014/04/08 Javascript
多引号嵌套的变量命名的问题
2014/05/09 Javascript
jQuery EasyUI提交表单验证
2016/07/19 Javascript
关于angularJs指令的Scope(作用域)介绍
2016/10/25 Javascript
纯原生js实现table表格的增删
2017/01/05 Javascript
el表达式 写入bootstrap表格数据页面的实例代码
2017/01/11 Javascript
NodeJS爬虫实例之糗事百科
2017/12/14 NodeJs
使用sessionStorage解决vuex在页面刷新后数据被清除的问题
2018/04/13 Javascript
JS实现简单的点赞与踩功能示例
2018/12/05 Javascript
Vue组件通信中非父子组件传值知识点总结
2019/12/05 Javascript
vue使用video插件vue-video-player详解
2020/10/23 Javascript
[46:03]LGD vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python里隐藏的“禅”
2014/06/16 Python
Python中unittest模块做UT(单元测试)使用实例
2015/06/12 Python
深入理解python对json的操作总结
2017/01/05 Python
python3.6中@property装饰器的使用方法示例
2019/08/17 Python
python高级特性简介
2020/08/13 Python
canvas 基础之图像处理的使用
2020/04/10 HTML / CSS
Myprotein西班牙官网:欧洲第一大运动营养品牌
2020/02/24 全球购物
QA工程师岗位职责
2013/11/20 职场文书
大学毕业生个人自荐信范文
2014/01/08 职场文书
一月红领巾广播稿
2014/02/11 职场文书
广告学专业自荐信范文
2014/02/24 职场文书
交通安全寄语大全
2014/04/08 职场文书
大学生心理活动总结
2014/07/04 职场文书
同志主要表现材料
2014/08/21 职场文书
商场父亲节活动方案
2014/08/27 职场文书
解决hive中导入text文件遇到的坑
2021/04/07 Python
分布式架构Redis中有哪些数据结构及底层实现原理
2022/03/13 Redis
如何通过一篇文章了解Python中的生成器
2022/04/02 Python