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实现360的字符显示界面
Feb 21 Python
Python函数参数类型*、**的区别
Apr 11 Python
用Python的Tornado框架结合memcached页面改善博客性能
Apr 24 Python
python使用wxPython打开并播放wav文件的方法
Apr 24 Python
python操作 hbase 数据的方法
Dec 18 Python
Python并发:多线程与多进程的详解
Jan 24 Python
Python判断两个文件是否相同与两个文本进行相同项筛选的方法
Mar 01 Python
使用python实现mqtt的发布和订阅
May 05 Python
python通过http下载文件的方法详解
Jul 26 Python
Pycharm小白级简单使用教程
Jan 08 Python
python itsdangerous模块的具体使用方法
Feb 17 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
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 实例化类的一点摘记
2008/03/23 PHP
php用header函数实现301跳转代码实例
2013/11/25 PHP
php Imagick获取图片RGB颜色值
2014/07/28 PHP
示例详解Laravel重置密码代码重构
2016/08/10 PHP
PHP获取中国时间(上海时区时间)及美国时间的方法
2017/02/23 PHP
php实现微信模拟登陆、获取用户列表及群发消息功能示例
2017/06/28 PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
2019/07/09 PHP
PHP安装扩展mcrypt以及相关依赖项深入讲解
2021/03/04 PHP
javascript vvorld 在线加密破解方法
2008/11/13 Javascript
javascript实现的网页局布刷新效果
2008/12/01 Javascript
JS阻止用户多次提交示例代码
2014/03/26 Javascript
JavaScript模拟可展开、拖动与关闭的聊天窗口实例
2015/05/12 Javascript
详解JavaScript中getFullYear()方法的使用
2015/06/10 Javascript
jquery实现可自动判断位置的弹出层效果代码
2015/10/12 Javascript
javascript实现3D切换焦点图
2015/10/16 Javascript
谷歌showModalDialog()方法不兼容出现对话窗口的解决办法
2016/02/15 Javascript
js获取鼠标点击的对象,点击另一个按钮删除该对象的实现代码
2016/05/13 Javascript
Vue-cli proxyTable 解决开发环境的跨域问题详解
2017/05/18 Javascript
AngularJS基于provider实现全局变量的读取和赋值方法
2017/06/28 Javascript
gulp构建小程序的方法步骤
2019/05/31 Javascript
使用Vue-cli3.0创建的项目 如何发布npm包
2019/10/10 Javascript
python自定义解析简单xml格式文件的方法
2015/05/11 Python
Python实现抢购IPhone手机
2018/02/07 Python
flask入门之表单的实现
2018/07/18 Python
Python常见数据结构之栈与队列用法示例
2019/01/14 Python
对Python中的条件判断、循环以及循环的终止方法详解
2019/02/08 Python
Python猴子补丁知识点总结
2020/01/05 Python
利用python3筛选excel中特定的行(行值满足某个条件/行值属于某个集合)
2020/09/04 Python
Selenium 安装和简单使用的实现
2020/12/04 Python
Yves Rocher捷克官方网站:植物化妆品的创造者
2019/07/31 全球购物
Electric官网:美国高级眼镜和配件品牌
2020/06/04 全球购物
安全在我心中演讲稿
2014/09/01 职场文书
科长个人四风问题整改措施思想汇报
2014/10/13 职场文书
领导工作表现评语
2015/01/04 职场文书
《静夜思》教学反思
2016/02/17 职场文书
日本官方排名前10的动漫,名侦探柯南上榜,第一是一部创造历史的动漫
2022/03/18 日漫