Python数据结构与算法之图结构(Graph)实例分析


Posted in Python onSeptember 05, 2017

本文实例讲述了Python数据结构与算法之图结构(Graph)。分享给大家供大家参考,具体如下:

图结构(Graph)——算法学中最强大的框架之一。树结构只是图的一种特殊情况。

如果我们可将自己的工作诠释成一个图问题的话,那么该问题至少已经接近解决方案了。而我们我们的问题实例可以用树结构(tree)来诠释,那么我们基本上已经拥有了一个真正有效的解决方案了。

邻接表及加权邻接字典

对于图结构的实现来说,最直观的方式之一就是使用邻接列表。基本上就是针对每个节点设置一个邻接列表。下面我们来实现一个最简单的:假设我们现有 n 个节点,编号分别为 0, …, n-1.

节点当然可以是任何对象,可被赋予任何标签或名称。但使用 0, …, n-1 区间内的整数来实现的话,会简单许多。因为如果我们能用数字来代表节点,我们索引起来显然要方便许多。

然后,每个邻接(邻居)列表都只是一个数字列表,我们可以将它们编入一个大小为 n 的主列表,并用节点编号对其进行索引。由于这些列表内的节点的顺序是任意的,所以,实际上,我们是使用列表来实现邻接集(adjacency sets)。这里之所以还是使用列表这个术语,主要是因为传统。幸运的是,Python 本身就提供独立的 set 类型。

我们以下图为例,说明图结构的各种表示方法当我们在执行与图相关的工作时,需要反复遵从一个主题思想,即一个图的最佳表示方法应该取决于我们要用它来做什么):

Python数据结构与算法之图结构(Graph)实例分析

a, b, c, d, e, f, g, h = range(8)
N = [
  {b, c, d, e, f},
  {c, e},
  {d},
  {e},
  {f},
  {c, g, h},
  {f, h},
  {f, g}
]

在图论中,N(v) 代表的是 v 的邻居节点集

>>> b in N[a]         # neighborhood membership
True
>>> len(N[f])         # out-degree:出度
3

加权邻接字典

使用 dict 类型来代替 set 或 list 来表示邻接集。在 dict 类型中,每个邻居节点都会有一个键和一个额外的值,用于表示与其邻居节点(或出边)之间的关联性,如边的权重。

a, b, c, d, e, f, g, h = range(8)
N = [
  {b:2, c:1, d:3, e:9, f:4},
  {c:4, e:4},
  {d:8},
  {e:7},
  {f:5},
  {c:2, g:2, h:2},
  {f:1, h:6},
  {f:9, g:8}
]

客户端调用:

>>> b in N[a]         # neighborhood membership
True
>>> len(N[f])         # out-degree
3
>>> N[a][b]          # Edge weight for (a, b)
2

邻接矩阵

邻接矩阵是图的另一种表示方法,这种表示方法的主要不同在于,它不再列出每个节点的所有邻居节点。

a, b, c, d, e, f, g, h = range(8)
N =[
  [0, 1, 1, 1, 1, 1, 0, 0],
  [0, 0, 1, 0, 1, 0, 0, 0],
  [0, 0, 0, 1, 0, 0, 0, 0],
  [0, 0, 0, 0, 1, 0, 0, 0],
  [0, 0, 0, 0, 0, 1, 0, 0],
  [0, 0, 1, 0, 0, 0, 1, 1],
  [0, 0, 0, 0, 0, 1, 0, 1],
  [0, 0, 0, 0, 0, 1, 1, 0],
]

关于邻接矩阵:

(1)主对角线为自己到自己,为0
(2)行和为出度
(3)列和为入度

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python入门及进阶笔记 Python 内置函数小结
Aug 09 Python
python人人网登录应用实例
Sep 26 Python
python简单读取大文件的方法
Jul 01 Python
用python结合jieba和wordcloud实现词云效果
Sep 05 Python
解决Python print 输出文本显示 gbk 编码错误问题
Jul 13 Python
Python函数中不定长参数的写法
Feb 13 Python
在django admin中添加自定义视图的例子
Jul 26 Python
基于 Django 的手机管理系统实现过程详解
Aug 16 Python
Python3 requests文件下载 期间显示文件信息和下载进度代码实例
Aug 16 Python
Python面向对象原理与基础语法详解
Jan 02 Python
PyCharm刷新项目(文件)目录的实现
Feb 14 Python
Golang Web 框架Iris安装部署
Aug 14 Python
利用Python将时间或时间间隔转为ISO 8601格式方法示例
Sep 05 #Python
python进程管理工具supervisor的安装与使用教程
Sep 05 #Python
基于Django模板中的数字自增(详解)
Sep 05 #Python
用python结合jieba和wordcloud实现词云效果
Sep 05 #Python
python基础_文件操作实现全文或单行替换的方法
Sep 04 #Python
python 生成器协程运算实例
Sep 04 #Python
python 文件操作删除某行的实例
Sep 04 #Python
You might like
德劲1104的电路分析与改良
2021/03/01 无线电
献给php初学者(入门学习经验谈)
2010/10/12 PHP
php的4种常见运行方式
2015/03/20 PHP
php动态生成版权所有信息的方法
2015/03/24 PHP
php随机显示指定文件夹下图片的方法
2015/07/13 PHP
Array.slice()与Array.splice()的返回值类型
2006/10/09 Javascript
节点的插入之append()和appendTo()的用法介绍
2014/01/13 Javascript
js判断手机端(Android手机还是iPhone手机)
2015/07/22 Javascript
js判断浏览器类型及设备(移动页面开发)
2015/07/30 Javascript
JavaScript制作颜色反转小游戏
2016/09/25 Javascript
前端分页功能的实现以及原理(jQuery)
2017/01/22 Javascript
原生javascript上传图片带进度条【实例分享】
2017/04/06 Javascript
JSON的parse()方法介绍
2019/01/31 Javascript
js canvas实现5张图片合成一张图片
2019/07/15 Javascript
javascript写一个ajax自动拦截并下载数据代码实例
2019/09/07 Javascript
基于python中的TCP及UDP(详解)
2017/11/06 Python
Python利用multiprocessing实现最简单的分布式作业调度系统实例
2017/11/14 Python
Python使用Turtle模块绘制五星红旗代码示例
2017/12/11 Python
python爬虫之模拟登陆csdn的实例代码
2018/05/18 Python
详解Django的model查询操作与查询性能优化
2018/10/16 Python
深入了解和应用Python 装饰器 @decorator
2019/04/02 Python
python获取地震信息 微信实时推送
2019/06/18 Python
浅析pandas 数据结构中的DataFrame
2019/10/12 Python
python3 实现调用串口功能
2019/12/26 Python
Dockers美国官方网站:卡其裤、男士服装、鞋及配件
2016/11/22 全球购物
欧舒丹澳洲版:L’OCCITANE
2017/07/17 全球购物
财务会计应届生求职信
2013/11/24 职场文书
淘宝客服自我总结鉴定
2014/01/25 职场文书
培训主管岗位职责
2014/02/01 职场文书
房地产财务管理制度
2014/02/02 职场文书
学校教师读书活动总结
2014/07/08 职场文书
党的群众路线对照检查材料范文
2014/09/24 职场文书
市场总监岗位职责
2015/02/11 职场文书
2015年派出所民警工作总结
2015/04/24 职场文书
我对PyTorch dataloader里的shuffle=True的理解
2021/05/20 Python
MySQL如何解决幻读问题
2021/08/07 MySQL