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的装饰器模式与面向切面编程详解
Jun 21 Python
Python 列表排序方法reverse、sort、sorted详解
Jan 22 Python
Python while 循环使用的简单实例
Jun 08 Python
Python 搭建Web站点之Web服务器网关接口
Nov 06 Python
python在ubuntu中的几种安装方法(小结)
Dec 08 Python
python得到电脑的开机时间方法
Oct 15 Python
windows下 兼容Python2和Python3的解决方法
Dec 05 Python
selenium+PhantomJS爬取豆瓣读书
Aug 26 Python
python多线程扫描端口(线程池)
Sep 04 Python
python读取图片的几种方式及图像宽和高的存储顺序
Feb 11 Python
Python使用matplotlib绘制圆形代码实例
May 27 Python
使用python绘制横竖条形图
Apr 21 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/07/29 PHP
ThinkPHP打开验证码页面显示乱码的解决方法
2014/12/18 PHP
PHP随机数 C扩展随机数
2016/05/04 PHP
IE8 浏览器Cookie的处理
2009/01/31 Javascript
JavaScript DOM 添加事件
2009/02/14 Javascript
解决jquery异步按一定的时间间隔刷新问题
2012/12/10 Javascript
jquery选择器之层级过滤选择器详解
2014/01/27 Javascript
Jquery对select的增、删、改、查操作
2015/02/06 Javascript
freemarker判断对象是否为空的方法
2015/08/13 Javascript
利用JS实现数字增长
2016/07/28 Javascript
ionic组件ion-tabs选项卡切换效果实例
2016/08/27 Javascript
Bootstrap树形菜单插件TreeView.js使用方法详解
2016/11/01 Javascript
基于HTML5+JS实现本地图片裁剪并上传功能
2017/03/24 Javascript
js字符限制(字符截取) 一个中文汉字算两个字符
2017/09/12 Javascript
Vue CLI3 如何支持less的方法示例
2018/08/29 Javascript
Angular6 正则表达式允许输入部分中文字符
2018/09/10 Javascript
jQuery属性选择器用法实例分析
2019/06/28 jQuery
layUI实现列表查询功能
2019/07/27 Javascript
JS模拟浏览器实现全局搜索功能
2019/09/11 Javascript
微信小程序实现简单文字跑马灯
2020/05/26 Javascript
python中pandas.DataFrame排除特定行方法示例
2017/03/12 Python
Python 实现数据库(SQL)更新脚本的生成方法
2017/07/09 Python
python 动态加载的实现方法
2017/12/22 Python
python实现判断一个字符串是否是合法IP地址的示例
2018/06/04 Python
django自带serializers序列化返回指定字段的方法
2019/08/21 Python
Python标准库itertools的使用方法
2020/01/17 Python
TensorFlow 显存使用机制详解
2020/02/03 Python
TensorFlow加载模型时出错的解决方式
2020/02/06 Python
在Python中用GDAL实现矢量对栅格的切割实例
2020/03/11 Python
详解用selenium来下载小姐姐图片并保存
2021/01/26 Python
环境科学专业研究生求职信
2013/10/02 职场文书
奥巴马胜选演讲稿
2014/05/15 职场文书
市场营销策划方案
2014/06/11 职场文书
学校拾金不昧表扬信
2015/01/16 职场文书
商务司机岗位职责
2015/04/10 职场文书
Python+Tkinter打造签名设计工具
2022/04/01 Python