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读写ini文件示例(python读写文件)
Mar 25 Python
简单介绍Python中的floor()方法
May 15 Python
python 使用re.search()筛选后 选取部分结果的方法
Nov 28 Python
Python简单过滤字母和数字的方法小结
Jan 09 Python
利用ctypes获取numpy数组的指针方法
Feb 12 Python
Django使用redis缓存服务器的实现代码示例
Apr 28 Python
Python自动化之数据驱动让你的脚本简洁10倍【推荐】
Jun 04 Python
python 动态绘制爱心的示例
Sep 27 Python
在Python中实现字典反转案例
Dec 05 Python
Django给表单添加honeypot验证增加安全性
May 06 Python
Python 用户输入和while循环的操作
May 23 Python
一文搞懂Python Sklearn库使用
Aug 23 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 读取文件内容代码(txt,js等)
2009/12/06 PHP
PHP开发需要注意的安全问题
2010/09/01 PHP
PHP实现的简单适配器模式示例
2017/06/22 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
Yii框架应用组件用法实例分析
2020/05/15 PHP
被jQuery折腾得半死,揭秘为何jQuery为何在IE/Firefox下均无法使用
2010/01/22 Javascript
JavaScript 获取当前时间戳的代码
2010/08/05 Javascript
Vue.js自定义事件的表单输入组件方法
2018/03/08 Javascript
微信小程序扫描二维码获取信息实例详解
2019/05/07 Javascript
解决layui表格的表头不滚动的问题
2019/09/04 Javascript
vue-router之实现导航切换过渡动画效果
2019/10/31 Javascript
javascript中的offsetWidth、clientWidth、innerWidth及相关属性方法
2020/05/14 Javascript
解决VUE自定义拖拽指令时 onmouseup 与 click事件冲突问题
2020/07/24 Javascript
python实现博客文章爬虫示例
2014/02/26 Python
Python的Django框架中的Context使用
2015/07/15 Python
python实现字典(dict)和字符串(string)的相互转换方法
2017/03/01 Python
python leetcode 字符串相乘实例详解
2018/09/03 Python
PyQt5实现简易计算器
2020/05/30 Python
十行代码使用Python写一个USB病毒
2019/06/21 Python
Python实现隐马尔可夫模型的前向后向算法的示例代码
2019/12/31 Python
Matplotlib scatter绘制散点图的方法实现
2020/01/02 Python
解决keras backend 越跑越慢问题
2020/06/18 Python
Pytorch框架实现mnist手写库识别(与tensorflow对比)
2020/07/20 Python
HTML5 Canvas锯齿图代码实例
2014/04/10 HTML / CSS
美国餐厅用品和厨房设备批发网站:KaTom Restaurant Supply
2018/01/27 全球购物
伦敦一卡通:The London Pass
2018/11/30 全球购物
财务学生的职业生涯发展
2014/02/11 职场文书
手工社团活动方案
2014/02/17 职场文书
教育技术学专业职业规划书
2014/03/03 职场文书
2014新课程改革心得体会
2014/03/10 职场文书
社区活动总结
2015/02/04 职场文书
升职自我推荐信范文
2015/03/25 职场文书
2015年房地产个人工作总结
2015/05/26 职场文书
2016应届毕业生实习评语
2015/12/01 职场文书
Nginx性能优化之Gzip压缩设置详解(最大程度提高页面打开速度)
2022/02/12 Servers
SQL Server查询某个字段在哪些表中存在
2022/03/03 SQL Server