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中的__slots__缓存资源以节省内存开销的方法
Apr 02 Python
Python类的动态修改的实例方法
Mar 24 Python
python爬虫实战之爬取京东商城实例教程
Apr 24 Python
TensorFlow saver指定变量的存取
Mar 10 Python
java中两个byte数组实现合并的示例
May 09 Python
pyinstaller打包多个py文件和去除cmd黑框的方法
Jun 21 Python
用python求一个数组的和与平均值的实现方法
Jun 29 Python
python 实现兔子生兔子示例
Nov 21 Python
基于python实现数组格式参数加密计算
Apr 21 Python
基于python和flask实现http接口过程解析
Jun 15 Python
python获取天气接口给指定微信好友发天气预报
Dec 28 Python
python opencv检测直线 cv2.HoughLinesP的实现
Jun 18 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中Date()时间日期函数的使用方法小结
2011/04/20 PHP
PHP实现支持SSL连接的SMTP邮件发送类
2015/03/05 PHP
PHP面向对象程序设计实例分析
2016/01/26 PHP
PHP如何实现跨域
2016/05/30 PHP
Django中通过定时任务触发页面静态化的处理方式
2018/08/29 PHP
广告切换效果(缓动切换)
2009/05/27 Javascript
php析构函数的具体用法小结
2014/03/11 Javascript
jquery实现人性化的有选择性禁用鼠标右键
2014/06/30 Javascript
node.js中的buffer.fill方法使用说明
2014/12/14 Javascript
javascript实现回车键提交表单方法总结
2015/01/10 Javascript
jquery处理页面弹出层查询数据等待操作实例
2015/03/25 Javascript
js检测iframe是否加载完成的方法
2015/11/26 Javascript
浅谈JQuery+ajax+jsonp 跨域访问
2016/06/25 Javascript
聊一聊JS中的prototype
2016/09/29 Javascript
jQuery中checkbox反复调用attr('checked', true/false)只有第一次生效的解决方法
2016/11/16 Javascript
html+javascript+bootstrap实现层级多选框全层全选和多选功能
2017/03/09 Javascript
js简易版购物车功能
2017/06/17 Javascript
详解js的作用域、预解析机制
2018/02/05 Javascript
vue2.0使用v-for循环制作多级嵌套菜单栏
2018/06/25 Javascript
Vue基于vuex、axios拦截器实现loading效果及axios的安装配置
2019/04/26 Javascript
[04:19]完美世界携手游戏风云打造 卡尔工作室模型介绍篇
2013/04/24 DOTA
python高手之路python处理excel文件(方法汇总)
2016/01/07 Python
django2+uwsgi+nginx上线部署到服务器Ubuntu16.04
2018/06/26 Python
python定时复制远程文件夹中所有文件
2019/04/30 Python
python base64库给用户名或密码加密的流程
2020/01/02 Python
详解Html5 Canvas画线有毛边解决方法
2018/03/01 HTML / CSS
Space NK英国站:英国热门美妆网站
2017/12/11 全球购物
MONNIER Frères英国官网:源自巴黎女士奢侈品配饰电商平台
2018/12/06 全球购物
小学开学寄语
2014/01/19 职场文书
岗位标兵事迹材料
2014/05/17 职场文书
少先队辅导员事迹材料
2014/12/24 职场文书
复兴之路展览观后感
2015/06/02 职场文书
MySQL Router的安装部署
2021/04/24 MySQL
python实现简单石头剪刀布游戏
2021/10/24 Python
2022漫威和DC电影上映作品
2022/04/05 欧美动漫
方法汇总:Python 安装第三方库常用
2022/04/26 Python