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中请使用isinstance()判断变量类型
Aug 25 Python
python开启多个子进程并行运行的方法
Apr 18 Python
介绍Python的Urllib库的一些高级用法
Apr 30 Python
Python基于pygame实现图片代替鼠标移动效果
Nov 11 Python
使用Python实现一个栈判断括号是否平衡
Aug 23 Python
python实现祝福弹窗效果
Apr 07 Python
python命令行工具Click快速掌握
Jul 04 Python
python 同时读取多个文件的例子
Jul 16 Python
基于Python2、Python3中reload()的不同用法介绍
Aug 12 Python
解决python中的幂函数、指数函数问题
Nov 25 Python
Python 窗体(tkinter)下拉列表框(Combobox)实例
Mar 04 Python
基于python判断字符串括号是否闭合{}[]()
Sep 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
法兰绒滤网冲泡
2021/03/03 冲泡冲煮
php自动更新版权信息显示的方法
2015/06/19 PHP
PHP从零开始打造自己的MVC框架之类的自动加载实现方法详解
2019/06/03 PHP
Laravel 创建指定表 migrate的例子
2019/10/09 PHP
jquery获取下拉列表的值为null的解决方法
2011/03/18 Javascript
js中 关于undefined和null的区别介绍
2013/04/16 Javascript
js操作label给label赋值及取label的值示例
2013/11/07 Javascript
jquery实现图片滚动效果的简单实例
2013/11/23 Javascript
JavaScript 实现简单的倒计时弹窗DEMO附图
2014/03/05 Javascript
file控件选择上传文件确定后触发的js事件是哪个
2014/03/17 Javascript
jQuery使用after()方法在元素后面添加多项内容的方法
2015/03/26 Javascript
JavaScript取得WEB安全颜色列表的方法
2015/07/14 Javascript
通过XMLHttpRequest和jQuery实现ajax的几种方式
2015/08/28 Javascript
详解iframe与frame的区别
2016/01/13 Javascript
原生和jQuery的ajax用法详解
2017/01/23 Javascript
@ResponseBody 和 @RequestBody 注解的区别
2017/03/08 Javascript
MUI 上拉刷新/下拉加载功能实例代码
2017/04/13 Javascript
AngularJs点击状态值改变背景色的实例
2017/12/18 Javascript
vue中keep-alive组件的入门使用教程
2019/06/06 Javascript
vue遍历对象中的数组取值示例
2019/11/07 Javascript
5分钟快速看懂ES6中的反射与代理
2019/12/19 Javascript
JS数组方法reverse()用法实例分析
2020/01/18 Javascript
python实现DNS正向查询、反向查询的例子
2014/04/25 Python
Python加载带有注释的Json文件实例
2018/05/23 Python
python实现彩票系统
2020/06/28 Python
详解Python3 对象组合zip()和回退方式*zip
2019/05/15 Python
Jupyter安装链接aconda实现过程图解
2020/11/02 Python
html5调用摄像头功能的实现代码
2018/05/07 HTML / CSS
印尼综合在线预订网站:Tiket.com(机票、酒店、火车、租车和娱乐)
2018/10/11 全球购物
世界上最大的皮肤科医生拥有和经营的美容网站:LovelySkin
2021/01/03 全球购物
拉歌口号大全
2014/06/13 职场文书
环境保护与污染治理求职信
2014/07/16 职场文书
我的梦想演讲稿1000字
2014/08/21 职场文书
聚会通知怎么写
2015/04/23 职场文书
个人落户申请书怎么写?
2019/06/28 职场文书
Python控制台输出俄罗斯方块的方法实例
2021/04/17 Python