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爬虫教程之爬取百度贴吧并下载的示例
Mar 07 Python
python避免死锁方法实例分析
Jun 04 Python
Python正则获取、过滤或者替换HTML标签的方法
Jan 28 Python
玩转python爬虫之URLError异常处理
Feb 17 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
May 03 Python
终端命令查看TensorFlow版本号及路径的方法
Jun 13 Python
通过python实现随机交换礼物程序详解
Jul 10 Python
对Django中内置的User模型实例详解
Aug 16 Python
Python实现线性判别分析(LDA)的MATLAB方式
Dec 09 Python
Django数据结果集序列化并展示实现过程
Apr 22 Python
python二维图制作的实例代码
Dec 03 Python
python中xlrd模块的使用详解
Feb 01 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 mssql 分页SQL语句优化 持续影响
2009/04/26 PHP
7个超级实用的PHP代码片段
2011/07/11 PHP
php连接mssql数据库的几种方法
2013/02/21 PHP
自定义session存储机制避免会话保持问题
2014/10/08 PHP
yii2中的rules 自定义验证规则详解
2016/04/19 PHP
PHP中include和require的区别实例分析
2017/05/07 PHP
Laravel框架Eloquent ORM修改数据操作示例
2019/12/03 PHP
一实用的实现table排序的Javascript类库
2007/09/12 Javascript
jquery 查找新建元素代码
2010/07/06 Javascript
基于jquery实现等比缩放图片
2014/12/03 Javascript
jquery简单实现幻灯片的方法
2015/08/03 Javascript
js验证身份证号有效性并提示对应信息
2015/10/19 Javascript
原生js三级联动的简单实现代码
2016/06/07 Javascript
[js高手之路]单例模式实现模态框的示例
2017/09/01 Javascript
原生JS实现瀑布流插件
2018/02/06 Javascript
了解JavaScript函数中的默认参数
2019/05/30 Javascript
vue-cli+webpack项目打包到服务器后,ttf字体找不到的解决操作
2020/08/28 Javascript
JavaScript函数柯里化实现原理及过程
2020/12/02 Javascript
[01:38]2018DOTA2亚洲邀请赛主赛事第二日现场采访 神秘商人痛陈生计不易
2018/04/05 DOTA
python利用urllib和urllib2访问http的GET/POST详解
2017/09/27 Python
Python插件virtualenv搭建虚拟环境
2017/11/20 Python
Python中生成器和迭代器的区别详解
2018/02/10 Python
python实现对指定输入的字符串逆序输出的6种方法
2018/04/26 Python
Python文件循环写入行时防止覆盖的解决方法
2018/11/09 Python
python里的单引号和双引号的有什么作用
2020/06/17 Python
python Matplotlib模块的使用
2020/09/16 Python
美国求婚钻戒网站:Super Jeweler
2016/08/27 全球购物
波兰补充商店:Muscle Power
2018/10/29 全球购物
手工制作的男士奢华英国鞋和服装之家:Goodwin Smith
2019/06/21 全球购物
开办加工厂创业计划书
2014/01/03 职场文书
小区停车场管理制度
2014/01/27 职场文书
卫生巾广告词
2014/03/18 职场文书
党员干部廉洁承诺书
2014/05/28 职场文书
质检员工作总结2015
2015/04/25 职场文书
js Proxy的原理详解
2021/05/25 Javascript
Python答题卡识别并给出分数的实现代码
2021/06/22 Python