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 命令行也可以自动补全
Nov 30 Python
python基于右递归解决八皇后问题的方法
May 25 Python
Python的Flask框架应用调用Redis队列数据的方法
Jun 06 Python
itchat和matplotlib的结合使用爬取微信信息的实例
Aug 25 Python
Python with语句上下文管理器两种实现方法分析
Feb 09 Python
转换科学计数法的数值字符串为decimal类型的方法
Jul 16 Python
Django中使用Celery的方法示例
Nov 29 Python
梅尔倒谱系数(MFCC)实现
Jun 19 Python
django云端留言板实例详解
Jul 22 Python
应用OpenCV和Python进行SIFT算法的实现详解
Aug 21 Python
Python创建一个元素都为0的列表实例
Nov 28 Python
python标准库os库的函数介绍
Feb 12 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 UTF-8、Unicode和BOM问题
2010/05/18 PHP
joomla内置的表单验证功能使用方法
2010/06/11 PHP
php中防止伪造跨站请求的小招式
2011/09/02 PHP
PHP5.6读写excel表格文件操作示例
2019/02/26 PHP
用js脚本控制asp.net下treeview的NodeCheck的实现代码
2010/03/02 Javascript
禁止页面刷新让F5快捷键及右键都无效
2014/01/22 Javascript
跟我学习javascript的严格模式
2015/11/16 Javascript
jq实现左滑显示删除按钮,点击删除实现删除数据功能(推荐)
2016/08/23 Javascript
JS实现的RGB网页颜色在线取色器完整实例
2016/12/21 Javascript
Bootstrap table右键功能实现方法
2017/02/20 Javascript
解决微信小程序防止无法回到主页的问题
2018/09/28 Javascript
JavaScript函数定义方法实例详解
2019/03/05 Javascript
AngularJS实现的鼠标拖动画矩形框示例【可兼容IE8】
2019/05/17 Javascript
[01:28]2014DOTA2国际邀请赛中国区预选赛四大豪门直升机抵达会场
2014/05/24 DOTA
[05:09]2016国际邀请赛中国区预选赛淘汰赛首日精彩回顾
2016/06/29 DOTA
python基础教程之序列详解
2014/08/29 Python
Python的collections模块中namedtuple结构使用示例
2016/07/07 Python
Django ORM框架的定时任务如何使用详解
2017/10/19 Python
Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
2018/03/22 Python
Python使用ConfigParser模块操作配置文件的方法
2018/06/29 Python
python入门:这篇文章带你直接学会python
2018/09/14 Python
浅谈Python接口对json串的处理方法
2018/12/19 Python
关于 Python opencv 使用中的 ValueError: too many values to unpack
2019/06/28 Python
python 实现手机自动拨打电话的方法(通话压力测试)
2019/08/08 Python
Python实现把多维数组展开成DataFrame
2019/11/30 Python
kafka监控获取指定topic的消息总量示例
2019/12/23 Python
Python-jenkins模块获取jobs的执行状态操作
2020/05/12 Python
eBay加拿大站:eBay.ca
2019/06/20 全球购物
力学专业毕业生自荐信
2013/11/17 职场文书
优秀信贷员先进事迹
2014/01/31 职场文书
优秀团干部个人事迹
2014/05/29 职场文书
擅自离岗检讨书
2014/09/12 职场文书
师德师风自查材料
2014/10/14 职场文书
2015应届毕业生求职信范文
2015/03/20 职场文书
小学班主任工作随笔
2015/08/15 职场文书
NASA 机智号火星直升机拍到了毅力号设备碎片
2022/04/29 数码科技