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实现的Google IP 可用性检测脚本
Apr 23 Python
浅谈Python中列表生成式和生成器的区别
Aug 03 Python
Python的Django框架中使用SQLAlchemy操作数据库的教程
Jun 02 Python
python编写Logistic逻辑回归
Dec 30 Python
Python遍历某目录下的所有文件夹与文件路径
Mar 15 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
Mar 19 Python
Python 实现字符串中指定位置插入一个字符
May 02 Python
python破解zip加密文件的方法
May 31 Python
python找出完数的方法
Nov 12 Python
对dataframe数据之间求补集的实例详解
Jan 30 Python
python multiprocessing模块用法及原理介绍
Aug 20 Python
python使用布隆过滤器的实现示例
Aug 20 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
匹配csdn用户数据库与官方用户的重合度并将重叠部分的用户筛选出来
2011/12/25 PHP
php安全配置记录和常见错误梳理(总结)
2017/03/28 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
PHP微信H5支付开发实例
2018/07/25 PHP
php实现的rc4加密解密类定义与用法示例
2018/08/16 PHP
让innerHTML的脚本也可以运行起来
2006/07/01 Javascript
js 动态添加标签(新增一行,其实很简单,就是几个函数的应用)
2009/03/26 Javascript
在Windows上安装Node.js模块的方法
2011/09/25 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
JavaScript设计模式之外观模式介绍
2014/12/28 Javascript
JS截取与分割字符串常用技巧总结
2015/11/10 Javascript
javascript实现数组去重的多种方法
2016/03/14 Javascript
基于WebUploader的文件上传js插件
2016/08/19 Javascript
简单实现JavaScript图片切换效果
2016/11/28 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
2020/08/27 Javascript
Vue自定义指令详解
2017/07/28 Javascript
webpack多入口文件页面打包配置详解
2018/01/09 Javascript
angularJs提交文本框数据到后台的方法
2018/10/08 Javascript
Python中暂存上传图片的方法
2015/02/18 Python
对Python random模块打乱数组顺序的实例讲解
2018/11/08 Python
python-tkinter之按钮的使用,开关方法
2019/06/11 Python
python多继承(钻石继承)问题和解决方法简单示例
2019/10/21 Python
pytorch 常用函数 max ,eq说明
2020/06/28 Python
微软开源最强Python自动化神器Playwright(不用写一行代码)
2021/01/05 Python
AmazeUI底部导航栏与分享按钮的示例代码
2020/08/18 HTML / CSS
Shoes For Crews法国官网:美国领先的防滑鞋设计和制造商
2018/01/01 全球购物
Hanro官网:奢华男士和女士内衣、睡衣和家居服
2018/10/25 全球购物
市场营销专业推荐信
2013/11/03 职场文书
集团薪酬管理制度
2014/01/13 职场文书
秘书英文求职信
2014/04/16 职场文书
2014年大学生党员评议表自我评价
2014/09/20 职场文书
社会治安综合治理责任书
2015/01/29 职场文书
城管个人总结
2015/02/28 职场文书
python调试工具Birdseye的使用教程
2021/05/25 Python
springboot layui hutool Excel导入的实现
2022/03/31 Java/Android
zabbix 代理服务器的部署与 zabbix-snmp 监控问题
2022/07/15 Servers