python实现拓扑排序的基本教程


Posted in Python onMarch 11, 2018

拓扑排序

几乎在所有的项目,甚至日常生活,待完成的不同任务之间通常都会存在着某些依赖关系,这些依赖关系会为它们的执行顺序行程表部分约束。对于这种依赖关系,很容易将其表示成一个有向无环图(Directed Acyclic Graph,DAG,无环是一个重要条件),并将寻找其中依赖顺序的过程称为拓扑排序(topological sorting)。

拓扑排序要满足如下两个条件

  • 每个顶点出现且只出现一次。
  • 若A在序列中排在B的前面,则在图中不存在从B到A的路径。

拓扑排序算法

任何无回路的顶点活动网(AOV网)N都可以做出拓扑序列:

  • 从N中选出一个入度为0的顶点作为序列的下一顶点。
  • 从N网中删除所选顶点及其所有的出边。
  • 反复执行上面两个步骤,知道已经选出了图中的所有顶点,或者再也找不到入度为非0的顶点时算法结束。

如果剩下入度非0的顶点,就说明N中有回路,不存在拓扑排序。

存在回路,意味着某些活动的开始要以其自己的完成作为先决条件,这种现象成为活动之间的死锁。一种常见的顶点活动网实例是大学课程的先修课程。课程知识有前后练习,一门课可能以其他课程的知识为基础,学生想选修这门课程时,要看是否已修过所有先修课程。如果存在一个回路的话,那就意味着进入了一个循环,那么该同学就毕不了业了。

因此可以说拓扑排序算法是为了做出满足制约关系的工作安排。

下面我们操作一个实例,如下图是一个有向无环图:

python实现拓扑排序的基本教程

用字典表示:G = { 'a':'bce', 'b':'d','c':'d','d':'','e':'cd'}

代码实现:

def toposort(graph):
 in_degrees = dict((u,0) for u in graph) #初始化所有顶点入度为0
 vertex_num = len(in_degrees)
 for u in graph:
  for v in graph[u]:
   in_degrees[v] += 1  #计算每个顶点的入度
 Q = [u for u in in_degrees if in_degrees[u] == 0] # 筛选入度为0的顶点
 Seq = []
 while Q:
  u = Q.pop()  #默认从最后一个删除
  Seq.append(u)
  for v in graph[u]:
   in_degrees[v] -= 1  #移除其所有指向
   if in_degrees[v] == 0:
    Q.append(v)   #再次筛选入度为0的顶点
 if len(Seq) == vertex_num:  #如果循环结束后存在非0入度的顶点说明图中有环,不存在拓扑排序
  return Seq
 else:
  print("there's a circle.")
G = {
 'a':'bce',
 'b':'d',
 'c':'d',
 'd':'',
 'e':'cd'
}
print(toposort(G))

输出结果:

['a', 'e', 'c', 'b', 'd']

图中有环的情况:

python实现拓扑排序的基本教程

G = { 'a':'bce', 'b':'d','c':'d','d':'e','e':'cd'}

输出结果:

there's a circle.
None

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python之eval()函数危险性浅析
Jul 03 Python
python从入门到精通(DAY 2)
Dec 20 Python
Tensorflow之构建自己的图片数据集TFrecords的方法
Feb 07 Python
Python爬虫抓取代理IP并检验可用性的实例
May 07 Python
pycharm 将django中多个app放到同个文件夹apps的处理方法
May 30 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
Aug 22 Python
selenium+python环境配置教程详解
May 28 Python
ipad上运行python的方法步骤
Oct 12 Python
python中使用you-get库批量在线下载bilibili视频的教程
Mar 10 Python
解决keras backend 越跑越慢问题
Jun 18 Python
Python函数递归调用实现原理实例解析
Aug 11 Python
Python用dilb提取照片上人脸的示例
Oct 26 Python
Python实现图片尺寸缩放脚本
Mar 10 #Python
TensorFlow平台下Python实现神经网络
Mar 10 #Python
python构建深度神经网络(续)
Mar 10 #Python
python构建深度神经网络(DNN)
Mar 10 #Python
Python使用numpy实现BP神经网络
Mar 10 #Python
python实现日常记账本小程序
Mar 10 #Python
python实现简单神经网络算法
Mar 10 #Python
You might like
解析zend Framework如何自动加载类
2013/06/28 PHP
PHP strip_tags()去除HTML、XML以及PHP的标签介绍
2014/02/18 PHP
php 数组处理函数extract详解及实例代码
2016/11/23 PHP
PHP命名空间定义与用法实例分析
2019/08/14 PHP
PHP中mysqli_get_server_version()的实例用法
2020/02/03 PHP
jQuery的写法不同导致的兼容性问题的解决方法
2010/07/29 Javascript
用javascript添加控件自定义属性解析
2013/11/25 Javascript
JS点击链接后慢慢展开隐藏着图片的方法
2015/02/17 Javascript
纯js模拟div层弹性运动的方法
2015/07/27 Javascript
AngularJS前端页面操作之用户修改密码功能示例
2017/03/27 Javascript
JavaScript装饰器函数(Decorator)实例详解
2017/03/30 Javascript
jQuery复合事件结合toggle()方法的用法示例
2017/06/10 jQuery
vue-ajax小封装实例
2017/09/18 Javascript
JS判断用户用的哪个浏览器实例详解
2018/10/09 Javascript
微信小程序实现保存图片到相册功能
2018/11/30 Javascript
JS数组索引检测中的数据类型问题详解
2021/01/11 Javascript
linux系统使用python获取cpu信息脚本分享
2014/01/15 Python
python缩进区别分析
2014/02/15 Python
Python中list列表的一些进阶使用方法介绍
2015/08/15 Python
基于python requests库中的代理实例讲解
2018/05/07 Python
详解pandas.DataFrame中删除包涵特定字符串所在的行
2019/04/04 Python
django-rest-swagger的优化使用方法
2019/08/29 Python
为什么称python为胶水语言
2020/06/16 Python
H5新属性audio音频和video视频的控制详解(推荐)
2016/12/09 HTML / CSS
全球速卖通法国在线交易平台:AliExpress法国
2017/07/07 全球购物
Madewell澳大利亚官方网站:美国休闲服饰品牌
2019/07/18 全球购物
个人评价范文分享
2014/01/11 职场文书
学校万圣节活动方案
2014/02/13 职场文书
献爱心活动总结
2014/05/07 职场文书
勤奋学习演讲稿
2014/05/10 职场文书
关于运动会广播稿50字
2014/10/18 职场文书
亲属关系公证书样本
2015/01/23 职场文书
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
2021/04/13 Python
浅谈MySQL next-key lock 加锁范围
2021/06/07 MySQL
Spring Data JPA的Audit功能审计数据库的变更
2021/06/26 Java/Android
基于python定位棋子位置及识别棋子颜色
2021/07/26 Python