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手机号码归属地查询代码
May 04 Python
Python利用itchat对微信中好友数据实现简单分析的方法
Nov 21 Python
Python实现感知器模型、两层神经网络
Dec 19 Python
Python中实现switch功能实例解析
Jan 11 Python
PyQt5每天必学之事件与信号
Apr 20 Python
对python判断是否回文数的实例详解
Feb 08 Python
我们为什么要减少Python中循环的使用
Jul 10 Python
python3 循环读取excel文件并写入json操作
Jul 14 Python
在 Python 中使用 MQTT的方法
Aug 18 Python
python如何设置静态变量
Sep 07 Python
Python中lru_cache的使用和实现详解
Jan 25 Python
基于Pygame实现简单的贪吃蛇游戏
Dec 06 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实现的常见排序算法汇总
2014/09/08 PHP
Zend Framework教程之Zend_Helpers动作助手ViewRenderer用法详解
2016/07/20 PHP
详解php中serialize()和unserialize()函数
2017/07/08 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
科讯商业版中用到的ajax空间与分页函数
2007/09/02 Javascript
学习ExtJS form布局
2009/10/08 Javascript
如何确保JavaScript的执行顺序 之jQuery.html并非万能钥匙
2011/03/03 Javascript
jQuery中eq()方法用法实例
2015/01/05 Javascript
JavaScript父子窗体间的调用方法
2015/03/31 Javascript
js数组的五种迭代方法及两种归并方法(推荐)
2016/06/14 Javascript
jQuery阻止移动端遮罩层后页面滚动
2017/03/15 Javascript
浅析Angular2子模块以及异步加载
2017/04/24 Javascript
vue系列之动态路由详解【原创】
2017/09/10 Javascript
详解如何在angular2中获取节点
2017/11/23 Javascript
IE8中jQuery.load()加载页面不显示的原因
2018/11/15 jQuery
微信小程序实现星级评价
2019/11/20 Javascript
vue cli 3.0通用打包配置代码,不分一二级目录
2020/09/02 Javascript
Eclipse + Python 的安装与配置流程
2013/03/05 Python
PyQt实现界面翻转切换效果
2018/04/20 Python
django认证系统实现自定义权限管理的方法
2018/07/16 Python
Django模板获取field的verbose_name实例
2020/05/19 Python
中国旅游网站:途牛旅游网
2019/09/29 全球购物
The Athlete’s Foot新西兰:新西兰最大的运动鞋零售商
2019/12/23 全球购物
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/11/24 面试题
语文教学感言
2014/02/06 职场文书
初中班主任寄语
2014/04/04 职场文书
合作经营协议书
2014/04/17 职场文书
优秀毕业生自荐信
2014/06/10 职场文书
高效课堂标语
2014/06/26 职场文书
帮一个朋友写的求职信
2014/08/09 职场文书
群众路线领导班子整改方案
2014/10/25 职场文书
长城导游词
2015/01/30 职场文书
Pytorch 使用tensor特定条件判断索引
2021/04/08 Python
厉害!这是Redis可视化工具最全的横向评测
2021/07/15 Redis
Python Matplotlib库实现画局部图
2021/11/17 Python