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字典数据对象拆分的简单实现方法
Dec 05 Python
浅谈python中对于json写入txt文件的编码问题
Jun 07 Python
解决python通过cx_Oracle模块连接Oracle乱码的问题
Oct 18 Python
Python中时间datetime的处理与转换用法总结
Feb 18 Python
python找出因数与质因数的方法
Jul 25 Python
PHP统计代码行数的小代码
Sep 19 Python
python实现tail实时查看服务器日志示例
Dec 24 Python
PyTorch和Keras计算模型参数的例子
Jan 02 Python
pytorch实现用CNN和LSTM对文本进行分类方式
Jan 08 Python
PyCharm取消波浪线、下划线和中划线的实现
Mar 03 Python
Django中使用Celery的方法步骤
Dec 07 Python
Python函数中的不定长参数相关知识总结
Jun 24 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
用Php实现链结人气统计
2006/10/09 PHP
php Sql Server连接失败问题及解决办法
2009/08/07 PHP
PHP无限分类代码,支持数组格式化、直接输出菜单两种方式
2011/05/18 PHP
linux系统下php安装mbstring扩展的二种方法
2014/01/20 PHP
Yii中使用PHPExcel导出Excel的方法
2014/12/26 PHP
smarty高级特性之对象的使用方法
2015/12/25 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
2016/12/27 PHP
js 代码集(学习js的朋友可以看下)
2009/07/22 Javascript
JS注释所产生的bug 即使注释也会执行
2013/11/19 Javascript
表单中单选框添加选项和移除选项
2016/07/04 Javascript
全面了解JavaScirpt 的垃圾(garbage collection)回收机制
2016/07/11 Javascript
Angularjs使用directive自定义指令实现attribute继承的方法详解
2016/08/05 Javascript
JavaScript鼠标特效大全
2016/09/13 Javascript
js控制li的隐藏和显示实例代码
2016/10/15 Javascript
为你的微信小程序体积瘦身详解
2017/05/20 Javascript
如何将 jQuery 从你的 Bootstrap 项目中移除(取而代之使用Vue.js)
2017/07/17 jQuery
Vue.set() this.$set()引发的视图更新思考及注意事项
2018/08/30 Javascript
详解微信小程序实现仿微信聊天界面(各种细节处理)
2019/02/17 Javascript
js DOM的事件常见操作实例详解
2019/12/16 Javascript
Python创建xml文件示例
2017/03/22 Python
django rest framework 数据的查找、过滤、排序的示例
2018/06/25 Python
基于pycharm导入模块显示不存在的解决方法
2018/10/13 Python
对python 匹配字符串开头和结尾的方法详解
2018/10/27 Python
Python实现深度遍历和广度遍历的方法
2019/01/22 Python
python简单的三元一次方程求解实例
2020/04/02 Python
Python如何设置指定窗口为前台活动窗口
2020/08/12 Python
Origins悦木之源英国官网:雅诗兰黛集团高端植物护肤品牌
2017/11/06 全球购物
Edwaybuy西班牙:小米在线商店
2019/12/04 全球购物
留学自荐信
2013/10/10 职场文书
自荐信如何“自荐”
2013/10/24 职场文书
外企财务年会演讲稿
2014/01/03 职场文书
建筑学专业自荐书
2014/07/09 职场文书
党员志愿者服务倡议书
2015/04/29 职场文书
总经理2015中秋节致辞
2015/07/29 职场文书
Django中的JWT身份验证的实现
2021/05/07 Python
Java 数组的使用
2022/05/11 Java/Android