python数据结构之图深度优先和广度优先实例详解
作者:yupeng 发布时间:2023-05-18 20:50:15
标签:python,数据结构
本文实例讲述了python数据结构之图深度优先和广度优先用法。分享给大家供大家参考。具体如下:
首先有一个概念:回溯
回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
深度优先算法:
(1)访问初始顶点v并标记顶点v已访问。
(2)查找顶点v的第一个邻接顶点w。
(3)若顶点v的邻接顶点w存在,则继续执行;否则回溯到v,再找v的另外一个未访问过的邻接点。
(4)若顶点w尚未被访问,则访问顶点w并标记顶点w为已访问。
(5)继续查找顶点w的下一个邻接顶点wi,如果v取值wi转到步骤(3)。直到连通图中所有顶点全部访问过为止。
广度优先算法:
(1)顶点v入队列。
(2)当队列非空时则继续执行,否则算法结束。
(3)出队列取得队头顶点v;访问顶点v并标记顶点v已被访问。
(4)查找顶点v的第一个邻接顶点col。
(5)若v的邻接顶点col未被访问过的,则col入队列。
(6)继续查找顶点v的另一个新的邻接顶点col,转到步骤(5)。直到顶点v的所有未被访问过的邻接点处理完。转到步骤(2)。
代码:
#!/usr/bin/python
# -*- coding: utf-8 -*-
class Graph(object):
def __init__(self,*args,**kwargs):
self.node_neighbors = {}
self.visited = {}
def add_nodes(self,nodelist):
for node in nodelist:
self.add_node(node)
def add_node(self,node):
if not node in self.nodes():
self.node_neighbors[node] = []
def add_edge(self,edge):
u,v = edge
if(v not in self.node_neighbors[u]) and ( u not in self.node_neighbors[v]):
self.node_neighbors[u].append(v)
if(u!=v):
self.node_neighbors[v].append(u)
def nodes(self):
return self.node_neighbors.keys()
def depth_first_search(self,root=None):
order = []
def dfs(node):
self.visited[node] = True
order.append(node)
for n in self.node_neighbors[node]:
if not n in self.visited:
dfs(n)
if root:
dfs(root)
for node in self.nodes():
if not node in self.visited:
dfs(node)
print order
return order
def breadth_first_search(self,root=None):
queue = []
order = []
def bfs():
while len(queue)> 0:
node = queue.pop(0)
self.visited[node] = True
for n in self.node_neighbors[node]:
if (not n in self.visited) and (not n in queue):
queue.append(n)
order.append(n)
if root:
queue.append(root)
order.append(root)
bfs()
for node in self.nodes():
if not node in self.visited:
queue.append(node)
order.append(node)
bfs()
print order
return order
if __name__ == '__main__':
g = Graph()
g.add_nodes([i+1 for i in range(8)])
g.add_edge((1, 2))
g.add_edge((1, 3))
g.add_edge((2, 4))
g.add_edge((2, 5))
g.add_edge((4, 8))
g.add_edge((5, 8))
g.add_edge((3, 6))
g.add_edge((3, 7))
g.add_edge((6, 7))
print "nodes:", g.nodes()
order = g.breadth_first_search(1)
order = g.depth_first_search(1)
结果:
nodes: [1, 2, 3, 4, 5, 6, 7, 8]
广度优先:
[1, 2, 3, 4, 5, 6, 7, 8]
深度优先:
[1, 2, 4, 8, 5, 3, 6, 7]
希望本文所述对大家的Python程序设计有所帮助。


猜你喜欢
- 如果值没有重复的情况,可以先用array_flip()来交换键和值,然后krsort(),最后再array_flip()交换回来,就可以比较
- window.opener 的用法 window.opener 返回的是创建当前窗口的那个窗口的引用,比如点击了a.htm上的一
- 本文实例讲述了Python实现从URL地址提取文件名的方法。分享给大家供大家参考。具体分析如下:如:地址为 https://www.jb51
- 问题:每次打开pycharm打开py文件光标都是insert模式, 像下面图片那样解决方案:讲Tools里面的Vim Emulator勾选去
- 一、简介Imageio是一个Python库,提供了一个简单的界面来读取和写入各种图像数据,包括动画图像,视频,体积数据和科学格式。它是跨平台
- Yahoo!的Exceptional Performance团队为改善Web性能带来最佳实践。他们为此进行了一系列的实验、开发了
- 但灵活应用CSS会有给人眼前一亮的感觉! 以下用一个简单的例子来阐述我想说的。 CSS代码: #nav li ul { display:no
- FileSystemObject、Folder 和 File 对象的一些方法都与通过 TextStream 对象创建、读取或写入文件有关。虽
- 最近在OpenCV-Python接口中使用cv2.findContours()函数来查找检测物体的轮廓。根据网上的 教程,Python&nb
- 今天给大家分享一下最新版阿里大于的短信验证码在node koa2的实现,还是有很多坑需要注意。首先需要在阿里云注册账号,并获取阿里云访问秘钥
- 前言最近使用Python解析IDX文件格式的MNIST数据集,需要对二进制文件进行读取操作,其中我使用的是struct模块。查了网上挺多教程
- OpenCV的作用及安装OpenCV简介OpenCV是一个开源的跨平台计算机视觉库,可以运行在Linux、Windows、Android和M
- Python自动化测试 Eclipse+Pydev 搭建开发环境C#之所以容易让人感兴趣,是因为安装完Visual Studio, 就可以很
- 偶尔会在python中看见这样一行代码:data = [x**2 for x in range(0, 5)]# 此时data = [0, 1
- 本文实例为大家分享了Python使用Pygame绘制时钟的具体代码,供大家参考,具体内容如下前提条件:需要安装pygame功能:1.初始化界
- 做一个简单的小实例:目录结构如下:demo1.pyclass MyClass():def __init__(self,x,y):  
- 1. 获取abi文件合约的接口在remix工具中编译合约后,会有一个abi,复制然后新建一个xx.abi文件,把赋值的粘贴到里面注意:代码变
- 页面加载loading效果, 这个挺好玩的!用setTimeout实现的!可以和服务端整合弄一些生成HTML或者上传文件等应用!
- 下面进行一个高维线性实验假设我们的真实方程是:假设feature数200,训练样本和测试样本各20个模拟数据集num_train,num_t
- 一直不用这个phpmyadmin,在本机也是用navicat,总感觉phpmyadmin速度较慢。这回不行了,没有独立主机,只好用人家给的p