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搭建Django应用程序步骤及版本冲突问题解决
Nov 19 Python
Python使用multiprocessing实现一个最简单的分布式作业调度系统
Mar 14 Python
Python基于numpy灵活定义神经网络结构的方法
Aug 19 Python
Python2.7+pytesser实现简单验证码的识别方法
Dec 29 Python
wx.CheckBox创建复选框控件并响应鼠标点击事件
Apr 25 Python
详解PyCharm安装MicroPython插件的教程
Jun 24 Python
Python制作微信好友背景墙教程(附完整代码)
Jul 17 Python
python基础教程之while循环
Aug 14 Python
python 如何将数据写入本地txt文本文件的实现方法
Sep 11 Python
python 图像的离散傅立叶变换实例
Jan 02 Python
一文搞懂如何实现Go 超时控制
Mar 30 Python
用Python编写简单的gRPC服务的详细过程
Jul 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
BBS(php & mysql)完整版(三)
2006/10/09 PHP
php中根据某年第几天计算出日期年月日的代码
2011/02/24 PHP
php实现事件监听与触发的方法
2014/11/21 PHP
图文介绍PHP添加Redis模块及连接
2015/07/28 PHP
在chrome中window.onload事件的一些问题
2010/03/01 Javascript
一个简单的JS鼠标悬停特效具体方法
2013/06/17 Javascript
jquery 列表双向选择器之改进版
2013/08/09 Javascript
jQuery添加/改变/移除CSS类及判断是否已经存在CSS
2014/08/20 Javascript
Javascript字符串浏览器兼容问题分析
2014/12/01 Javascript
JavaScript使用二分查找算法在数组中查找数据的方法
2015/04/07 Javascript
js实现简单锁屏功能实例
2015/05/27 Javascript
Bootstrap开发实战之第一次接触Bootstrap
2016/06/02 Javascript
jQuery实现获取table中鼠标click点击位置行号与列号的方法
2017/10/09 jQuery
vuex实现登录状态的存储,未登录状态不允许浏览的方法
2018/03/09 Javascript
微信小程序input框中加入小图标的实现方法
2018/06/19 Javascript
Angularjs 根据一个select的值去设置另一个select的值方法
2018/08/13 Javascript
VUE2.0+ElementUI2.0表格el-table实现表头扩展el-tooltip
2018/11/30 Javascript
解决Vue+Electron下Vuex的Dispatch没有效果问题
2019/05/20 Javascript
[37:50]VP vs TNC Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
在Python中处理字符串之isdigit()方法的使用
2015/05/18 Python
在Python中操作字符串之startswith()方法的使用
2015/05/20 Python
在Django中创建URLconf相关的通用视图的方法
2015/07/20 Python
python实现汉诺塔方法汇总
2016/07/25 Python
Django 多环境配置详解
2019/05/14 Python
python获取磁盘号下盘符步骤详解
2019/06/19 Python
Django 开发调试工具 Django-debug-toolbar使用详解
2019/07/23 Python
Python 下载及安装详细步骤
2019/11/04 Python
python 实现从高分辨图像上抠取图像块
2020/01/02 Python
Python selenium页面加载慢超时的解决方案
2020/03/18 Python
天巡全球:Skyscanner Global
2017/06/20 全球购物
女性时尚在线:IVRose
2019/02/23 全球购物
个人房屋转让协议书范本
2014/10/26 职场文书
中秋节晚会开场白
2015/05/29 职场文书
实习单位鉴定意见
2015/06/04 职场文书
讲座新闻稿
2015/07/18 职场文书
Vue3中的Refs和Ref详情
2021/11/11 Vue.js