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检测网页是否有日常链接
Jun 03 Python
使用Python的PEAK来适配协议的教程
Apr 14 Python
python求解水仙花数的方法
May 11 Python
详解Python中where()函数的用法
Mar 27 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
Apr 22 Python
python批量修改文件编码格式的方法
May 31 Python
python求最大连续子数组的和
Jul 07 Python
Pycharm无法显示动态图片的解决方法
Oct 28 Python
Python数据类型之Tuple元组实例详解
May 08 Python
python中bs4.BeautifulSoup的基本用法
Jul 27 Python
利用Python如何画一颗心、小人发射爱心
Feb 21 Python
据Python爬虫不靠谱预测可知今年双十一销售额将超过6000亿元
Nov 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
php 引用(&)详解
2009/11/20 PHP
用Php编写注册后Email激活验证的实例代码
2013/03/11 PHP
YII框架批量插入数据的方法
2017/03/18 PHP
浅谈PHP表单提交(POST&GET&URL编/解码)
2017/04/03 PHP
FireFox JavaScript全局Event对象
2009/06/14 Javascript
JavaScript 事件对象的实现
2009/07/13 Javascript
提高网站性能之 如何对待JavaScript
2009/10/31 Javascript
Js从头学起(基本数据类型和引用类型的参数传递详细分析)
2012/02/16 Javascript
javascript 全选与全取消功能的实现代码
2012/12/23 Javascript
js+html5获取用户地理位置信息并在Google地图上显示的方法
2015/06/05 Javascript
jQuery实用技巧必备(上)
2015/11/02 Javascript
微信小程序 后台https域名绑定和免费的https证书申请详解
2016/11/10 Javascript
three.js中文文档学习之如何本地运行详解
2017/11/20 Javascript
一篇文章,教你学会Vue CLI 插件开发
2019/04/17 Javascript
vue-cli3使用 DllPlugin 实现预编译提升构建速度
2019/04/24 Javascript
vue 搭建后台系统模块化开发详解
2019/05/01 Javascript
判断js数据类型的函数实例详解
2019/05/23 Javascript
Node.js 的 GC 机制详解
2019/06/03 Javascript
layer弹窗在键盘按回车将反复刷新的实现方法
2019/09/25 Javascript
JavaScript生成随机验证码代码实例
2019/09/28 Javascript
Python中给List添加元素的4种方法分享
2014/11/28 Python
Python中的集合类型知识讲解
2015/08/19 Python
Python寻找两个有序数组的中位数实例详解
2018/12/05 Python
python机器人运动范围问题的解答
2019/04/29 Python
Python 生成一个从0到n个数字的列表4种方法小结
2019/11/28 Python
Python scrapy增量爬取实例及实现过程解析
2019/12/24 Python
基于Python生成个性二维码过程详解
2020/03/05 Python
如何理解Python中的变量
2020/06/01 Python
python 识别登录验证码图片功能的实现代码(完整代码)
2020/07/03 Python
python3处理word文档实例分析
2020/12/01 Python
Omio荷兰:预订火车、巴士和机票
2018/11/04 全球购物
2015年医院护理部工作总结
2015/04/23 职场文书
工程项目合作意向书
2015/05/08 职场文书
小学记事作文之200字
2019/08/06 职场文书
Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案
2022/04/20 Python
Java+swing实现抖音上的表白程序详解
2022/06/25 Java/Android