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 Queue模块详解
Nov 30 Python
Python字符串格式化%s%d%f详解
Feb 02 Python
Python设计模式之原型模式实例详解
Jan 18 Python
python实现抽奖小程序
Apr 15 Python
简单了解Python matplotlib线的属性
Jun 29 Python
python中使用paramiko模块并实现远程连接服务器执行上传下载功能
Feb 29 Python
django实现日志按日期分割
May 21 Python
Python3创建Django项目的几种方法(3种)
Jun 03 Python
python tqdm实现进度条的示例代码
Nov 10 Python
Python OpenCV 图像平移的实现示例
Jun 04 Python
如何使用Python提取Chrome浏览器保存的密码
Jun 09 Python
python turtle绘图
May 04 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
杏林同学录(九)
2006/10/09 PHP
php array_unique之后json_encode需要注意
2011/01/02 PHP
PHP中文处理 中文字符串截取(mb_substr)和获取中文字符串字数
2011/11/10 PHP
使用 laravel sms 构建短信验证码发送校验功能
2017/11/06 PHP
js获取图片大小的函数代码
2011/09/20 Javascript
调试Node.JS的辅助工具(NodeWatcher)
2012/01/04 Javascript
利用jQuery的deferred对象实现异步按顺序加载JS文件
2013/03/17 Javascript
js验证真实姓名与身份证号是否匹配
2015/10/13 Javascript
JavaScript中将数组进行合并的基本方法讲解
2016/03/07 Javascript
js获取隐藏元素宽高的实现方法
2016/05/19 Javascript
jquery显示隐藏元素的实现代码
2016/05/19 Javascript
Bootstrap栅格系统使用方法及页面调整变形的解决方法
2017/03/10 Javascript
React利用插件和不用插件实现双向绑定的方法详解
2017/07/03 Javascript
json2.js 入门教程之使用方法与实例分析
2017/09/14 Javascript
ES6学习教程之对象字面量详解
2017/10/09 Javascript
vue与TypeScript集成配置最简教程(推荐)
2017/10/17 Javascript
JavaScript原生实现观察者模式的示例
2017/12/15 Javascript
Vue组件之极简的地址选择器的实现
2018/05/31 Javascript
微信小程序中使用echarts的实现方法
2019/04/24 Javascript
微信小程序实现下拉刷新动画
2019/06/21 Javascript
windows下wxPython开发环境安装与配置方法
2014/06/28 Python
给Python的Django框架下搭建的BLOG添加RSS功能的教程
2015/04/08 Python
在Python中使用Neo4j数据库的教程
2015/04/16 Python
Python中enumerate函数代码解析
2017/10/31 Python
python如何统计序列中元素
2020/07/31 Python
Python3批量移动指定文件到指定文件夹方法示例
2019/09/02 Python
Python Tkinter Entry和Text的添加与使用详解
2020/03/04 Python
利用CSS3的线性渐变linear-gradient制作边框的示例
2016/06/02 HTML / CSS
HTML5实现移动端复制功能
2018/04/19 HTML / CSS
英国时尚饰品和发饰购物网站:Claire’s
2017/07/04 全球购物
在weblogic中发布ejb需涉及到哪些配置文件
2012/01/17 面试题
商务日语专业自荐信
2014/04/17 职场文书
工地标语大全
2014/06/18 职场文书
原料仓管员岗位职责
2015/04/01 职场文书
用Python简陋模拟n阶魔方
2021/04/17 Python
一篇文章带你深入了解Mysql触发器
2021/08/02 MySQL