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 20 Python
Django1.7+python 2.78+pycharm配置mysql数据库教程
Nov 18 Python
让python在hadoop上跑起来
Jan 27 Python
解决tensorflow测试模型时NotFoundError错误的问题
Jul 27 Python
Python 列表的清空方式
Jan 13 Python
Django 解决新建表删除后无法重新创建等问题
May 21 Python
解决keras backend 越跑越慢问题
Jun 18 Python
Python包资源下载路径报404解决方案
Nov 05 Python
Python操作Excel的学习笔记
Feb 18 Python
基于PyTorch中view的用法说明
Mar 03 Python
anaconda python3.8安装后降级
Jun 11 Python
PyQt5结合QtDesigner实现文本框读写操作
Jun 11 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
超人钢铁侠联手合作?美漫作家呼吁DC漫威合作联动以抵抗疫情
2020/04/09 欧美动漫
由php if 想到的些问题
2008/03/22 PHP
ajax在joomla中的原生态应用代码
2012/07/19 PHP
ThinkPHP3.1新特性之命名范围的使用
2014/06/19 PHP
php去除html标记的原生函数详解
2015/01/27 PHP
PHP解析RSS的方法
2015/03/05 PHP
关于PHP中协程和阻塞的一些理解与思考
2017/08/11 PHP
用javascript实现无刷新更新数据的详细步骤 asp
2006/12/26 Javascript
javascript网页关键字高亮代码
2008/07/30 Javascript
js检查页面上有无重复id的实现代码
2013/07/17 Javascript
jquerymobile局部渲染的各种刷新方法小结
2014/03/05 Javascript
Jquery Post处理后不进入回调的原因及解决方法
2014/07/15 Javascript
浅析javascript 定时器
2014/12/23 Javascript
静态页面html中跳转传值的JS处理技巧
2016/06/22 Javascript
AngularJS表单基本操作
2017/01/09 Javascript
JS+WCF实现进度条实时监测数据加载量的方法详解
2017/12/19 Javascript
js监听html页面的上下滚动事件方法
2018/09/11 Javascript
js实现随机数小游戏
2019/06/28 Javascript
Postman内建变量常用方法实例解析
2020/07/28 Javascript
SQLite3中文编码 Python的实现
2017/01/11 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
2018/07/17 Python
springboot配置文件抽离 git管理统 配置中心详解
2019/09/02 Python
Python&&GDAL实现NDVI的计算方式
2020/01/09 Python
Python多线程操作之互斥锁、递归锁、信号量、事件实例详解
2020/03/24 Python
Python ini文件常用操作方法解析
2020/04/26 Python
Python爬取阿拉丁统计信息过程图解
2020/05/12 Python
Python爬虫如何应对Cloudflare邮箱加密
2020/06/24 Python
详解Python 函数参数的拆解
2020/09/02 Python
新西兰便宜隐形眼镜购买网站:QUICKLENS New Zealand
2019/03/02 全球购物
linux面试题参考答案(8)
2016/04/19 面试题
加强干部作风建设整改方案
2014/10/24 职场文书
复兴之路观后感
2015/06/02 职场文书
自书遗嘱范文
2015/08/07 职场文书
一道JS算法面试题——冒泡、选择排序
2021/04/21 Javascript
OpenCV-Python实现轮廓拟合
2021/06/08 Python
python数字类型和占位符详情
2022/03/13 Python