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中异常重试的解决方案详解
May 05 Python
Python异常处理操作实例详解
May 10 Python
python内置数据类型之列表操作
Nov 12 Python
python实现将汉字保存成文本的方法
Nov 16 Python
python使用adbapi实现MySQL数据库的异步存储
Mar 19 Python
在OpenCV里使用特征匹配和单映射变换的代码详解
Oct 23 Python
python实现图片二值化及灰度处理方式
Dec 07 Python
Python实现线性判别分析(LDA)的MATLAB方式
Dec 09 Python
python主线程与子线程的结束顺序实例解析
Dec 17 Python
基于Python执行dos命令并获取输出的结果
Dec 30 Python
python 给图像添加透明度(alpha通道)
Apr 09 Python
python中可以声明变量类型吗
Jun 18 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
PHP4 与 MySQL 数据库操作函数详解
2006/12/06 PHP
jQuery+CSS 实现的超Sexy下拉菜单
2010/01/17 Javascript
Json字符串转换为JS对象的高效方法实例
2013/05/01 Javascript
随鼠标上下滚动的jquery代码
2013/12/05 Javascript
jquery自动填充勾选框即把勾选框打上true
2014/03/24 Javascript
JS中判断null、undefined与NaN的方法
2014/03/26 Javascript
基于jquery实现导航菜单高亮显示(两种方法)
2015/08/23 Javascript
分类解析jQuery选择器
2016/11/23 Javascript
javascript 中的try catch应用总结
2017/04/01 Javascript
Angular2自定义分页组件
2017/04/19 Javascript
基于js的变量提升和函数提升(详解)
2017/09/17 Javascript
vue2手机APP项目添加开屏广告或者闪屏广告
2017/11/28 Javascript
浅析vue给不同环境配置不同打包命令
2018/08/17 Javascript
vue实现滑动到底部加载更多效果
2020/10/27 Javascript
简述ES6新增关键字let与var的区别
2019/08/23 Javascript
javascript实现简易数码时钟
2020/03/30 Javascript
jQuery cookie的公共方法封装和使用示例
2020/06/01 jQuery
Python操作Excel之xlsx文件
2017/03/24 Python
python爬虫正则表达式之处理换行符
2018/06/08 Python
Python3爬虫爬取英雄联盟高清桌面壁纸功能示例【基于Scrapy框架】
2018/12/05 Python
详解从Django Rest Framework响应中删除空字段
2019/01/11 Python
python原类、类的创建过程与方法详解
2019/07/19 Python
matplotlib 多个图像共用一个colorbar的实现示例
2020/09/10 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
2021/02/07 Python
使用CSS3和Checkbox实现JQuery的一些效果
2015/08/03 HTML / CSS
德国大型的家具商店:Pharao24.de
2016/10/02 全球购物
英国一家集合了众多有才华设计师品牌的奢侈店:Wolf & Badger
2018/04/18 全球购物
护理自荐信范文
2013/10/05 职场文书
中学实习教师自我鉴定
2013/12/12 职场文书
继电保护工岗位职责
2014/01/05 职场文书
施工员岗位职责
2014/03/16 职场文书
2014年人事行政工作总结
2014/12/03 职场文书
2016年暑假家长对孩子评语
2015/12/01 职场文书
Oracle11g R2 安装教程完整版
2021/06/04 Oracle
mysql主从复制的实现步骤
2021/10/24 MySQL
Java无向树分析 实现最小高度树
2022/04/09 Javascript