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抓taobao图片爬虫
Oct 26 Python
深入理解Python中range和xrange的区别
Nov 26 Python
python 3.6 tkinter+urllib+json实现火车车次信息查询功能
Dec 20 Python
Python中循环引用(import)失败的解决方法
Apr 22 Python
python操作excel文件并输出txt文件的实例
Jul 10 Python
Python HTML解析器BeautifulSoup用法实例详解【爬虫解析器】
Apr 05 Python
Python使用统计函数绘制简单图形实例代码
May 15 Python
利用selenium爬虫抓取数据的基础教程
Jun 10 Python
python实现两个文件夹的同步
Aug 29 Python
python进程池实现的多进程文件夹copy器完整示例
Nov 27 Python
Python Tornado批量上传图片并显示功能
Mar 26 Python
Python中正则表达式对单个字符,多个字符和匹配边界等使用
Jan 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
动态网站web开发 PHP、ASP还是ASP.NET
2006/10/09 PHP
十天学会php之第九天
2006/10/09 PHP
PHP中$_SERVER的详细参数与说明
2008/07/29 PHP
Wordpress php 分页代码
2009/10/21 PHP
PHP验证码类代码( 最新修改,完全定制化! )
2010/12/02 PHP
php面向对象中的魔术方法中文说明
2014/03/04 PHP
js基于qrcode.js生成二维码的方法【附demo插件源码下载】
2016/12/28 PHP
php数组实现根据某个键值将相同键值合并生成新二维数组的方法
2017/04/26 PHP
asp批量修改记录的代码
2008/06/25 Javascript
utf-8编码引起js输出中文乱码的解决办法
2010/06/23 Javascript
js实现屏幕自适应局部代码分享
2015/01/30 Javascript
解决JavaScript数字精度丢失问题的方法
2015/12/03 Javascript
实例讲解javascript实现异步图片上传方法
2017/12/05 Javascript
解决JSON.stringify()自动将中文转译成unicode的问题
2018/01/05 Javascript
微信小程序中weui用法解析
2019/10/21 Javascript
2019最新21个MySQL高频面试题介绍
2020/02/06 Javascript
Node.js API详解之 tty功能与用法实例分析
2020/04/27 Javascript
vue 修改 data 数据问题并实时显示操作
2020/09/07 Javascript
vue 封装面包屑组件教程
2020/11/16 Javascript
Django实战之用户认证(用户登录与注销)
2018/07/16 Python
使用python实现unix2dos和dos2unix命令的例子
2019/08/13 Python
Python startswith()和endswith() 方法原理解析
2020/04/28 Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
2020/10/15 Python
英国家居装饰品、户外家具和玻璃器皿购物网站:Rinkit.com
2019/11/04 全球购物
LUISAVIAROMA中国官网:时尚奢侈品牌购物网站
2020/11/01 全球购物
自我评价正确写法范文
2013/12/10 职场文书
迎接领导欢迎词
2014/01/11 职场文书
个人授权委托书格式
2014/08/30 职场文书
工程技术负责人岗位职责
2015/04/13 职场文书
党员承诺书范文2015
2015/04/27 职场文书
2015年“我们的节日·重阳节”活动总结
2015/07/29 职场文书
职场新人刚入职工作总结该怎么写?
2019/05/15 职场文书
php字符串倒叙
2021/04/01 PHP
Nginx四层负载均衡的配置指南
2021/06/11 Servers
JavaScript实现栈结构详细过程
2021/12/06 Javascript
如何通过cmd 连接阿里云服务器
2022/04/18 Servers